배열의 정의 및 선언
배열은 변수들이 늘어서 있는 구조로
배열의 선언은 int a[5]; <- 이런식으로 해주는데 a가 배열의 이름이고 [5]가 배열의 크기이다.
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>
int main() {
for (int i = 0; i < 5; i++) {
a[i] = i * 5;
}
for (int i = 0; i < 5; i++) {
printf("%d\n", a[i]);
}
}
|
cs |
간단하게 for문을 통해 배열을 완성해보았다.
배열의 선언 방법은 위의 예시 말고도 int arr[n]={ };의 형태도 있다.
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
int main() {
int arr[5] = { 3,1,4,1,5 };
for (int i = 0; i < 5; i++) {
printf("%d\n", arr[i]);
}
}
|
cs |
여기서 문제점은 배열의 크기가 가변적으로 변한다면 i<5 의 형태는 적합하지 못하다. 이때 쓰는 것이 sizeof() 이다.
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
int main() {
int arr[5] = { 3,1,4,1,5 };
for (int i = 0; i <sizeof(arr)/sizeof(int); i++) {
printf("%d\n", arr[i]);
}
}
|
cs |
int는 4바이트이기 때문에 arr의 크기는 4*5 이다. 이걸 4로 나눠주면 배열의 크기인 5가 나온다.
자바에서는 배열의 길이를 나타내주는게 arr.length인데 c언어에서는 sizeof(arr)을 사용한다.
배열에 입력받기
n이 정해진 수가 아니기 때문에 arr[n]을 하면 에러가 뜬다. 위의 사진과 같은 방식은 동적할당을 통해서만 처리해줄 수 있다. 동적할당을 모르는 상태에서는 어떻게 해야할까?
이럴때는 그냥 arr의 크기를 최대한 크게 잡아주면 된다.
arr의 크기를 1000으로 잡아준 다음 1000보다 작은 정수 n을 입력받아서 n개의 수를 배열에 넣어주면 된다.
배열의 활용 - 최대,최소값/짝수 값 구하기
배열을 활용해서 최대,최소값을 구해보겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <stdio.h>
int main() {
int n;
int arr[1000];
printf("입력할 숫자의 개수:");
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
scanf_s("%d", &arr[i]);
}
int max = arr[0];
for (int i = 0; i < n; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
printf("최대값은 %d\n",max);
int min = arr[0];
for (int i = 0; i < n; i++) {
if (min > arr[i]) {
min = arr[i];
}
}
printf("최솟값은 %d\n", min);
}
|
cs |
짝수의 개수를 구하려면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <stdio.h>
int main() {
int n;
int arr[1000];
printf("입력할 숫자의 개수:");
scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
scanf_s("%d", &arr[i]);
}
int cnt = 0;
for (int i = 0; i < n; i++) {
if (arr[i]%2==0) {
cnt++;
}
}
printf("짝수의 개수는 %d\n", cnt);
}
|
cs |
2차원 배열
정수형의 3행 4열의 배열을 만들려면
int arr[3][4]; <-- 이런식으로 선언해 주면 된다.
중괄호를 통해 3행 4열의 배열을 완성해 줄 수 있다.
2차원 배열은 이중 for문을 이용해 출력할 수 있다.
파스칼의 삼각형
파스칼의 삼각형은 확률과 통계 이항정리 시간에 배운 개념이다.
파스칼의 삼각형 공식을 이항계수를 통해 나타내면 nCr=n-1Cr-1+n-1Cr 이되는데
이 공식을 이용하여 코드로 구현해볼 것이다.
코드로 구현할 때는 파스칼의 삼각형을 왼쪽으로 밀어버릴건데
이런형태가 나온다.
예를 들어 p[2][1]=2 인데, 어떻게 2가 나왔는지 원리를 살펴보면
p[1][0]+p[1][1]이 더해져서 2가 나온 것이다.
이걸 일반화 시키면 p[i][j]=p[i-1][j-1]+p[i-1][j]가 된다
하지만 j(열)가 0일때나 i(행)==j(열) 일때는 1이 되기 때문에
if(j==0|| i==j){
p[i][j]=1;
}
로 설정해주면된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <stdio.h>
int main() {
/*
1
1 1
1 2 1
1 3 3 1
1 3 6 4 1
i행 j열 [i-1 j-1] + [i-1 j]
j==0|| j===i 이면 1
*/
int p[10][10];
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
p[i][j] = 1;
}
else {
p[i][j] = p[i - 1][j - 1] + p[i - 1][j];
}
printf("%d", p[i][j]);
}
printf("\n");
}
}
|
cs |
문자열
arr의 크기를 구하면 3이 나와야할 것 같은데 4가 나온다! 무슨일일까?!!
사실상 char arr[]={'a','b','c','\0'}이다. 그래서 크기가 4가 나오는 것이고, 여기서 '\0'은 문자열의 끝을 알리는 문자이다. 이걸 null문자라한다.
문자열을 입력받을 땐 &s 가 아니라 s만 넣어준다. (반드시 기억하기!)
참고로 c++에서는 배열형태도 문자열을 만드는게 아닌 string이라는 자료형이 있다.
#include<stdio.h>의 의미
stdio.h라는 파일이 있는데 이걸 포함시키겠다는 의미이다.
문자열을 쓸때도 #include<string.h>를 해줘야한다.
strlen
len값은 5인데, len2의 경우 scanf를 통해 똑같이 "Hello"를 입력받아준다 해도 문자열의 길이가 99일 것이다.
이런경우를 해결해주기 위해 string.h에 저장되어있는 함수인 strlen이 있다.
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
#include<string.h>
int main() {
char str[100] = "Hello";
int len = strlen(str);
printf("%d", len);
}
|
cs |
len의 값을 출력하면 5가 나온다.배열의 크기와 문자열의 크기가 다를 때, strlen을 사용해주면 문자열의 크기를 출력해줄 수 있다.
strcpy
cpy가 copy의 약자로, strcpy(사본,원본); 꼴로 나타낸다.
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>
#include<string.h>
int main() {
char str[] = "Hello";
char str2[100];
strcpy_s(str2,str);//copy의 약자 strcpy(사본,원본); 꼴
printf("str2의 값 %s\n", str2);
}
|
cs |
str값을 str2에 복붙해준다는 의미로 str2를 출력하면
strcat
문자열 뒤에 문자열을 덧붙여주는 함수이다.
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
#include<string.h>
int main() {
char str[100] = "Hello";
strcat_s(str, "World!");
printf("%s\n", str);
}
|
cs |
strcat만 하면 unsafe하다고 나와서 strcat_s로 해줬다.
strcat해주면 HelloWorld!라고 나온다.
strcmp
cmp는 compare를 의미하고, 두 문자열을 비교한다. 사전 순으로 누가 먼저 오는지도 알 수 있다.
int cmp=strcmp(str1,str2) 일 때
str1이 str2보다 사전순으로
앞에 있으면 -1반환
같으면 0 반환
뒤에 있으면 1반환
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>
#include<string.h>
int main() {
char str1[] = "sample";
char str2[] = "simple";
int cmp = strcmp(str1, str2);
printf("%d\n", cmp);
}
|
cs |
이경우는 str1이 str2보다 사전순으로 앞에 오므로 -1이 출력된다.
'C > 기초(두들낙서)' 카테고리의 다른 글
[C기초] 포인터와 배열 연습문제 (0) | 2022.01.08 |
---|---|
[C기초] 포인터 배열 (0) | 2022.01.04 |
[C 백준] 브론즈 3/ 세 수 (0) | 2022.01.02 |
[C기초] 배열 포인터 (0) | 2022.01.02 |
[C기초] 포인터 /포인터와 배열 (0) | 2022.01.02 |
댓글