'C언어'에 해당되는 글 26건

  1. 2020.12.30 C 문제 풀이
  2. 2020.12.16 조건과 분기
  3. 2020.12.14 이중 반복문
  4. 2020.12.14 반복문 for, while, do while
  5. 2020.12.14 ++
  6. 2020.12.14 Printf와 Scanf
  7. 2020.12.14 변수와 상수
  8. 2020.12.09 전처리기
  9. 2020.12.08 파일 입출력
  10. 2020.12.08 구조체

C 문제 풀이

C언어 2020. 12. 30. 19:40
/* 문제
문자열 변수에 "pPddeeeYedpfffdyY" 대입
문자열의 문자중 p,y(대소문자 구분없이)의 개수가 같은면 true를 리턴
두개의 값이 개수가 다르면 false를 리턴하시오.
단p,y의 개수가 둘다 0일 경우 true를 리턴하고 리턴된 값을 프린트 하시오. */

#include <iostream>
#include <stdbool.h> // bool 헤더

bool ppd(){ // bool 함수 생성, 변수 이름은 아무렇게나 해도 상관 없음
    char *a= "pPddeeeYedpfffdyY"; // *a에 값을 저장
    
    int p = 0; // p값 초기화
    int y = 0; // y값 초기화
    
    for (int i = 0; i <= strlen(a); i++) { // i 선언 및 초기화, a의 길이 만큼 i 반복
        if (a[i] == 'p' || a[i] == 'P') { // a에서 p와 P를 찾음
            p++;
        }
    
        else if (a[i] == 'y' || a[i] == 'Y') { // y와 Y 찾기
            y++;
        }
    }
    if (p == y) { // p와 y가 같다면
        return true; // true 값 반환
    }
    else if (p != y) { // p와 y가 다르다면
        return false; // false값 반환
    }
    return true;
}

int main(int argc, const char * argv[]) {
    bool b; // bool 함수 b로 선언
    b = ppd(); // bool 함수 불러오기
    printf("결과 값 : %d \n", b);
    return 0;
}

'C언어' 카테고리의 다른 글

조건과 분기  (0) 2020.12.16
이중 반복문  (0) 2020.12.14
반복문 for, while, do while  (0) 2020.12.14
++  (0) 2020.12.14
Printf와 Scanf  (0) 2020.12.14
Posted by khon98
,

조건과 분기

C언어 2020. 12. 16. 15:44

1. if, else

#include <stdio.h>

int main(void) {
    // 버스를 탄다고 가정. 학생과 일반인으로 구분(일반인은 20세)
    int age = 25;
    if (age >= 20) { // 조건, age가 20보다 크거나 같으면
        printf("일반인 입니다. \n");
    }
    else { // 그게 아니라면
        printf("학생입니다. \n");
    }
}

 

2. else if

- else if 구문은 계속 나올 수 있음, 조건에 맞도록 여러 번 선언할 수 있음

#include <stdio.h>

int main(void) {
    // 초등학생(8 ~ 13) 중학생(14 ~ 16) 고등학생(17 ~ 19)
    int age = 30;
    if (age >= 8 && age <=13) { // age 값이 8보다 크거나 같고 13보다 작거나 같으면(&&)
        printf("초등학생 입니다.\n");
    }
    else if (age >= 14 && age <= 16) { // age 값이 14보다 크거나 같고 16보다 작거나 같으면(&&)
        printf("중학생 입니다.\n");
    }
    else if (age >= 17 && age <= 19) { // age 값이 17보다 크거나 같고 19보다 작거나 같으면(&&)
        printf("고등학생 입니다.\n");
    }
    else { // 모든 조건에 만족하지 않는 경우 실행
        printf("학생이 아닙니다.\n");
    }
}

 

3. break, continue

break

#include <stdio.h>

int main(void) {
    // 1번부터 30번까지 있는 반에서 1번에서 5번까지 조별 발표를 합니다
    for (int i = 1; i <= 30; i++) {
        if (i >= 6) {
            printf("나머지 학생은 귀가.\n");
            break; // for문을 탈출
        }
        printf("%d번 학생이 조별 발표 준비.\n", i);
    }
}

 

continue

#include <stdio.h>

