C언어에서는 4가지가 제일 중요하다.
32개의 keyword
40여 개의 연산자
10개의 구두점
표준 라이브러리 함수가 여기에 속한다.
연산자의 우선순위와 결합성 중에 대부분은 사칙연산처럼 왼쪽에서 오른쪽이지만, 2와 13,14같은 연산자는 반대방향이다.
C언어의 문장을 구분하는 것이 구두점이다.
구두점에는 [] 대괄호 {} 중괄호 () 소괄호 * 별표
, 쉼표 ; 세미콜론 = 변수 및 배열초기화 : 콜론 ... 생략부호 # 전처리기 가 있다.
prototype(프로토타입), argument(아규먼트), parameter(파라미터)가 함수에 속한다.
C언어의 기본 틀.
#include <stdio.h>
int main(void)
{
int x = 10;
printf("%d", x);
return 0; //C99부터는main함수의 경우 이 문장은 생략해도 자동적으로 있는 것으로 처리
}
실습과제의 모습.
식별자는 변수 및 함수에 부여하는 이름
리터럴은 값 그 자체를 의미
자료형은 처리,저장하고자 하는 자료의 형태
변수는 자료를 저장하기 위한 기억장소의 이름
두 변수의 합 출력.
두 변수의 합과 평균 출력.
자동 형 변환을 쓰여진 문법이다. 실수와 정수, 정수와 실수를 더하거나 곱할때 소수점이 생기게 한다.
두 수를 입력받아 합과 평균 출력.
결괏값은 이렇게 출력된다.
두 점수를 입력 받아 합과 평균 출력.
결괏값은 이렇게 나온다.
2명의 성적 총점,평균,과목 별 총점 평균 / 3명 이상이라면?
배열을 모른다면 100명의 데이터를 입력할때 100번을 반복해야 할지도 모른다.
배열을 안다면 의미없는 반복행위를 줄여 시간을 아낄 수 있다.
배열은 방의 갯수라고 생각하면 된다. 보통 변수 뒤에 대괄호 [] 안에 실수형으로 쓴다.
5명이라면 배열로 5칸을 만들고 각각 지정을 해준다면 문제를 쉽게 해결 할 수 있다.
결괏값은 이렇게 나온다. 각 학생마다 학번,국영수,총점,평균을 구해준다.
ctrl + h를 쓴다면 코드 전체의 한 단어,수를 한번에 바꿀 수 있는 창이 뜬다.
위 화면은 배열[5]를 전부 3으로 바꾼 모습.
배열은 같은 데이터들만 묶지만, 구조체들은 다른 변수,배열들을 한번에 묶는 중요한 개념이다.
구조체라는 것은 내가 원하는 자료형을 만드는것 그 자체라고 볼 수 있다.
객체지향으로는 class로 쓰여진다.
구조체의 시작은 대부분 대문자로 시작하고 세미콜론으로 끝난다.
#include <stdio.h>
struct Man {
int age;
double weight;
};
int main(void)
{
struct Man kim;
int x = 10;
kim.age = 10;
kim.weight = 25.5;
printf("%d %lf\n", kim.age, kim.weight);
return 0;
}
구조체는 변수를 명명하고 뒤에 .age .weight 등 앞에 썼던 변수들을 저장해주는 역할을 한다.
구조체 선언과 구조체 멤버가 아주 중요하다.
구조체도 배열로 만들 수 있다.
위 사진을 보면 int main안에 변수가 구조체 안에 들어가 있는 모습을 볼 수 있다.
구조체 변수도 초기화를 하다 말면 0으로 초기화함. 그 결과로 tot과 ave가 0으로 바뀐 모습.
항상 구조체를 쓸때는 .을 써야한다.
11번째 줄까지는 j 라는 변수는 비어있는 값이였지만 12번째 j = h라는 구조체를 만나고 다른 수여도 완전히 복사가 되는걸 볼 수 있다.
#define _CRT_SECURE_NO_WARNINGS // scanf 함수 사용 시 발생하는 경고를 무시하기 위한 전처리기 지시문
#include <stdio.h> // 표준 입출력 함수 사용을 위한 헤더 파일 포함
// 성적 정보를 저장할 구조체 정의
struct Grade {
int num; // 학번
int kor; // 국어 점수
int eng; // 영어 점수
int mat; // 수학 점수
int total; // 총점
double avg; // 평균
};
int main(void) {
int i; // 반복문을 위한 변수
struct Grade man[5]; // 5명의 학생 성적을 저장할 배열
double avgkor = 0.0, avgeng = 0.0, avgmat = 0.0; // 각 과목의 점수 합계를 위한 변수 초기화
// 5명의 학생 성적 입력
for(i = 0; i < 5; i++){
printf("%d번째 학생의 학번=", i + 1); // 학생의 학번 입력 요청
scanf("%d", &man[i].num); // 학번 입력
printf("국어 점수="); scanf("%d", &man[i].kor); // 국어 점수 입력 요청 및 입력
printf("영어 점수="); scanf("%d", &man[i].eng); // 영어 점수 입력 요청 및 입력
printf("수학 점수="); scanf("%d", &man[i].mat); // 수학 점수 입력 요청 및 입력
man[i].total = man[i].kor + man[i].eng + man[i].mat; // 각 학생의 총점 계산
man[i].avg = man[i].total / 3.0; // 각 학생의 평균 계산
avgkor = avgkor + man[i].kor; // 국어 점수 누적
avgeng = avgeng + man[i].eng; // 영어 점수 누적
avgmat = avgmat + man[i].mat; // 수학 점수 누적
}
// 각 학생의 성적 출력 (학번, 국어, 영어, 수학, 총점, 평균)
printf(" 학번 국어 영어 수학 총점 평균\n");
for(i = 0; i < 5; i++){
printf("%8d %6d %6d %6d %6d %7.2f\n",
man[i].num, man[i].kor, man[i].eng, man[i].mat, man[i].total, man[i].avg);
}
// 과목별 평균 점수 출력
printf(" 국어 평균: %7.2f\n 영어 평균: %7.2f\n 수학 평균: %7.2f\n",
avgkor / 5.0, avgeng / 5.0, avgmat / 5.0);
return 0; // 프로그램 종료
}
chat gpt에게 주석을 달아달라는 결과이다.
배열보다 구조체로 적어놓은게 더 직관적이고 해석하기 쉽다.
다음은 숫자 맞추기 게임이다.
이렇게 계속 코드에 필요한 부분을 더해 완성시켜가면 된다.
가장 중요한 난수 발생을 시키는 방법은 #include rand() 선언을 하면 된다.
srand로 변수를 초기화 해주고, random함수로 rand를 가져온다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int guess;
int random;
int count = 1;
srand((unsigned int)time(NULL));
random = rand() % 100 + 1;
do {
printf("[ %02d회 ] 1~100까지 숫자 하나를 입력하세요 : ", count);
scanf("%d", &guess);
if (guess == random) printf(" => 빙고!\n");
else if (guess > random) printf(" => 더 작은 수를 입력하세요.\n");
else printf(" => 더 큰 수를 입력하세요.\n");
count++;
} while (guess != random);
return 0;
}
완성된 코드의 모습이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void print_welcome_message() {
printf("숫자 맞추기 게임에 오신 것을 환영합니다!\n");
printf("난이도를 선택하세요: (1) 쉬움 (2) 보통 (3) 어려움\n");
printf("쉬움: 1~50, 보통: 1~100, 어려움: 1~200\n");
}
int select_difficulty() {
int choice;
scanf("%d", &choice);
switch (choice) {
case 1: return 50;
case 2: return 100;
case 3: return 200;
default: printf("잘못된 선택입니다. 보통 난이도가 선택됩니다.\n"); return 100;
}
}
void print_attempts(int attempts, int max_attempts) {
printf("남은 시도 횟수: %d/%d\n", attempts, max_attempts);
}
void print_result(int guess, int random, int* score, int max_attempts, int attempts) {
if (guess == random) {
printf(" => 빙고! 정답입니다.\n");
*score += (max_attempts - attempts + 1) * 10;
} else if (guess > random) {
printf(" => 더 작은 수를 입력하세요.\n");
} else {
printf(" => 더 큰 수를 입력하세요.\n");
}
}
int main() {
int guess, random, attempts, max_attempts, score = 0, highest_score = 0;
char play_again;
srand((unsigned int)time(NULL));
do {
print_welcome_message();
int range = select_difficulty();
random = rand() % range + 1;
attempts = 0;
max_attempts = 10;
while (attempts < max_attempts) {
printf("[ %02d회 ] 1~%d까지 숫자 하나를 입력하세요 : ", attempts + 1, range);
scanf("%d", &guess);
attempts++;
print_result(guess, random, &score, max_attempts, attempts);
print_attempts(attempts, max_attempts);
if (guess == random) break;
}
if (guess != random) {
printf(" => 아쉽습니다. 정답은 %d였습니다.\n", random);
}
if (score > highest_score) {
highest_score = score;
printf(" => 최고 점수 갱신! 현재 최고 점수: %d\n", highest_score);
}
printf("현재 점수: %d\n", score);
printf("게임을 다시 시작하시겠습니까? (y/n) : ");
scanf(" %c", &play_again);
} while (play_again == 'y' || play_again == 'Y');
printf("게임을 종료합니다. 감사합니다.\n");
return 0;
}
이 코드는 chat gpt한테 난이도 선택, 점수 계산, 최고 점수 기록, 시도 횟수 표시, 게임 재시작 여부 확인을 추가한 게임이다.