C언어

이은룡·2022년 5월 12일
1

C

목록 보기
1/1

기본 문법

Hello World

#include <stdio.h>

int main() {
	printf("Hello World \n");
}

정수형 변수

	int age = 28;
	printf("%d\n", age);
	age = 14;
	printf("%d\n", age);
	return 0;

실수형 변수

float f = 68.5f;
	printf("%.3f\n", f);
	double d = 55.53;
	printf("%.2lf\n", d);
	return 0;

상수

const int YEAR = 1995;
	printf("태어난 년도 : %d\n", YEAR);
    return 0;

연산

int add = 3 + 7;
	printf("3 + 7 = %d\n", add);
	printf("%d + %d = %d\n", 3, 7, 3 + 7);
	return 0;

scanf

int input;
	printf("값을 입력하세요 : ");
	scanf_s("%d", &input);
	printf("입력값 : %d\n", input);
    return 0;
//여러개    
int one, two, three;
	printf("3개의 정수를 입력하세요 : ");
	scanf_s("%d %d %d", &one, &two, &three);
	printf("첫번째 값 : %d\n", one);
	printf("두번째 값 : %d\n", two);
	printf("세번째 값 : %d\n", three);
    return 0;

문자, 문자열

char c = 'A';
	printf("%c\n", c);
    return 0;
    
char str[256];
	scanf_s("%s", str, sizeof(str));
	printf("%s\n", str);
    return 0;

반복문

++

int a = 10;
	printf("a= %d\n", a); //10
	a++; //1씩 증가 a++ > a = a + 1;
	printf("a= %d\n", a); //11
	a++;
	printf("a= %d\n", a); //12
	return 0;
int b = 20;
	printf("b = %d\n", ++b); //1을 먼저 더함 21
	printf("b = %d\n", b++); //b를 먼저 나타내고 1을 더함 21
	printf("b = %d\n", b); //22
    return 0;

반복문

for (선언; 조건; 증감)

for (int i = 1;i <=10; i++)
	{
		printf("Hello World %d\n", i);
	}
    return 0;

while(조건){ }

int i = 1;
	while (i<=10)
	{
		printf("Hello World %d\n", i++);
		//i++;
	}
	return 0;

do { } while (조건);

int i = 1;
	do {
		printf("Hello World %d\n", i++);
	} while (i <= 10);
    return 0;

이중 반복문

for (int i = 1; i <= 4; i++)
	{
		printf("첫 번째 반복문 : %d\n", i);

		for (int j = 1; j <= 5; j++)
		{
			printf("	두 번째 반복문 : %d\n", j);
		}
	}
    return 0;

활용

//구구단
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);
		}
	}
    return 0;
for (int i = 0; i < 5;i++) {
		for (int j = 0; j <=i; j++) {
			printf("*");
		}
		printf("\n");
	}
	return 0;

피라미드 쌓기

int floor;
	printf("몇 층으로 쌓겠느냐? : ");
	scanf_s("%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");
	}

	return 0;

조건문

if else

	int age = 28;
	if (age >= 20)
		printf("성인입니다.");
	else
		printf("학생입니다.");
	return 0;

else if

int age = 4;
	if (age >= 20)
	{
		printf("성인입니다.");
	}
	else if (age >= 17 && age <= 20)
	{
		printf("고등학생입니다.");
	}
    else {
		printf("어린이입니다.");
	}
    return 0;

break

//1~5까지 조별 발표
	for (int i = 1; i <= 30; i++)
	{
		if (i >= 6) 
		{
			printf("나머지 학생은 집에 가세요 \n");
			break; //for문 탈출
		}
		printf("%d 번 학생 조별 발표 준비를 하세요\n", i);
	}
	return 0;

continue

for (int i = 1; i <= 30; i++)
	{
		if (i >= 6 && i <= 10)
		{
			if (i == 7)
			{
				printf("%d 번 학생은 결석입니다.\n", i);
				continue;// 조건이 맞을때 i = 7 다음으로 넘어감
			}
			printf("%d 번 학생 조별 발표 준비를 하세요\n", i);
		}
	}
	return 0;

and:&&
or:||

int a = 10;
	int b = 10;
	int c = 12;
	int d = 13;
	if (a == b || c == d)
	{
		printf("a와 b, 혹은 c와 d가 같습니다\n");
	}
	else
	{
		printf("값이 서로 다르네요\n");
	}
	return 0;

랜덤