int main(void) {
    // 1번 부터 30번 까지 있는 반에서 7번은 결석
    // 7번을 제외한 6번부터 10번까지 조별 발표 준비
    for (int i = 1; i <= 30; i++) {
        if (i >= 6 && i <= 10) {
            if (i == 7) {
                printf("%d번 결석.\n", i);
                continue; // 조건에 맞으면 다음 코드는 넘어감
            }
            printf("%d번 학생은 발표 준비.\n", i);
        }
    }
}

 

4. &&(and), ||(or)

- &&(and) : 둘 다 맞아야 다음 코드 실행

#include <stdio.h>

int main(void) {
    // && ||
    int a = 10;
    int b = 10;
    int c = 13;
    int d = 13;
    if (a == b && c == d) {
        printf("a와 b가 같고, c와 d도 같음.\n");
    }
    else {
        printf("값이 다름.\n");
    }
}

 

- ||(or) : 앞에 조건과 뒤에 조건 둘 중에 하나라도 맞으면 코드 실행 

#include <stdio.h>

int main(void) {
    // && ||
    int a = 10;
    int b = 11;
    int c = 13;
    int d = 13;
    if (a == b || c == d) { // a와 b가 같거나 혹은 c와 d가 같으면 다음 코드 실행
        printf("a와 b 혹은 c와 d의 값이 같음.\n");
    }
    else {
        printf("값이 다름.\n");
    }
}

 

5. 랜덤

rand(): 랜덤 수를 뽑을 수 있음

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
    printf("난수 초기화 이전.\n");
    for (int i = 0; i < 10; i++) {
        printf("%d", rand() % 10); // 0 ~ 9 중에 랜덤으로 숫자를 뽑음
    }
    srand(time(NULL)); // 난수 초기화
    printf("\n\n난수 초기화 이후.\n");
    for (int i = 0; i < 10; i++) {
        printf("%d", rand() % 10); // 0 ~ 9 중에 랜덤으로 숫자를 뽑음
    }
    return 0;
}

 

* 가위 바위 보

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
    // 가위 0, 바위 1, 보 2
    srand(time(NULL));
    int i = rand() % 5; // 0 ~ 5 반환
    if(i == 0) { // i가 0일 경우
        printf("가위\n");
    }
    else if (i == 1) {
        printf("바위\n");
    }
    else if (i == 2) {
        printf("보\n");
    }
    else {
        printf("모름\n");
    }
    return 0;
}

 

6. switch case

switch - 값을 받아서 값이 해당하는 경우에 맞도록 출력

case - 문장이 끝날 때는 break를 입력해야 함

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
    // 가위 0, 바위 1, 보 2
    srand(time(NULL));
    int i = rand() % 5; // 0 ~ 5 반환
    switch (i) {
        case 0:printf("가위\n"); break;
        case 1:printf("바위\n"); break;
        case 2:printf("보\n"); break;
        default:printf("모름\n"); break;
    }
    return 0;
}

 

7. 프로젝트

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
    srand(time(NULL));
    int num = rand() % 100 + 1; // 1 ~ 100 반환
    printf("숫자 : %d\n", num);
    int answer = 0; // 정답
    int chance = 5; // 기회
    while (1) { // 기회 카운트, 1 : 참, 0 : 거짓
        printf("남은 기회 %d번\n", chance--);
        printf("숫자를 맞혀보세요 (1~100) : ");
        scanf("%d", &answer);
        
    if (answer > num) { // 입력한 숫자가 정답보다 큰 경우
        printf("DOWN\n\n");
    }
    else if (answer < num) { // 입력한 숫자가 정답보다 작은 경우
        printf("UP\n\n");
    }
    else if (answer == num) {
        printf("정답\n\n");
        break;
    }
    else { // 모든 경우가 아닌 경우
        printf("알 수 없는 오류 발생.\n\n");
    }
    if (chance == 0) {
        printf("모든 기회 소진\n\n");
        break;
        }
    }
    return 0;
}

'C언어' 카테고리의 다른 글

C 문제 풀이  (0) 2020.12.30
이중 반복문  (0) 2020.12.14
반복문 for, while, do while  (0) 2020.12.14
++  (0) 2020.12.14
Printf와 Scanf  (0) 2020.12.14
Posted by khon98
,

