사용자 정의 함수
struct주요
구두점 10가지
parameterㅡ argument 차이점
#include <stdio.h>
int main(void){
int x;
x = 10;
printf("%d\n", x);
return 0;}
두수의 합 출력
#include <stdio.h>
int main(void){
int num1, num2;
num1=100;
num2=95;
printf("두 수의 합은 %d입니다.\n",num1+num2);
return 0;}
두수의 평균
#include <stdio.h>
int main(void)
{
int num1, num2,sum;
double avg;
num1=100;
num2=95;
sum=num1+num2;
avg=sum/2.0; //자동 형변환, 2로 나누면?
printf("합: %d, 평균: %lf\n",sum,avg); //%.2f
return 0;
}

두 점수를 입력 받아 합과 평균 출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void){
int kor, eng;
printf("국어 점수=");
scanf("%d",&kor);
printf("영어 점수=");
scanf("%d",&eng);
printf("합: %d, 평균:%lf\n",kor+eng, (kor+eng)/2.0);
return 0;}
[변수 배열 사용하지 않을 때] 2명의 성적 총점, 평균, 과목 별 총점 평균
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void){
int num1,kor1, eng1;
int num2,kor2, eng2;
printf("1 학번="); scanf("%d",&num1);
printf("1 국어 점수="); scanf("%d",&kor1);
printf("1 영어 점수=");scanf("%d",&eng1);
printf("2 학번="); scanf("%d",&num2);
printf("2 국어 점수="); scanf("%d",&kor2);
printf("2 영어 점수=");scanf("%d",&eng2);
printf("학번 :%d 국어:%d 영어:%d 합: %d, 평균:%lf\n",
num1, kor1, eng1,kor1+eng1, (kor1+eng1)/2.0);
printf("학번 :%d 국어:%d 영어:%d 합: %d, 평균:%lf\n",
num2, kor2, eng2, kor2+eng2, (kor2+eng2)/2.0);
printf("국어 총점 : %d, 평균 : %f\n",kor1+kor2, (kor1+kor2)/2.0);
printf("영어 총점 : %d, 평균 : %f\n",eng1+eng2, (eng1+eng2)/2.0);
return 0;}
배점 높은 소스 -이해
배열을 활용한 성적처리 프로그램
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void){
int i, num[3], kor[3], eng[3], mat[3], cl[3], total[3];
double avgkor = 0.0, avgeng = 0.0, avgmat = 0.0, avgcl = 0.0;
double avg[5];
for (i = 0; i < 3; i++) {
printf("%d번째 학생의 학번=", i + 1);
scanf("%d", &num[i]);
printf("국어 점수="); scanf("%d", &kor[i]);
printf("영어 점수="); scanf("%d", &eng[i]);
printf("수학 점수="); scanf("%d", &mat[i]);
printf("c 점수="); scanf("%d", &cl[i]);
total[i] = kor[i] + eng[i] + mat[i] + cl[i]; //각 학생의 총점
avg[i] = total[i] / 3.0; //각 학생의 평균
avgkor = avgkor + kor[i]; //국어 점수 누적
avgeng = avgeng + eng[i]; //영어 점수 누적
avgmat = avgmat + mat[i]; //수학 점수 누적
avgcl = avgcl + cl[i];}
printf(" 학번 국어 영어 수학 c 총점 평균\n");
for (i = 0; i < 3; i++) {
printf("%8d %6d %6d %6d %6d %6d %7.2f\n", num[i], kor[i], eng[i], mat[i], cl[i], total[i], avg[i]);}
printf(" 국어 평균: %7.2f\n 영어 평균: %7.2f\n 수학 평균: %7.2f\n c평균: %7.2f\n", avgkor / 3., avgeng / 3., avgmat / 3., avgcl / 3.);
return 0;}
구조체
이 프로그램은 struct score라는 구조체를 정의하고, 두 개의 구조체 변수를 사용하여 성적 정보를 저장하고 출력하는 예제입니다. 이제 코드의 각 부분을 자세히 설명하겠습니다.
#include <stdio.h>
표준 입출력 라이브러리를 포함합니다. 이 라이브러리를 통해 printf와 같은 입출력 함수를 사용할 수 있습니다.
struct score {
char hakbun[10];
char name[10];
int kor, eng, tot;
double ave;};
struct score라는 구조체를 정의합니다. 이 구조체는 학생의 학번(hakbun), 이름(name), 국어 성적(kor), 영어 성적(eng), 총점(tot), 평균(ave)을 저장할 수 있습니다.
int main(void)
{struct score j, h = { "202345678","han",80,89 };
h.tot = h.kor + h.eng;
j = h;
printf("%s %s %d %d %d\n", h.hakbun, h.name, h.kor, h.eng, h.tot);
printf("%s %s %d %d %d\n", j.hakbun, j.name, j.kor, j.eng, j.tot);
return 0;}
main 함수의 시작 부분입니다.
struct score j, h = { "202345678","han",80,89 };
두 개의 struct score 타입 변수를 선언합니다: j와 h.
h는 초기화되어 있습니다. 학번은 "202345678", 이름은 "han", 국어 성적은 80, 영어 성적은 89로 설정되어 있습니다. 총점(tot)과 평균(ave)은 초기화되지 않았습니다.
h.tot = h.kor + h.eng;
h의 총점(tot) 필드를 국어 성적(kor)과 영어 성적(eng)의 합으로 설정합니다. 따라서 h.tot는 80 + 89 = 169가 됩니다.
j = h;
h의 데이터 전체를 j에 복사합니다. 이제 j와 h는 동일한 데이터를 갖게 됩니다.
printf("%s %s %d %d %d\n", h.hakbun, h.name, h.kor, h.eng, h.tot);
h의 모든 데이터를 출력합니다. 출력 결과는 "202345678 han 80 89 169"가 됩니다.
printf("%s %s %d %d %d\n", j.hakbun, j.name, j.kor, j.eng, j.tot);
j의 모든 데이터를 출력합니다. j는 h의 데이터를 복사했으므로, 출력 결과는 동일하게 "202345678 han 80 89 169"가 됩니다.
return 0;}
main 함수가 0을 반환하며 종료됩니다. 이는 프로그램이 정상적으로 종료되었음을 의미합니다.
요약
이 프로그램은 struct score 구조체를 사용하여 학생의 성적 정보를 저장하고, 두 개의 구조체 변수 h와 j를 통해 데이터를 복사하고 출력하는 예제입니다. h 변수는 초기화된 후 국어와 영어 성적의 합을 총점(tot)으로 계산하며, 그 값을 j 변수에 복사하여 동일한 데이터를 출력합니다.
책376p
이 프로그램은 학생 5명의 학번, 국어, 영어, 수학 점수를 입력받아 각 학생의 총점과 평균을 계산하고, 전체 학생의 과목별 평균 점수를 출력하는 프로그램입니다. 각 부분을 자세히 설명하겠습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
_CRT_SECURE_NO_WARNINGS는 Visual Studio에서 표준 C 함수의 보안이 강화된 버전을 사용하지 않도록 설정하는 매크로입니다. stdio.h는 표준 입출력 함수를 사용하기 위해 포함되는 헤더 파일입니다.
struct Grade {
int num,kor,eng,mat,total;
double avg;
};
struct Grade는 학생의 정보를 저장하기 위한 구조체입니다. 여기에는 학번(num), 국어 점수(kor), 영어 점수(eng), 수학 점수(mat), 총점(total), 평균(avg)이 포함됩니다.
int main(void) {
int i;
struct Grade man[5];
double avgkor=0.0, avgeng=0.0, avgmat=0.0;
main 함수의 시작입니다. man[5]는 5명의 학생 정보를 저장할 수 있는 Grade 구조체 배열입니다. avgkor, avgeng, avgmat은 국어, 영어, 수학 점수의 평균을 계산하기 위한 변수입니다.
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;
}
이 for 루프는 사용자로부터 학생 5명의 학번, 국어, 영어, 수학 점수를 입력받습니다. 각 학생의 총점과 평균을 계산하고, 과목별 점수를 누적하여 평균을 계산할 준비를 합니다.
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);
}
각 학생의 학번, 국어, 영어, 수학 점수, 총점, 평균을 출력합니다. %7.2f 형식 지정자는 소수점 아래 두 자리까지의 실수를 출력합니다.
printf(" 국어 평균: %7.2f\n 영어 평균: %7.2f\n 수학 평균: %7.2f\n",
avgkor/5., avgeng/5., avgmat/5.);
입력받은 국어, 영어, 수학 점수의 평균을 계산하여 출력합니다. 각 과목별 총점을 학생 수인 5로 나누어 평균을 구합니다.
return 0;
}
프로그램이 성공적으로 종료되었음을 나타냅니다.
요약
이 프로그램은 학생 5명의 학번, 국어, 영어, 수학 점수를 입력받아, 각 학생의 총점과 평균을 계산하고, 모든 학생의 국어, 영어, 수학 점수의 평균을 출력합니다. 입력과 계산, 출력 과정을 포함합니다.
Up & Down Game
#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; //1~100
//printf("%d\n", random); //이 줄 지우고 게임하기!!!
do {
printf("[ %02d회 ] 1~100까지 숫자 하나를 입력하세요=", count);
scanf("%d", &guess);
printf("입력한 수 : %d\n", guess);
if (guess == random) printf("빙고!\n");
else if (guess > random) printf("더 작은 수를 입력하세요.\n");
else printf("더 큰 수를 입력하세요.\n");
count++;
} while (guess != random);
return 0;
}
// rand()는 0~32767까지 난수 하나 발생시켜 저장
/*printf("%d %d %d\n",4%3,5%3,6%3);
%는 나머지가 나오는 연산자
수%3을 하면 아무리 큰 값이라도 0,1,2가 나옴
수%100은 0~99까지 수*/
이 코드는 C 언어로 작성된 간단한 숫자 맞추기 게임입니다. 아래에서 코드의 각 부분을 상세히 설명해 드리겠습니다.
#define _CRT_SECURE_NO_WARNINGS
이 매크로 정의는 scanf와 같은 함수 사용 시 발생할 수 있는 보안 경고를 무시하도록 합니다. Visual Studio와 같은 컴파일러에서 경고를 피하기 위해 사용됩니다.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
stdio.h: 표준 입출력 함수를 사용하기 위해 포함합니다.
time.h: 현재 시간을 가져오기 위한 함수들을 사용하기 위해 포함합니다.
stdlib.h: rand 함수와 srand 함수를 사용하기 위해 포함합니다.
int main()
{
int guess;
int random;
int count = 1;
guess: 사용자가 입력하는 숫자를 저장하는 변수입니다.
random: 컴퓨터가 생성한 임의의 숫자를 저장하는 변수입니다.
count: 사용자가 몇 번 시도했는지를 세는 변수입니다.
srand((unsigned int)time(NULL)); // 난수 발생기 초기화
random = rand() % 100 + 1; // 1~100
srand((unsigned int)time(NULL)): 현재 시간을 시드(seed)로 하여 난수 발생기를 초기화합니다. 이를 통해 매번 다른 난수가 생성됩니다.
random = rand() % 100 + 1: rand 함수를 사용하여 0에서 32767 사이의 난수를 생성한 후, % 100 연산을 통해 0에서 99 사이의 숫자로 변환합니다. 여기에 1을 더하여 1에서 100 사이의 숫자를 생성합니다.
// printf("%d\n", random); // 이 줄 지우고 게임하기!!!
이 줄은 디버깅을 위해 임의로 생성된 숫자를 출력하는 코드입니다. 실제 게임에서는 이 줄을 주석 처리하여 사용자가 맞춰야 할 숫자를 알 수 없도록 합니다.
do {
printf("[ %02d회 ] 1~100까지 숫자 하나를 입력하세요=", count);
scanf("%d", &guess);
printf("입력한 수 : %d\n", guess);
do 루프는 사용자가 올바른 숫자를 맞출 때까지 반복됩니다.
printf("[ %02d회 ] 1~100까지 숫자 하나를 입력하세요=", count);: 몇 번째 시도인지를 표시하고 사용자에게 숫자를 입력받습니다.
scanf("%d", &guess);: 사용자가 입력한 숫자를 guess 변수에 저장합니다.
printf("입력한 수 : %d\n", guess);: 사용자가 입력한 숫자를 출력합니다.
if (guess == random)
printf("빙고!\n");
else if (guess > random)
printf("더 작은 수를 입력하세요.\n");
else
printf("더 큰 수를 입력하세요.\n");
count++;
} while (guess != random);
if (guess == random): 사용자가 입력한 숫자가 임의의 숫자와 같다면 "빙고!"를 출력하고 게임을 종료합니다.
else if (guess > random): 사용자가 입력한 숫자가 임의의 숫자보다 크다면 "더 작은 수를 입력하세요."를 출력합니다.
else: 사용자가 입력한 숫자가 임의의 숫자보다 작다면 "더 큰 수를 입력하세요."를 출력합니다.
count++: 시도 횟수를 1 증가시킵니다.
} while (guess != random);: 사용자가 올바른 숫자를 맞출 때까지 루프를 계속 실행합니다.
return 0;
}
프로그램을 정상적으로 종료합니다.
주석 설명
// rand()는 0~32767까지 난수 하나 발생시켜 저장
/* printf("%d %d %d\n",4%3,5%3,6%3);
%는 나머지가 나오는 연산자
수%3을 하면 아무리 큰 값이라도 0,1,2가 나옴
수%100은 0~99까지 수 */
rand() 함수는 0에서 32767 사이의 난수를 생성합니다.
% 연산자는 나머지 연산자로, 예를 들어 4 % 3은 1, 5 % 3은 2, 6 % 3은 0이 됩니다. 이는 어떤 수를 3으로 나눈 나머지를 의미합니다.
수 % 100은 0에서 99 사이의 값을 반환합니다. 이 결과에 1을 더하면 1에서 100 사이의 값을 얻을 수 있습니다.
이 게임은 간단하지만 기본적인 프로그래밍 개념(변수, 조건문, 루프, 난수 생성 등)을 이해하는 데 매우 유용합니다.
숫자 맞추기 게임에 몇 가지 게임적 요소를 추가하여 더 흥미롭게 만들어보겠습니다. 다음은 몇 가지 추가할 수 있는 요소들입니다:
최대 시도 횟수 제한: 게임에 제한된 시도 횟수를 추가하여 긴장감을 높입니다.
점수 시스템: 적은 시도로 맞출수록 높은 점수를 주는 시스템을 도입합니다.
힌트 기능: 특정 횟수 이상 틀리면 힌트를 제공합니다.
게임 재시작 기능: 게임이 끝난 후 다시 시작할 수 있는 기능을 추가합니다.
아래는 위의 요소들을 반영한 수정된 코드입니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void playGame();
int main() {
char playAgain;
do {
playGame();
printf("게임을 다시 하시겠습니까? (y/n): ");
scanf(" %c", &playAgain);
} while (playAgain == 'y' || playAgain == 'Y');
return 0;
}
void playGame() {
int guess;
int random;
int count = 1;
const int maxAttempts = 10; // 최대 시도 횟수
srand((unsigned int)time(NULL)); // 난수 발생기 초기화
random = rand() % 100 + 1; // 1~100
int score = 100; // 초기 점수
printf("숫자 맞추기 게임에 오신 것을 환영합니다! 최대 %d회 시도할 수 있습니다.\n", maxAttempts);
do {
printf("[ %02d회 ] 1~100까지 숫자 하나를 입력하세요=", count);
scanf("%d", &guess);
printf("입력한 수 : %d\n", guess);
if (guess == random) {
printf("빙고! 맞췄습니다!\n");
printf("최종 점수: %d\n", score);
break;
} else if (guess > random) {
printf("더 작은 수를 입력하세요.\n");
} else {
printf("더 큰 수를 입력하세요.\n");
}
count++;
score -= 10; // 시도할 때마다 점수 감소
if (count > maxAttempts) {
printf("최대 시도 횟수를 초과했습니다. 게임 오버!\n");
printf("정답은 %d였습니다.\n", random);
break;
}
if (count % 3 == 0) {
if (random % 2 == 0) {
printf("힌트: 정답은 짝수입니다.\n");
} else {
printf("힌트: 정답은 홀수입니다.\n");
}
}
} while (1);
}
코드 설명
게임 재시작 기능: main 함수 안에 do-while 루프를 추가하여 게임이 끝난 후 다시 시작할 수 있도록 했습니다. 사용자가 'y'나 'Y'를 입력하면 게임이 다시 시작됩니다.
최대 시도 횟수 제한: maxAttempts 변수를 추가하여 최대 시도 횟수를 제한했습니다. 사용자가 시도 횟수를 초과하면 게임이 종료됩니다.
점수 시스템: score 변수를 추가하여 사용자가 시도할 때마다 점수가 감소하도록 했습니다. 초기 점수는 100점으로 설정하였고, 시도할 때마다 10점씩 감소합니다.
힌트 기능: 사용자가 3회 시도할 때마다 정답이 짝수인지 홀수인지에 대한 힌트를 제공합니다.
이렇게 수정된 코드는 게임에 더 많은 요소를 추가하여 사용자가 더 재미있게 즐길 수 있도록 합니다.
숫자 맞추기 게임을 만드는 과정을 단계별로 쪼개어 설명하겠습니다. 이 과정은 초급자가 C언어를 사용하여 간단한 게임을 만드는 방법을 이해하는 데 도움이 될 것입니다. 각 단계마다 설명과 함께 주석을 추가하겠습니다.
단계 1: 기본 틀 만들기
처음으로, 프로그램의 기본 구조를 설정합니다. 난수 생성기를 초기화하고, 메인 함수의 뼈대를 만듭니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// 난수 발생기 초기화
srand((unsigned int)time(NULL));
return 0;
}
단계 2: 난수 생성
사용자가 맞춰야 할 1에서 100 사이의 난수를 생성합니다.
int main() {
srand((unsigned int)time(NULL));
// 1~100 사이의 난수 생성
int targetNumber = rand() % 100 + 1;
return 0;
}
단계 3: 사용자 입력 받기
사용자로부터 숫자 입력을 받습니다. 입력 받은 숫자를 확인하기 위해 출력해보겠습니다.
int main() {
srand((unsigned int)time(NULL));
int targetNumber = rand() % 100 + 1;
int userGuess;
printf("1부터 100 사이의 숫자를 입력하세요: ");
scanf("%d", &userGuess);
printf("입력한 숫자: %d\n", userGuess);
return 0;
}
단계 4: 입력과 난수 비교
사용자의 입력과 난수를 비교하여, 결과를 사용자에게 알립니다.
int main() {
srand((unsigned int)time(NULL));
int targetNumber = rand() % 100 + 1;
int userGuess;
printf("1부터 100 사이의 숫자를 입력하세요: ");
scanf("%d", &userGuess);
if(userGuess == targetNumber) {
printf("정답입니다!\n");
} else {
printf("틀렸습니다.\n");
}
return 0;
}
단계 5: 반복과 힌트 추가
사용자가 정답을 맞출 때까지 반복하게 하고, 힌트를 제공합니다.
int main() {
srand((unsigned int)time(NULL));
int targetNumber = rand() % 100 + 1;
int userGuess = 0;
while(userGuess != targetNumber) {
printf("1부터 100 사이의 숫자를 입력하세요: ");
scanf("%d", &userGuess);
if(userGuess == targetNumber) {
printf("정답입니다!\n");
} else if(userGuess > targetNumber) {
printf("입력한 숫자가 너무 큽니다.\n");
} else {
printf("입력한 숫자가 너무 작습니다.\n");
}
}
return 0;
}
단계 6: 시도 횟수 추가
사용자가 몇 번 만에 맞췄는지 표시합니다.
int main() {
srand((unsigned int)time(NULL));
int targetNumber = rand() % 100 + 1;
int userGuess = 0;
int attempts = 0;
while(userGuess != targetNumber) {
printf("1부터 100 사이의 숫자를 입력하세요: ");
scanf("%d", &userGuess);
attempts++;
if(userGuess == targetNumber) {
printf("정답입니다! %d번 만에 맞췄습니다.\n", attempts);
} else if(userGuess > targetNumber) {
printf("입력한 숫자가 너무 큽니다.\n");
} else {
printf("입력한 숫자가 너무 작습니다.\n");
}
}
return 0;
}
이제 최대한 100줄 내외로 숫자 맞추기 게임의 기본 틀을 만들었습니다. 각 단계를 거치며 게임의 기능을 점진적으로 확장하는 방식으로 개발하는 것이 좋습니다. 이렇게 하면 프로그래밍 초보자도 쉽게 따라할 수 있고, 각 단계에서 무엇을 배우는지 명확하게 이해할 수 있습니다.