//기본
{
	srand(time(NULL)); //난수 초기화
	int num = rand() % 3 + 1;//1~3
	printf("%d", rum);
	return 0;
}
	printf("난수 초기화 전.. \n"); //여러번 실행해도 똑같은 값
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", rand() % 10);
	}
	srand(time(NULL));
	printf("\n\n 난수 초기화 후.. \n");//여러번 실행하면 다른 값
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", rand() % 10);
	}
	return 0;

가위바위보

srand(time(NULL));
	int i = rand() % 3;
	if (i == 0)
	{
		printf("가위\n");
	}
	else if (i == 1)
	{
		printf("바위\n");
	}
	else if (i == 2)
	{
		printf("보\n");
	}
	else {
		printf("몰라요\n");
	}
    return 0;

switch case(가위바위보)

srand(time(NULL));
	int i = rand() % 3;
	switch (i)
	{
	case 0: printf("가위\n");break;
	case 1: printf("바위\n");break;
	case 2: printf("보\n");break;
	default:printf("몰라요\n");break;
	}
	return 0;

UP and DOWN

srand(time(NULL));
	int num = rand() % 100 + 1;//1~100
	int answer = 0;
	int chance = 5;
	while (chance > 0)
	{
		printf("남은 기회 : %d \n", chance--);
		printf("숫자를 맞춰 보세요 (1~100) : ");
		scanf_s("%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");
		}
	}
    return 0;

함수

반환형 함수이름 (전달값){}
반환형:형태 (int, void, double, char 등등)
전달값:파라미터 여러개 사용 가능

기본 예시

//선언
void p(int num);
//정의
void p(int num)
{
	printf("num 은 %d입니다\n", num);
}

반환값이 없는 함수

void function_without_return();//선언

function_without_return();
return 0;

void function_without_return() //정의
{
	printf("반환값이 없는 함수입니다");
}

반환값이 있는 함수

int function_with_return(); //선언

int ret = function_with_return();
printf(ret); //10
return 0;

int function_with_return() //정의
{
	printf("반환값이 있는 함수입니다\n");
	return 10;
}

전달값이 있는 함수

void function_with_params(int num1, int num2, int num3);

function_with_params(13, 22, 32);
	return 0;
    
void function_with_params(int num1, int num2, int num3)
{
	printf("전달값이 있는 함수이며, 전달 받은 값은 %d, %d ,%d 입니다\n",
		num1, num2, num3); // 13, 22, 32
}

반환값과 전달값이 있는함수

int apple(int total, int ate);

printf("사과 %d개중에 %d개를 먹으면 %d개가 남아요\n",
10, 4, apple(10, 4));
	return 0;
    
int apple(int total, int ate)
{
	printf("전달값과 변환값이 있는 함수힙니다.\n");
	return total - ate;
}

배열

기본 예문

int subway_1 = 30;
	int subway_2 = 40;
	int subway_3 = 50;

	printf("지하철 1호차에 %d명 타고 있습니다.", subway_1);
	printf("지하철 2호차에 %d명 타고 있습니다.", subway_2);
	printf("지하철 3호차에 %d명 타고 있습니다.", subway_3);

	
	int subway_array[3];
	subway_array[0] = 30;
	subway_array[1] = 40;
	subway_array[2] = 50;

	for (int i = 0; i < 3; i++)
	{
		printf("지하철 %d호차에 %d명 타고 있습니다.", i + 1, subway_array[i]);
	}
    return 0;

값 설정

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}
    return 0;

값 설정 후 초기화
배열 크기는 항상 상수
값을 주지 않으면 자동으로 '0'이됨

float문

float arr_f[5] = { 1.0f, 2.0f, 3.0f };
	for (int i = 0; i < 5; i++)
	{
		printf("%.2f\n", arr_f[i]);
	}
    return 0;

문자열 배열

//문자열 //문자열 끝에는 '끝'을 의미하는 NULL 문자 '\0'이 포함되어야함
	char str[7] = "coding"; // [c][o][d][i][n][g][\0]  
	printf("%s\n", str);
    return 0;

한글 문자열

char kor[] = "은룡";
	printf("%s\n", kor);
	printf("%d\n", sizeof(kor));
	// 영어 1글자당 : 1byte 
	// 한글 1글자당 : 2byte
	return 0;

ASCII코드
7bit, 총 128개의 코드 0~127

	for(int i = 0; i < 128; i++)
    {
    printf("아스키코드 정수  %c : %d \n" , i , i);
    }
    return 0;
    

포인터