이중 반복문

C언어 2020. 12. 14. 23:01

int main(void){

    for (int i = 1; i <= 3; i++) { // 선언, 조건, 증감

        printf(" 첫 번째 반복문 : %d\n", i);

        for (int j = 1; j <= 5; j++) { // 선언, 조건, 증감

            printf("    두 번째 반복문 : %d\n", j);

        }

    }

}

 

i 출력 (i = 1), j 다섯 출력(j 1 ~ 5) 그 다음 i 출력(i = 2) j출력(1 ~5)

이런 식으로 조건에 맞을 때까지 반복

 

 

 

구구단

int main(void){

    for (int i = 2; i <= 9; i++) {

        printf("%d \n", i);

        for (int j = 1; j <= 9; j++) {

            printf("%d x %d = %d\n", i, j, i * j);

        }

    }

}

 

* 거꾸로 별

    *

   **

  ***

 ****

*****

#include <stdio.h>

int main(void) {
    for (int i = 0; i < 5; i++)
    {
        for (int j = i; j < 5 - 1; j++)
        {
            printf(" ");
        }
        for (int k = 0; k <= i; k++)
        {
            printf("*");
        }
        printf("\n");
    }
}

 

* 피라미드 쌓기

#include <stdio.h>

int main(void) {
    int floor;
    printf("몇 층으로 쌓을것인가?");
    scanf("%d", &floor);
    for (int i = 0; i < floor; i++) {
        for (int j = i; j <= floor - 1; j++) {
            printf(" ");
        }
        for (int k = 0; k < i * 2 + 1; k++) {
            printf("*");
        }
        printf("\n");
    }
}

'C언어' 카테고리의 다른 글

C 문제 풀이  (0) 2020.12.30
조건과 분기  (0) 2020.12.16
반복문 for, while, do while  (0) 2020.12.14
++  (0) 2020.12.14
Printf와 Scanf  (0) 2020.12.14
Posted by khon98
,

For(선언; 조건; 증감)

for (int i = 1; 1 < =10; i++);

I 1; 1부터 10까지; i 1더한다

 

int main(void){

    for (int i = 1; i <= 10; i++) {

        printf("Hello World %d\n", i);

    }

}

 

 

 

While

// while (조건)

int main(void){

    int i = 1; // 선언

    while (i <= 10) { // 조건

        printf("Hello World %d\n", i++); // 증감

    }

}

 

 

 

Do while

// do { } while (조건);

int main(void){

    int i = 1; // 선언

    do {

        printf("Hello Wordl %d\n", i++); // 조건

    } while (i <= 10); // 증감

}

 

'C언어' 카테고리의 다른 글

조건과 분기  (0) 2020.12.16
이중 반복문  (0) 2020.12.14
++  (0) 2020.12.14
Printf와 Scanf  (0) 2020.12.14
변수와 상수  (0) 2020.12.14
Posted by khon98
,

++

C언어 2020. 12. 14. 22:58

Int b = 20;

B = b + 1;

Printf("%d\n", ++b); // 21, 1 더한 b값을 출력

Printf("%d\n", b++); // 21, b 먼저 출력하고 다음으로 넘어갈때 1 더함

Printf("%d\n", b); // 22

'C언어' 카테고리의 다른 글

이중 반복문  (0) 2020.12.14
반복문 for, while, do while  (0) 2020.12.14
Printf와 Scanf  (0) 2020.12.14
변수와 상수  (0) 2020.12.14
전처리기  (0) 2020.12.09
Posted by khon98
,

Printf와 Scanf

C언어 2020. 12. 14. 22:56

Printf - 입력한 걸출력

Scanf - 컴퓨터에서 입력을 받음

 

#define _CRT_SECUCRE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <limits.h>

 

//이름 나이 몸무게 키 이력

