유튜브 나도코딩 c언어 기초 강의 내용입니다.
배열은 여러개의 변수를 함께 동시에 생성한다고 볼 수 있다. 메모리 상에 연속으로 위치함.
동일한 자료형을 많이 담을 때 주로 사용한다. 변수가 많아지면 하나하나 모두 선언하기 힘든데, 이 때 배열을 사용하면
같은 자료형의 데이터를 보다 쉽게 선언 할 수 있다.
자료형 배열명[배열크기] = {초기화 값};
으로 선언하면 된다. 물론 초기화 값은 생략하고 나중에 초기화 해줘도 된다.
#include <stdio.h>
int main(void)
{
// 배열
// 여러 개의 변수를 함께 동시에 생성
int subway_array[3]; // [0] [1] [2]
subway_array[0] = 30;
subway_array[1] = 40;
subway_array[2] = 50;
for (int i = 0; i < 3; i++)
{
printf("지하철 %d호차에 %d 명이 타고 있습니다.\n", i + 1, subway_array[i]);
}
// 값 설정 방법
// 값은 초기화를 반드시 해야함
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]);
}
// int size = 10
// int arr2[size];
// 배열 크기는 항상 상수로 선언해야함
// 크기는 10인데 하나라도 선언을 해두면 나머지 값들은 0으로 들어감
int arr3[10] = { 1,2 };
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr3[i]);
}
int arr4[] = { 1,2 }; // 이렇게 하면 배열 크기를 자동으로 2로 맞춰줌
// int 말고 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;
}
위의 코드를 보면 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]);
}
이렇게 arr[i] 처럼 대괄호 안에 변수를 넣어줄 수도 있지만, 배열을 선언할 때는 상수로 선언해야한다.
int arr3[10] = { 1,2 }; 을 보면 크기는 10인데 값은 두개밖에 없다. 이런경우에는 arr3[0] = 1, arr3[1] = 2가 되고 나머지값들은 모두 0이 들어간다.
int arr4[] = {1, 2}; 를 보면 배열의 크기가 선언되어있지 않다. 이런 경우에는 배열의 크기를 2로 맞춰진다.
int arr_f[5] = { 1.0f, 2.0f, 3.0f }; 를 보면 float형도 가능하다.
#include <stdio.h>
int main(void)
{
char c = 'A';
printf("%c\n", c);
char str[6] = "coding"; // [c][o][d][i][n][g] 6개의 공간 생기고 한개씩 들어감
printf("%s\n", str); // 이렇게 하면 뒤에 이상한 한자같은거 나옴
// 문자열 끝에는 '끝'을 의미하는 NULL '\0' 문자가 반드시 포함되어야 함
char str2[7] = "coding"; // [c][o][d][i][n][g][\0]
printf("%s\n", str2);
char str3[] = "coding";
printf("%s\n", str3);
printf("%d\n", sizeof(str3));
for (int i = 0; i < sizeof(str3); i++)
{
printf("%c\n", str3[i]);
}
char kor[] = "나도코딩";
printf("%s\n", kor);
printf("%d\n", sizeof(kor));
// 영어 1글자 : 1byte (배열 1칸)
// 한글 1글자 : 2byte (배열 2칸)
// char 크기 : 1byte
char c_array[7] = { 'c', 'o', 'd','i','n','g','\0' };
printf("%s\n", c_array);
char str4[10] = { 'c', 'o', 'd','i','n','g','\0' };
for (int i = 0; i < sizeof(str4); i++)
{
printf("%c\n", str4[i]);
}
// 배열 크기는 10인데 7개만 채우면 나머지 3칸은 \0(빈칸)으로 들어감.
char str5[10] = { 'c', 'o', 'd','i','n','g','\0' };
for (int i = 0; i < sizeof(str5); i++)
{
printf("%d\n", str5[i]);
} // %s가 아니라 %d로 들어가면 문자의 ASCII코드 숫자가 나옴
return 0;
}
문자 또는 문자열을 쓸 때는 자료형을 char를 써야하는데 변수 하나에는 1바이트만 저장할 수 있어서 알파벳이나 숫자 등 하나만 저장 가능하고 한글은 저장할 수 없다.
한글을 쓰기 위해서는 문자열을 써야하는데 한글은 2비트로, 배열의 크기는 최소 한글 글자수 * 2 + 1 만큼 필요하다. +1 은 배열의 제일 마지막에 \0을 넣어줘야하기 때문이다.
위의 예 중
char kor[] = "나도코딩";
printf("%s\n", kor);
printf("%d\n", sizeof(kor));
이 코드의 실행결과를 보면 kor의 크기가 9인 것을 알 수 있다.
만약 \0이 들어갈 자리가 없어서 들어가지 않았다면 위의 예처럼 뒤에 쓰레기값(한자)가 같이 출력된다.
그리고 빈 자리는 \0이 들어가는데 \0은 NULL값이기 때문에 0이 출력되는 것이 아니라 아무것도 출력되지 않는다.
#include <stdio.h>
#include <time.h>
int main_5_2project(void)
{
printf("\n\n === 아빠는 대머리 게임 === \n\n");
srand(time(NULL));
int answer;
int treatment = rand() % 4; // 발모제 선택 (0-3)
int cntShowBottle = 0;
int prevcntShowBottle = 0; //앞 게임에 보여준 병 갯수
// 서로 보여주는 병 갯수를 다르게 해서, 정답률 높일려고 (처음에 2개 > 다음엔 3개)
// 3번의 기회 (3번의 발모제 투여 시도)
for (int i = 1; i <= 3; i++)
{
int bottle[4] = { 0, };
do {
cntShowBottle = rand() % 2 + 2; // 보여줄 병 갯수 2 ,3 개
} while (cntShowBottle == prevcntShowBottle);
prevcntShowBottle = cntShowBottle;
int isinclude = 0; // 보여줄 병 중에 발모제가 포함되었는지 여부 (1이면 포함)
printf(" > %d 번째 시도 : ", i);
// 보여줄 병 종류를 선택
for (int j = 0; j < cntShowBottle; j++)
{
int randBottle = rand() % 4;// 0-3
// 아직 선택되지 않은 병이면 선택 처리
if (bottle[randBottle] == 0)
{
bottle[randBottle] = 1;
if (randBottle == treatment)
{
isinclude = 1;
}
}
// 이미 선택된 병이면 중복이니까 다시 선택
else
{
j--;
}
}
// 사용자에게 문제 표시
for (int k = 0; k < 4; k++)
{
if (bottle[k] == 1)
{
printf("%d ", k + 1);
}
}
printf(" 물약을 머리에 바릅니다\n\n");
if (isinclude == 1)
{
printf(" >> 성공 ! 머리가 났어요 ! \n\n");
}
else
{
printf(" >> 실패 ! 머리가 나지 않았어요 ㅠ\n\n");
}
printf("\n ... 계속 하려면 아무키나 누르세요...");
getchar();
}
printf("\n\n 발모제는 몇 번일까요? ");
scanf_s("%d", &answer);
if (answer == treatment+1)
{
printf("\n >> 정답입니다 !\n");
}
else
{
printf("\n >> 땡 ! 틀렸어요. 정답은 %d 입니다. \n",treatment+1);
}
return 0;
}
간단한 프로젝트다.
아빠는 대머리게임이고, 발모제 4개 중 매번 다른 갯수와 다른 발모제를 랜덤으로 뽑아서 발랐을 때 머리가 나는지 안 나는지를 보고 몇번 발모제가 진짜 발모제인 지 맞추는 게임이다.
'c언어 기초' 카테고리의 다른 글
c언어 pointer, 포인터, swap - 나도코딩 (0) | 2022.05.30 |
---|---|
c언어 포인터 pointer - 나도코딩 (0) | 2022.05.30 |
c언어 함수 function - 나도코딩 (0) | 2022.05.29 |
c언어 loop, 반복문, 이중반복문, for,while, do while - 나도코딩 (0) | 2022.05.29 |
c언어 조건문 if else break continue switch~case rand 랜덤- 나도코딩 (0) | 2022.05.29 |