메모리 공간의 주소

	int 철수 = 1; //암호
	int 영희 = 2;
	int 민수 = 3;

	printf("철수네 주소 : %p ,암호 : %d\n", &철수, 철수); 
    //&철수 : 메모리 공간의 주소
	printf("영희네 주소 : %p ,암호 : %d\n", &영희, 영희);
	printf("민수네 주소 : %p ,암호 : %d\n", &민수, 민수);
    return 0;

포인터 변수

	int 철수 = 1;
	int * 미션맨; // 포인터 변수
	미션맨 = &철수; // *미션맨 = 철수;
	printf("미션맨이 방문하는 곳 주소 : %p, 암호 : %d", 미션맨, *미션맨);
    int * 스파이 = 미션맨 // 다른 포인터 변수 추가
	return 0;

c언어 출력타입

    %d: 10진수(정수형)

    %f: 실수형

    %e: 지수형

    %o: 8진수

    %x: 16진수

    %u: 부호없는 10진수

    %g: 실수형 자동출력

    %p: 포인터의 주소

    %c: 하나의 문자로 출력

    %s: 문자열

배열과 포인터

int arr[3] = { 5, 10, 15 };
	int* ptr = arr; //배열 arr과 ptr은 같은 배열
	for (int i = 0; i < 3; i++)
	{
		printf("배열 arr[%d] 의 값 : %d\n", i, arr[i]);
	}
	for (int i = 0; i < 3; i++)
	{
		printf("배열 ptr[%d] 의 값 : %d\n", i, ptr[i]);
	}
    return 0;
	int arr[3] = { 5, 10, 15 };
	//arr[i] == *(arr + i)
	//arr === arr 배열의 첫번째 값의 주소와 동일 == &arr[0]
	printf("arr 자체의 값 = %p\n", arr);
	printf("arr[0]의 주소 = %p\n", &arr[0]);

	printf("arr 자체의 값이 가지는 주소의 실제 값 = %d\n", *arr);
	printf("arr[0]의 실제 값 = %d\n", *&arr[0]);
    //*& = 아무것도 없는 것과 같다.
    return 0;

swap

void swap(int a, int b);

int a = 10;
	int b = 20;

	printf("swap 함수전 a:%d , b:%d\n", a, b);  // a=10 ,b= 20
	swap(a, b);
	printf("swap 함수 후 a:%d , b:%d\n", a, b); //a=10 ,b= 20
	return 0;

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	printf("swap 함수 안 a:%d , b:%d\n", a, b); //a=20 ,b= 10
}

a, b 와 swap 함수 안 a, b의 주소 값이 다름

주소 값 전달

void swap_addr(int* a, int* b);

printf("<주소값 전달>swap 함수 전 a:%d , b:%d\n", a, b);
	swap_addr(&a, &b);
	printf("<주소값 전달>swap 함수 후 a:%d , b:%d\n", a, b);
	return 0;
    
void swap_addr(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
	printf("<주소값 전달>swap 함수 안  a:%d , b:%d\n", *a, *b);
}

주소값을 전달해서 값이 바뀜

다차원 배열

다차원 배열 기본

//다차원 배열
	int i = 1;//□

	int arr[5];
	//□□□□□
    
    //[0][1][2][3][4]

	int arr2[2][5];
	//□□□□□
	//□□□□□
    
    //[0,0][0,1][0,2][0,3][0,4] >> arr2[0][0] ~ arr2[0][4]
	//[1,0][1,1][1,2][1,3][1,4]

	int arr3[4][2];
	//□□
	//□□
	//□□
	//□□

	int arr4[3][3][3];
	//□□□ >> arr4[0][0][0] >> arr4[0][0][2]
	//□□□ >> arr4[0][1][0] >> arr4[0][1][2]
	//□□□
	 
	//□□□ >> arr4[1][0][0] >> arr4[1][0][2]
	//□□□
	//□□□
	
	//□□□ >> arr4[2][0][0] >> arr4[2][0][2]
	//□□□
	//□□□
	return 0;

다차원 배열 선언

	int arr3[4][2] = { 
		{1, 2},
		{1, 2},
		{1, 2},
		{1, 2}};
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			printf("2차원 배열 (%d, %d) 의 값 : %d\n", i, j, arr3[i][j]);
		}
		printf("\n");
	}

구조체

기본문법

	struct GameInfo {
	char* name;
	int year;
	int price;
	char* company;
};