int main(void) {

    

    char name[256];// 문자열의 크기

    printf("이름 ");

    scanf("%s", name, sizeof(name)); // 문자열은 s

 

    int age;

    printf("나이 ");

    scanf("%d", &age); // 정수는 d

    

    float weight;

    printf("몸무게 ");

    scanf("%f", &weight);

    

    double height;

    printf(" ");

    scanf("%lf", &height); // 더블 lf

    

    char what[256];

    printf("이력 ");

    scanf("%s", what, sizeof(what));

    

    // 출력

    printf("\n\n ------ 이력 ------\n\n");

    printf(" 이름 : %s\n", name);

    printf(" 나이 : %d\n", age);

    printf(" 몸무게 : %.2f\n", weight); // 소수점 둘째 자리까지 나타내기 위해 .2

    printf(" : %.2lf\n", height);

    printf(" 이력 : %s\n", what);

}

'C언어' 카테고리의 다른 글

반복문 for, while, do while  (0) 2020.12.14
++  (0) 2020.12.14
변수와 상수  (0) 2020.12.14
전처리기  (0) 2020.12.09
파일 입출력  (0) 2020.12.08
Posted by khon98
,

변수와 상수

C언어 2020. 12. 14. 22:53

변수 - 변하는

상수 - 변하지 않는

Int (4바이트)

 

실수형 변수 - 12.3처럼 소수 점이 붙은 변하는

Float - %.2f\n 소수점 둘째 자리 까지 출력 (4바이트)

Double - %.2lf\n 소수점 셋째 자리에서 반올림 출력 (8바이트)

 

상수

Int 앞에 const 붙임 변하지 않는 값을 의미

'C언어' 카테고리의 다른 글

++  (0) 2020.12.14
Printf와 Scanf  (0) 2020.12.14
전처리기  (0) 2020.12.09
파일 입출력  (0) 2020.12.08
구조체  (0) 2020.12.08
Posted by khon98
,

전처리기

C언어 2020. 12. 9. 17:03

전처리기

- 전처리기 구문은 다른 프로그램 영역과 독립적으로 처리됨

- 전처리기 구문은 소스코드 파일 단위로 효력이 존재함

 

파일 포함 전처리기

- #include는 전처리기에 가장 많이 사용되는 문법

- 특정한 파일을 라이브러리로서 포함시키기 위해 사용함

- #include 구문으로 가져올 수 있는 파일에는 제약이 없음

 

#include "파일 이름"

#include <파일 이름>

 

#include <파일 이름>

- 이와 같이 선언하면 시스템 디렉터리에서 파일을 검색함

- 운영체제마다 시스템 디렉터리가 존재하는 경로가 다를 수 있음

- 대표적으로 stdio.h와 같은 헤더 파일 등이 시스템 디렉터리에 존재함

 

#include "파일 이름"

- 이와 같이 선언하면 현재 폴더에서 파일을 먼저 검색함

- 만약 현재 폴더에 파일이 없다면 시스템 디렉터리에서 파일을 검색함

 

헤더 파일 만들기

1.

Visual Studio

소스파일에서 새 항목을 추가 > 헤더 파일 선택 후 추가

 

Xcode

상단 메뉴에 File > new > File... > Header File > next > create

 

2.

- #include를 이용해 가져오는 파일은 말 그대로 파일의 소스코드 자체를 다 가져오는 것

- 따라서 의도치 않게 한 번 참조한 헤더 파일을 여러 번 참조하지 않도록 유의해야 함

 

int add(int a, int b) {

   return a + b;

}

 

내가 정의한 헤더 파일 사용하기

- #include를 이용해 가져오는 파일은 말 그대로 파일의 소스코드 자체를 다 가져오는 것

- 따라서 의도치 않게 한 번 참조한 헤더 파일을 여러 번 참조하지 않도록 유의

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "Header.h"

int main(void) {
    printf("%d\n", add(3, 7)); // 만든 헤더 파일 불러오기
    system("pause");
    return 0;
}

 

매크로 전처리기

- 프로그램 내에서 사용되는 상수나 함수를 매크로 형태로 저장하기 위해 사용

- #define 문법을 사용해 정의할 수 있음

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define PI 3.1415926535

int main(void) {
    int r = 10;
    printf("원의 둘레: %.2f\n", 2 * PI * r);
    system("pause");
    return 0;
}

 

인자를 가지는 매크로 전처리기

- #define 문법에는 인자가 포함될 수 있음

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define POW(x) (x * x)

int main(void) {
    int x = 10;
    printf("x의 제곱: %d\n", POW(x));
    system("pause");
    return 0;
}

 

