2022. 5. 4. 16:08ㆍ카테고리 없음
3월에 배운 내용을 요약하는 글입니다
//===========================================================================
// 함수의 선언, 호출 및 정의와 매개변수로 주소를 전달하는 방식
#include <stdio.h>
void sort_asc(int *a, int *b);
int main() {
int a = 7, b = 5;
sort_asc(&a, &b); // 매개변수로 주소를 전달
printf("%d < %d \n", a, b);
return 0;
}
void sort_asc(int* a, int* b) { // 포인터 매개변수로 주소를 전달받아 스왑알고리즘 실행
if (*a > *b) {
int temp = *a;
*a = *b;
*b = temp;
}
}
// 정수형 매개변수로 그냥 넘겨주게 되면 메인함수에 있는 값을 그냥 복사해서 함수로 넘겨주게 된다
// 포인터형이 아닌 일반 정수형으로 넘기면 함수에서 리턴값을 주지 않았기 때문에
// 스왑알고리즘으로 실행된 if문은 그냥 함수정의부 내에서
// 지역변수로서 사라지게 되고 기존에 있던 메인함수의 a = 7, b = 5는 그냥 남아있게 된다
// 그 결과로 일반 정수로 넘어간 매개변수의 경우는 스왑알고리즘이 무시되고 포인터형 변수로 넘어간 경우는
// 제대로 if문에 따라 스왑이 진행된다
//===========================================================================
int* pi = 10000;
char* pc = 10000;
double* pd = 10000;
// 해당 자료형의 바이트 크기만큼 증가해버림
printf("pi의 값 %d\n", pi); pi의 값 10000
printf("pc의 값 %d\n", pc); pc의 값 10000
printf("pd의 값 %d\n\n", pd); pd의 값 10000
printf("pi의 값 %d\n", pi+2); pi의 값 10008
printf("pc의 값 %d\n", pc+2); pc의 값 10002
printf("pd의 값 %d\n\n", pd+2); pd의 값 10016
pi++;
pc++;
pd++;
printf("pi의 값 %d\n", pi); pi의 값 10004
printf("pc의 값 %d\n", pc); pc의 값 10001
printf("pd의 값 %d\n\n", pd); pd의 값 10008
printf("pi의 값 %d\n", pi+2); pi의 값 10012
printf("pc의 값 %d\n", pc+2); pc의 값 10003
printf("pd의 값 %d\n", pd+2); pd의 값 10024
int i = 10;
int* pi = &i;
int v = 0;
printf("i = %d *pi = %d v = %d pi = %d\n", i, *pi, v, pi);
v = (*pi)++; // 값을 가져와서 값 증가
printf("i = %d *pi = %d v = %d pi = %d\n", i, *pi, v, pi);
v = *pi++; // 주소 증가(바이트 크기만큼)
printf("i = %d *pi = %d v = %d pi = %d\n", i, *pi, v, pi);
}
//===========================================================================
// 배열의 선언과 초기화
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10
int main() {
int i;
// 1. 직접적인 배열의 접근방식
int s[SIZE];
s[0] = 10;
s[1] = 20;
s[2] = 30;
for (i = 0; i < SIZE; i++) {
printf("s[%d] = %d \n", i, s[i]);
}
// 2. 배열선언과 동시에 할당하는 방식
int t[SIZE] = { 1,2 }; // 할당되지 않을 경우 0 배치
for (i = 0; i < SIZE; i++) {
printf("t[%d] = %d \n", i, t[i]);
}
// 3. srand()함수를 이용하는 방식
srand((unsigned)time(NULL));
int ss[ SIZE ];
for (i = 0; i < SIZE; i++) {
ss[i] = (rand() % 100) + 1;
printf("ss[%d] = %d\n", i, ss[i]);
}
// 4. 입력하여 배열값을 할당하는 방식
int jumsu[SIZE];
printf("3개의 수 입력\n");
for (i = 0; i < SIZE; i++) {
scanf_s("%d", &jumsu[i]);
}
for (i = 0; i < SIZE; i++) {
printf("jumsu[%d] = %d\n", i, jumsu[i]);
}
// 배열 안의 최솟값과 최댓값
int price[SIZE] = { 0 };
int i, min = 0, max = 0;
srand((unsigned)time(NULL));
for (i = 0; i < SIZE; i++) {
price[i] = (rand() % 100) + 1; // 난수로 초기화
printf("%-3d", price[i]);
}
printf("\n==============================\n");
min = price[0];
max = price[0];
for (i = 0; i < SIZE; i++) {
if (price[i] < min) {
min = price[i]; // 최솟값으로 지정한 min보다 각 배열의 값이 작으면 그 배열의 값을 min에 할당
}
}
printf("배열 안의 최솟값 = %d\n", min);
printf("==============================\n");
for (i = 0; i < SIZE; i++) {
if (price[i] > max) {
max = price[i]; // 최댓값으로 지정한 max보다 각 배열의 값이 크면 그 배열의 값을 max에 할당
}
}
printf("배열 안의 최댓값 = %d", max);
//===========================================================================
// 배열 정렬
#include <stdio.h>
#define SIZE 6
void main() {
int list[SIZE] = { 5,3,8,1,2,7 };
int i, j, temp, least;
printf("원본배열\n");
for (i = 0; i < SIZE; i++) {
printf("%d ", list[i]);
}
printf("\n");
for (i = 0; i < SIZE; i++) {
least = i;
for (j = i + 1; j < SIZE; j++) {
if (list[j] < list[least]) {
least = j;
}
}
temp = list[i];
list[i] = list[least];
list[least] = temp;
}
printf("정렬된 배열\n");
for (i = 0; i < SIZE; i++) {
printf("%d ", list[i]);
}
printf("\n");
}
//===========================================================================
// 배열 탐색
#include <stdio.h>
#define SIZE 16
int binary(int list[], int n, int key);
void main() {
// 이진탐색
int key, i;
int list[SIZE] = { 2,6,11,13,18,20,22,27,29,30,34,38,41,42,45,47 };
printf("탐색할 값을 입력: ");
scanf_s("%d", &key);
printf("탐색결과 = %d\n", binary(list, SIZE, key));
// 선택탐색
for (i = 0; i < SIZE; i++) {
if (list[i] == key) {
printf("탐색성공인덱스 = %d\n", i);
}
}
printf("탐색종료\n");
}
int binary(int list[], int n, int key) // 이진탐색용 함수 ( 탐색할 배열, 배열 사이즈, 찾고싶은 키값 )
{
int low, high, middle;
low = 0; // 배열의 0값( 배열 시작 )
high = n - 1; // 배열 최대사이즈의 -1( 배열 마지막 )
while (low <= high) {
printf("[%d %d]\n", low, high);
middle = (low + high) / 2; // 배열 중간값
if (key == list[middle]) {
return middle; // 찾고싶은 값이 middle에 해당하면 middle 그대로 반환
}
else if (key > list[middle]) {
low = middle + 1; // 찾고싶은 값이 middle보다 작으면 middle값의 주소에서 한칸 앞으로 가서 탐색
}
else {
high = middle - 1; // 찾고싶은 값이 middle보다 크면 middle값의 주소에서 한칸 뒤로 가서 탐색
} // if
} //while
}
//===========================================================================
static (정적 변수)
#include <stdio.h>
void func(void);
void main() {
printf("함수의 실행횟수 \t 함수의 변수값\n\n\n");
func();
func();
func();
}
void func(void) {
static int cntRunFunc = 0; // 함수의 실행횟수를 저장하는 곳
static int cntLocal = 0; // 함수의 변수값을 저장하는 곳
printf("%10d \t", ++cntRunFunc); // static 입력 시 1, 2, 3회 정상적으로 지역변수가 사라지지 않고 저장됨
printf("%15d \n", ++cntLocal); // static 해제 시 1, 1, 1회로 함수 탈출 시 지역변수가 저장되지 않고 사라짐
}
//===========================================================================
// string
#include <stdio.h>
void main() {
int i = 0;
char str[5]; // string을 표현할 때 char 자료형의 배열로 한글자씩 넣게 됨
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = '\0';
str[4] = 'd';
while (str[i] != '\0') {
printf("%c", str[i]);
i++;
}
printf("\n%s", str);
char str1[4] = "abcdefg"; //에러
printf("\n%s", str1);
char str1[6] = "seoul"; //5자 + 널문자 // 반드시 마지막엔 null문자가 포함되도록 배열 마지막 한칸을 비움
char str2[3] = { 'i', 's', '\0' };
char str3[] = "the city of korea"; // 배열의 크기를 지정하지 않아도 컴파일러가 알아서 지정함
printf("%s %s %s\n", str1, str2, str3);
char str[30] = "C language is easy"; // 배열의 크기를 지정할 땐 넉넉하게 / 문자열 길이
int i = 0;
while (str[i] != 0) {
i++;
}
printf("총 문자열 %s의 길이는 %d입니다.\n", str, i);
int ch;
while ((ch = getchar()) != EOF) { // EOF(-1, End Of File)이 아닐 때까지 ctrl + z 입력 시 EOF출력
putchar(ch); // 문자 출력 함수
}
int ch;
while ((ch = _getch()) != 'q') {
_putch(ch);
}
char name[100];
char address[100];
printf("이름을 입력하세요: ");
gets(name); // 문자열 입력 함수
printf("주소를 입력하세요: ");
gets(address); // 문자열 입력 함수
puts(name); // 문자열 출력 함수
puts(address);
int i = 0, count = 0;
while (name[i] != NULL) {
i++;
count++;
}
printf("입력한 이름의 길이는 %d\n", count);
}
//===========================================================================
// string
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define WORDS 5
void main() {
char s1[30];
char s2[30];
int result;
printf("s1: ");
scanf("%s", s1); // 문자 또는 문자열 입력
printf("s2: ");
scanf("%s", s2);
result = strcmp(s1, s2); // 문자를 비교해 사전상 s1이 앞에 있으면 -1 반환, s2가 앞에 있으면 1반환 같으면 0반환
if (result == 0) {
printf("같은 글자입니다\n");
}
else if (result < 0) {
printf("%s가 %s보다 앞에 있습니다\n", s1, s2);
}
else {
printf("%s가 %s보다 뒤에 있습니다\n", s1, s2);
}
*/
/*
int i;
char fruits[3][30];
for (i = 0; i < 3; i++) {
printf("과일 이름 입력: ");
scanf("%s", fruits[i]);
}
for (i = 0; i < 3; i++) {
printf("%d번째 과일: %s\n", i + 1, fruits[i]);
}
*/
/*
int i;
char dic[WORDS][2][20] = { // 문자열 배열
{"book", "책"},
{"boy", "소년"},
{"computer", "컴퓨터"},
{"language", "언어"},
{"rain", "비"}
};
char word[30];
printf("찾는 단어 입력: ");
scanf("%s", word);
for (i = 0; i < WORDS; i++) {
if (strcmp(dic[i][0], word) == 0) {
printf("%s:%s\n", word, dic[i][1]);
}
}
//===========================================================================
// struct ( 구조체 또는 오브젝트 )
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>
struct student { // struct 선언 ( 데이터가 들어갈 공간 )
int number;
char name[10];
};
void main() {
struct student s, t; //변수 // struct 선언 후 변수를 할당해 각각의 데이터를 넣을 수 있다
s.number = 20190001; // student.s는 s변수의 학생 데이터
strcpy(s.name, "kim");
printf("s.number:%d s.name:%s\n", s.number, s.name);
printf("학생 학번 입력: "); // student.t는 t변수의 학생 데이터
scanf_s("%d", &t.number);
printf("학생 이름 입력: ");
scanf_s("%s", &t.name, 4);
printf("t.number: %d t.name: %s\n", t.number, t.name);
}
//===========================================================================
// 열거형과 공용체
#include <stdio.h>
enum days {SUN, MON, THE, WED, THU, FRI, SAT}; // 열거형
char* dayname[] = { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" };
union example { // 공용체
int i;
char c;
};
union ipaddress {
unsigned long laddr;
unsigned char saddr[4];
};
void main() {
union ipaddress addr;
addr.saddr[0] = 1;
addr.saddr[1] = 0;
addr.saddr[2] = 0;
addr.saddr[3] = 127;
printf("%x\n", addr.laddr);
for (int i = 0; i < 4; i++) {
printf("출력: %d \n", addr.saddr[i]);
}
union example v;
v.c = 'A';
printf("v.c = %c, v.i = %d\n", v.c, v.i);
v.i = 10000;
printf("v.c = %c, v.i = %d\n", v.c, v.i);
enum days d;
d = WED;
printf("%d번째 요일은 %s입니다\n", d, dayname[d]);
// 열거형의 WED를 넣더라도 int형으로 출력시 배열의 순서에 해당하는 숫자가 나온다.
}
//===========================================================================