사용법

	struct GameInfo gameInfo1;
	gameInfo1.name = "은룡게임";
	gameInfo1.year = 1995;
	gameInfo1.price = 500;
	gameInfo1.company = "은룡회사";

	printf("-- 게임 출시 정보--\n");
	printf("  게임명 : %s\n", gameInfo1.name);
	printf("  출시연도 : %d\n", gameInfo1.year);
	printf("  가격 : %d\n", gameInfo1.price);
	printf("  제작사 : %s\n", gameInfo1.company);

사용법 2

	struct GameInfo gameInfo2 = { "은룡게임2", 1996, 300, "은룡회사" };
	printf("-- 다른 게임 출시 정보--\n");
	printf("  게임명 : %s\n", gameInfo2.name);
	printf("  출시연도 : %d\n", gameInfo2.year);
	printf("  가격 : %d\n", gameInfo2.price);
	printf("  제작사 : %s\n", gameInfo2.company);

구조체 배열

struct GameInfo gameArray[2] = {
		{ "은룡게임", 1995, 500, "은룡회사" } ,
		{ "은룡게임2", 1996, 300, "은룡회사" }
	}

구조체 포인터

	struct GameInfo* gamePtr;
	gamePtr = &gameInfo1;
	printf("  게임명 : %s\n", gamePtr->name);
	printf("  출시연도 : %d\n", gamePtr->year);
	printf("  가격 : %d\n", gamePtr->price);
	printf("  제작사 : %s\n", gamePtr->company);

구조체 안의 구조체

	struct GameInfo* friendGame;

	gameInfo1.friendGame = &gameInfo2;
	printf("-- 연관 게임 출시 정보--\n");
	printf("  게임명 : %s\n", gameInfo1.friendGame->name);
	printf("  출시연도 : %d\n", gameInfo1.friendGame->year);
	printf("  가격 : %d\n", gameInfo1.friendGame->price);
	printf("  제작사 : %s\n", gameInfo1.friendGame->company);

typedef
자료형에 별명 지정

	int i = 1;
	typedef int 정수;
	typedef float 실수;
	정수 정수변수 = 3;
	실수 실수변수 = 3.23f;
	printf("정수변수 = %d 실수변수 = %.2f\n\n", 정수변수, 실수변수);
	typedef struct GameInfomatin {
	char* name;
	int year;
	int price;
	char* company;

	struct GameInfo* friendGame;
} GAME_INFO; 


	GAME_INFO game2;
	game2.name = "영어게임";
	game2.year = 1994;
	game2.price = 700;
	game2.company = "영어회사";

파일 입출력

fputs,fgets = 문자열
fprintf,fscanf = %s,%d 출력타입

fputs : 파일 쓰기

	char line[MAX];
	FILE* file = fopen("C:\\Users\\Eunryong\\Desktop\\C언어\\test1.txt", "wb");
	if (file == NULL)
	{
		printf("파일 열기 실패\n");
		return 1;
	}

	fputs("fputs를 이용해서 글을 적어볼게요\n", file);
	fputs("잘 적히는지 확인해주세요\n", file);

	fclose(file);

fgets : 파일 읽기

	FILE* file = fopen("C:\\Users\\Eunryong\\Desktop\\C언어\\test1.txt", "rb");
	if (file == NULL)
	{
		printf("파일 열기 실패\n");
		return 1;
	}

	while (fgets(line, MAX, file) != NULL)
	{
		printf("%s", line);
	}

	fclose(file);

fprintf

	int num[6] = { 0,0,0,0,0,0 };
	int bonus = 0;
	char str1[MAX];
	char str2[MAX];
	FILE* file = fopen("C:\\Users\\Eunryong\\Desktop\\C언어\\test2.txt", "wb");
	if (file == NULL)
	{
		printf("파일 열기 실패");
		return 1;

	}

	fprintf(file, "%s %d %d %d %d %d %d\n", "추첨번호", 1, 2, 3, 4, 5, 6);
	fprintf(file, "%s %d \n", "보너스번호", 7);

	fclose(file);

fscanf

	FILE* file = fopen("C:\\Users\\Eunryong\\Desktop\\C언어\\test2.txt", "rb");
	if (file == NULL)
	{
		printf("파일 열기 실패");
		return 1;

	}

	fscanf(file, "%s %d %d %d %d %d %d", str1,
		&num[0], &num[1], &num[2], &num[3], &num[4], &num[5]);
	printf("%s %d %d %d %d %d %d\n", str1, num[0], num[1], num[2], num[3], num[4], num[5]);

	fscanf(file, "%s %d", str2, &bonus);
	printf("%s %d\n", str2, bonus);

	fclose(file);

0개의 댓글