* #define 문법은 소스코드의 양을 획기적으로 줄이는 데 도움을 줌

#include <stdio.h>
#include <stdlib.h>
#define ll long long
#define ld long double

int main(void) {
    ll a = 987654321000;
    ld b = 100.5054;
    printf("%.1f\n", a * b);
    system("pause");
    return 0;
}

 

조건부 컴파일

- 조건부 컴파일은 컴파일이 이루어지는 영역을 지정하는 기법

- 일반적으로 디버깅과 소스코드 이식을 목적으로 하여 작성됨

- C언어로 시스템 프로그램을 작성할 때에는 운영체제에 따라서 소스코드가 달라질 수 있음

- 이때 운영체제에 따라서 컴파일이 수행되는 소스코드를 다르게 할 수 있음

 - #ifndef ~ #endif 문법은 대표적인 조건부 컴파일 문법

- 흔히 헤더 파일의 내용이 중복되어 사용되지 않도록 하기 위해 적용

#ifndef _Header_h_
#define _Header_h_

int add(int a, int b) {
    return a + b;
}

#endif

 

파일 분할 컴파일

- 일반적으로 자신이 직접 라이브러리를 만들 때에는 C언어 파일과, 헤더 파일을 모두 작성해야 함

 

* main.c

#include <stdio.h>
#include <stdlib.h>
#include "Header.h"

int main(void) {
    printf("%d\n", add(3, 7)); 
    system("pause");
    return 0;
}

 

* Header.c

#include "Header.h"

int add(int a, int b) {
    return a + b;
}

 

* Header.h

#ifndef _Header_h_
#define _Header_h_

int add(int a, int b);

#endif

 

 

- 전처리기의 사용은 필수는 아니지만 때에 따라서 소스코드를 획기적으로 줄일 수 있음

'C언어' 카테고리의 다른 글

Printf와 Scanf  (0) 2020.12.14
변수와 상수  (0) 2020.12.14
파일 입출력  (0) 2020.12.08
구조체  (0) 2020.12.08
함수 포인터  (0) 2020.12.08
Posted by khon98
,

파일 입출력

C언어 2020. 12. 8. 23:54

파일 입출력의 필요성

- 프로그램이 꺼진 이후에도 데이터를 저장하기 위해서는 파일 입출력이 필요

- 어떠한 데이터를 프로그램 안에서만 사용되는 게 아니라 프로그램 외부로 일시적으로 저장을 시켜놨다가 다시 프로그램을 실행하거나 혹은 어떠한 데이터를 불러오도록 해서 이전의 상태를 그대로 프로그램 내부로 가져올 수 있게 하기 위해 필요

- 파일이 실질적으로 저장되는 위치는 cpu, ssd, ram가 있음

- ram, cpu 같은 경우는 휘발성 있게 저장한다는 특징이 있음, 컴퓨터를 껐다 켜면 데이터가 사라짐

- 일반적으로 바탕화면에 있는 일반적인 파일들은 ssd 혹은 하드 디스크와 같은 보조 기억 장치에 저장이 되고, 그것을 실행하면 그 프로그램이 프로세스로 변환되면서 ram에 들어가서 구동을 하게 되는 거고, cpu가 ram에서 코드를 읽어서 실행을 시켜줌

 

파일을 열고 닫기

1.

- 파일 입출력 변수는 file형식의 포인터 변수로 선언

- 파일을 열 때는 fopen( ) 함수를 이용

- 파일을 닫을 때는 fclose( ) 함수를 이용

 

FILE *fp;

fp = fopen(파일 경로, 접근 방식);

// 파일 관련 처리

fclose(fp);

 

2.

- 파일 열기 함수인 fopen( ) 함수에는 파일 경로와 접근 방식을 설정할 수 있음

- 기본 경로는 현재 프로그램의 경로

- 가장 많이 사용되는 접근 방식은 다음과 같음

 

r (read) - 파일에 접근하여 데이터를 읽음

w (write) - 파일에 접근하여 데이터를 기록(파일이 이미 존재하면 덮어쓰기)

a - 파일에 접근하여 데이터를 뒤에서부터 기록

 

파일 입출력 함수

- 기본적인 입출력을 위해서 printf()와 scanf() 함수를 사용하곤 했음

- 파일 입출력에서는 그 대신에 fprintf()와 fscanf()가 사용됨

 

fprintf(파일 포인터, 서식, 형식 지정자);

fscanf(파일 포인터, 서식, 형식 지정자);

 

파일 입출력의 과정

- 파일 입출력은 열고, 읽고/쓰고, 닫기의 과정을 철저히 따라야 함

- 파일을 열 때는 파일 포인터가 사용되며, 이는 동적으로 할당된 것

- 따라서 파일 처리 이후에 파일을 닫아주지 않으면 메모리 누수가 발생

 

파일 열기 > 파일 읽기/쓰기 > 파일 닫기

 

* 현재 프로그램의 경로에서 특정한 파일을 쓰기 모드로 생성하여 문자열을 기록할 수 있음

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void){
    char s[20] = "Hello World";
    FILE *fp;
    fp = fopen("temp.txt", "w");
    fprintf(fp, "%s\n", s); // 일반적인 printf와 동일하다고 볼 수 있음
    fclose(fp);
    return 0;
}

 

Visual Studio에서 기본 실행 파일 경로 확인하는 방법

1. 프로젝트 이름에 마우스 우 클릭 > 파일 탐색기에서 폴더 열기

 

* 학생 정보 시스템 만들기

- 학생들의 이름과 성정 파일 만들기

1. 학생 구조체 만들기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct { // 학생 구조체
    char name[20];
    int score;
} Student;

 

2. 학생 데이터를 읽어 그대로 출력하기

int main(void) {
    int n, sum = 0; // 학생의 명수를 의미하는 n을 만들고, 학생의 성적을 더한 변수 sum 생성
    FILE *fp;
    fp = fopen("input.txt", "r"); // 읽기 모드로 파일을 엶
    fscanf(fp, "%d", &n); // 특정한 파일로 부터 하나의 정수형 변수를 읽을수 있도록 함
    // 여려 명의 학생들의 정보가 담길수 있기 때문에 동적 메모리 할당을 이용해서 총 n명의 학생에 대한 정보가
    // 담길수 있는 공간을 메모리 주소상에 할당을 해줌
    Student *students = (Student*)malloc(sizeof(Student) * n);
    for (int i = 0; i < n; i++) {
        // 학생들에 대한 이름과 점수 정보를 파일로 부터 입력을 받아서 입력을 해줌
        fscanf(fp, "%s %d", &((students + i)->name), &((students + i)->score));
        printf("이름: %s", "성적: %d\n", (students + i)->name, (students + i)->score);
    }
    system("pause");
    return 0;
}

 

3. 성적 평균을 구하고 메모리 할당 해제하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct { // 학생 구조체
    char name[20];
    int score;
} Student;

int main(void) {
    int n, sum = 0; // 학생의 명수를 의미하는 n을 만들고, 학생의 성적을 더한 변수 sum 생성
    FILE *fp;
    fp = fopen("input.txt", "r"); // 읽기 모드로 파일을 엶
    fscanf(fp, "%d", &n); // 특정한 파일로 부터 하나의 정수형 변수를 읽을수 있도록 함
    // 여려 명의 학생들의 정보가 담길수 있기 때문에 동적 메모리 할당을 이용해서 총 n명의 학생에 대한 정보가 담길수 있는 공간을 메모리 주소상에 할당을 해줌
    Student *students = (Student*)malloc(sizeof(Student) * n);
    for (int i = 0; i < n; i++) {
        // 학생들에 대한 이름과 점수 정보를 파일로 부터 입력을 받아서 입력을 해줌
        fscanf(fp, "%s %d", &((students + i)->name), &((students + i)->score));
    }
    for (int i = 0; i < n; i++) {
        sum += (students + i)->score;
    }
    free(students); // 메모리 주소 공간을 할당 해제
    fclose(fp); // 열려있는 파일 닫기
    printf("점수 평균: %.2f\n", (double) sum / n); // 소수점 자리 둘째까지 출력, 합계를 실수형으로 형 변환을 한 다음 전체 학생의 수로 나누어서 평균 값을 출력
    system("pause");
    return 0;
}

 

 

- 파일 입출력을 이용해 데이터를 파일로부터 가져오거나 데이터를 파일로 내보낼 수 있음

- 파일 입출력이 끝난 이후에는 반드시 파일 객체를 메모리에서 할당 해제해주어야 함

'C언어' 카테고리의 다른 글

변수와 상수  (0) 2020.12.14
전처리기  (0) 2020.12.09
구조체  (0) 2020.12.08
함수 포인터  (0) 2020.12.08
동적 메모리 할당  (0) 2020.12.08
Posted by khon98
,

구조체

C언어 2020. 12. 8. 23:29

구조체

- 여러 개의 변수를 묶어 하나의 객체를 표현하고자 할 때 구조체를 사용할 수 있음(배열과는 성질이 다름)

- 캐릭터, 몬스터, 학생, 좌표 등 다양한 객체를 모두 프로그래밍 언어를 이용해 표현할 수 있음

 

구조체의 정의와 선언

struct 구조체명 {

   자료형 1 변수명 1;

   자료형 2 변수명 2;

   ...

};

 

* 한 명의 학생에 대한 정보를 담고 있는 구조체

#include <stdio.h>

struct Student {
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
};

 

구조체의 변수의 선언과 접근

- 기본적으로 구조체의 변수에 접근할 때는 온점(.)을 사용함

int main(void){
    struct Student s; // 구조체 변수 선언
    strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
    strcpy(s.name, "khon");
    s.grade = 4;
    strcpy(s.major, "컴퓨터교육");
}

 

*학생 구조체를 만들어서 활용하기

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
};

int main(void){
    struct Student s; // 구조체 변수 선언
    strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
    strcpy(s.name, "khon");
    s.grade = 4;
    strcpy(s.major, "컴퓨터교육");
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

구조체의 정의와 선언

- 하나의 구조체 변수만 사용하는 경우 정의와 동시에 선언을 할 수도 있음

- 이 경우 변수는 전역 변수로 사용됨

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} s; // 전역 변수

int main(void){
    strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
    strcpy(s.name, "khon");
    s.grade = 4;
    strcpy(s.major, "컴퓨터교육");
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

구조체의 초기화

1.

- 구조체의 변수를 한 번에 초기화하기 위해서는 중괄호에 차례대로 변수의 값을 넣음

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} s; // 전역 변수

int main(void){
    struct Student s = { "20201208", "khon", 4, "컴퓨터교육"};
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

2.

- 위쪽에서 구조체를 정의하고 선언하면서 그와 동시에 초기화까지 할 수 있음

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} s = { "20201208", "khon", 4, "컴퓨터교육"};

int main(void){
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

더 짧게 구조체 정의하기

1.

- typedef 키워드를 이용하면 임의의 자료형을 만들 수 있으므로 선언이 더 짧아짐

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

typedef struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} Student;

int main(void){
    Student s = {"20201208", "khon", 4, "컴퓨터교육"};
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

2.

- 최근에는 익명 구조체의 개념이 등장하여 구조체 이름 부분을 비워놔도 됨

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

typedef struct { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} Student;

int main(void){
    Student s = {"20201208", "khon", 4, "컴퓨터교육"};
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

구조체 포인터 변수에 접근하기

- 구조체가 포인터 변수로 사용되는 경우 내부 변수에 접근할 때 화살표(->) 를 사용함

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

typedef struct { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} Student;

int main(void){
    Student *s = malloc(sizeof(Student));
    strcpy(s -> studentId, "20201208"); // 구조체 포인터 변수에 접근
    strcpy(s -> name, "khon");
    s -> grade = 4;
    strcpy(s -> major, "컴퓨터교육");
    printf("학번: %s\n", s -> studentId); // 구조체 내용 출력
    printf("이름: %s\n", s -> name);
    printf("학년: %d\n", s -> grade);
    printf("학과: %s\n", s -> major);
    system("pause");
    return 0;
}

 

 

- 구조체는 현실 세계의 객체를 소스코드 상에서 매우 쉽게 표현할 수 있도록 해줌

'C언어' 카테고리의 다른 글

전처리기  (0) 2020.12.09
파일 입출력  (0) 2020.12.08
함수 포인터  (0) 2020.12.08
동적 메모리 할당  (0) 2020.12.08
다차원 배열과 포인터 배열  (0) 2020.12.07
Posted by khon98
,