본문 바로가기

2학년 2학기/c언어56

11-5장 const struct const를 구조체에 사용하는 이유데이터 보호, 가독성, 최적화, 메모리 절약 등 여러 면에서 유용특히 큰 데이터 구조를 전달할 때는 const 포인터가 복사 비용을 줄여 주므로, 메모리 절약 측면에서 유리할 수 있다. 따라서, 값에 의한 호출과 동일한 효과를 내지만 포인터와 const를 사용하는 이유는 값에 의한 호출로 큰 데이터 구조를 전달하면 많은 메모리를 잡아 먹기 때문에 const와 포인터를 사용해서 주소를 전달하지만 원본의 값은 변경하지 못하게 하는 효과를 낼 수 있다. 이렇게 하면 메모리를 절약할 수 있다.  [const struct 사용 예시]#include #include struct student { int number; char name[10]; double grade.. 2024. 11. 11.
11-4장 구조체와 함수 구조체와 함수구조체를 함수의 인자나 값으로 사용할 수 있는데, 이때는 "값에 의한 호출"이 원칙이다.   [값에 의한 호출 예시]#include #include int equal(struct student s1, struct student s2){ if (strcmp(s1.name, s2.name) == 0) return 1; else return 0;}struct student { int number; char name[10]; double grade;};int main(){ struct student s1 = { 25, "Mun", 3.92 }; struct student s2 = { 26, "KiM", 3.76 }; printf("%d".. 2024. 11. 11.
11-3장 구조체 배열 구조체 배열: 여러개의 구조체를 하나의 구조체로 만들 수 있다. 배열이기 때문에 인덱싱이 가능하다.struct student { int number; char name[20]; double grade;};int main(){ struct student list[100];// 구조체 배열 선언}   구조체 배열의 초기화2차원 배열처럼 선언하면 구조체 배열을 초기화 할 수 있다. struct student { int number; char name[10]; double grade;};int main(){ struct student list[3] = { { 25, "Mun", 3.92 }, { 24, "Kim".. 2024. 11. 11.
11-2장 구조체 변수의 대입과 비교 구조체 변수의 대입(=)은 가능하다!#include struct point { int x; int y;};int main() { struct point p1 = { 10, 20 }; struct point p2 = { 30, 40 }; P1 = P2;}  구조체 변수의 비교(==)는 불가능하다! #include struct point { int x; int y;};int main() { struct point p1 = { 10, 20 }; struct point p2 = { 30, 40 }; if (p1 == p2) // 컴파일 오류 { printf("p1와 p2이 같습니다."); }}  다만, 멤버끼리 비교를 통해서 결과를 도.. 2024. 11. 11.
11-1장 구조체 구조체의 선언 struct student { //구조체 정의 int number; char name[10]; double grade;};int main(void){ struct student s1; //구조체 변수 선언}   구조체의 초기화struct student { int number; char name[10]; double grade;};int main(){ struct student s1 = { 24, "Kim", 4.3 }; // (1) 구조체 기본 초기화 struct student s2 = s1; // (2) 이미 초기호된 구조체를 할당받아서 초기화}   구조체 멤버 참조위의 방식처럼 한번에 초기화하는 방법도 있지만 메모 참조(.)를 이용해서 초기화하는 것.. 2024. 11. 11.
10-7장 문자(열) 처리 라이브러리(암기는 필요 없으나, 뭐하는 함수인지는 알아야함) 문자 처리 라이브러리 함수  #include ctype.h>함수설명isalpha(c)c가 영문자인가?(a-z, A-Z)isupper(c)c가 대문자인가?(A-Z)islower(c)c가 소문자인가?(a-z)isdigit(c)c가 숫자인가?(0-9)isalnum(c)c가 영문자이나 숫자인가?(a-z, A-Z, 0-9)isxdigit(c)c가 16진수의 숫자인가?(0-9, A-F, a-f)isspace(c)c가 공백문자인가?(‘ ’, ‘\n', '\t', '\v', '\r')ispunct(c)c가 구두점 문자인가?isprint(c)C가 출력가능한 문자인가?iscntrl(c)c가 제어 문자인가?isascii(c)c가 아스키 코드인가?toupper(c)c를 대문자로 바꾼다.tolower(c)c를 소문자로 바꾼다... 2024. 11. 5.
10-6장 문자열의 배열 문자열의 배열을 이용해서 각 문자열의 문자들은 행이 되고, 문자열 들의 개수는 열이된다. char 문자열 명[문자열 개수][문자열 중 최대 문자의 길이 + 1] = { "" , "" , "", ... }char s[3][6] = { "init", "open", "close"};    반복문을 통해서 문자열의 배열(2차원 배열) 출력하기#include int main() { int i, j; char menu[5][10] = { "init", "open", "close", "read", "write" }; for (i = 0; i    이렇게 각 행의 길이를 매번 최대 길이 + 1을 계산해서 정해주기란 불편하다. 따라서 C에서는 각 행의 길.. 2024. 11. 5.
10-5장 문자열과 포인터 문자열 배열에 문자열  char s[] = "HelloWorld";//요소 변경 가능 Os[1] = 'E'; // HElloWorld//할당 연산자 사용 불가능 Xs = "HelloWorld_2"; //오류 위의 코드처럼 요소는 변경 가능하지만 할당 연산자로 문자열 자체를 변경하는 건 안된다.  포인터에 문자열: 문장이 변하지 않음이 보장되는 경우에 사용한다.  char* p = "HelloWorld";//할당 연산자 사용 가능 Op = "HelloWorld_2"; // HelloWorld_2//요소 변경 불가능 Xp[1] = 'E'; //오류위의 코드처럼 할당 연산자로 문자열이 가리키는 주소의 값(즉, 문자열 자체)은 변경할 수 있지만, 문자를 변경하는건 안된다. 2024. 11. 5.
10-4장 문자열을 수치로 변환 atoi(문자열): 특정 숫자 형태의 문자열을 정수로 변경해주는 것  sscanf(문자열, "%d", 정수형 변수) ⭐️⭐️⭐️: 특정 숫자 형태의 문자열을 정수형 변수에 저장해주는것  sprintf(문자열 변수, "%d", 정수) ⭐️⭐️⭐️: 특정 숫자를 문자열 변수에 저장해주는 것  #include #include int main(){ char s[] = "100"; char t[100] = ""; int i; printf("%d\n", atoi("100")); sscanf(s, "%d", &i); //문자열을 정수로 변경해서 저장 sprintf(t, "%d", 102); //정수를 문자열로 변경해서 저장 printf("i: %d\n", i); //i: 100 .. 2024. 11. 4.
10-3장 문자열 처리 라이브러리 strlen(s): 문자열의 길이#include #include int main(){ char s[] = "abcdefgh"; int len = strlen(s); printf("문자열 %s의 길이 = %d", s, len); //문자열 abcdefgh의 길이 = 8} strcpy(s1, s2): 문자열을 복사#include #include int main(){ char src[] = "Hello"; char dst[6]; strcpy(dst, src); printf("복사된 문자열 = %s", dst); //복사된 문자열 = Hello}  strcat(s1, s2): 문자열을 연결#include #include int main(){ char s[11.. 2024. 11. 4.
10-2장 문자 입출력과 문자열 입출력 1. 문자 입출력[getchar()와 getch()]getchar(): 입력된 문자들이 buffer에 쌓이다가, enter 키가 입력되면 buffer에 저장되어 있던 문자들이 선입선출형식으로 하나씩 출력된다. getch(): 입력된 문자들이 바로바로 출력된다.  [putchar()와 putch()]putchar(): 출력 버퍼를 사용하여 여러 문자를 모았다가 한번에 문자들을 출력한다.putch(): 버퍼 없이 바로바로 출력한다.    2. 문자열 입출력[scanf()와 gets_s()]scanf(): 문자열을 읽어서 배열 s[]에 저장한다. 단! space, tab, newline과 같은 입력을 구분하는 문자들은 입력되지 않는다.gets(문자열, 문자열 길이): 문자열을 읽어서 배열 s[]에 저장한다. .. 2024. 11. 4.
10-1장 문자열과 NULL 문자 1. 문자열 표현 방법#includeint main(){ char str[6] = "Hello"; //동일한 기능 - char str[6] = {'H', 'e', 'l', 'l', 'o'};}   각 배열은 문자가 각각 입력되지만 아스키 코드로도 확인할 수 있다.#includeint main(){ char str[6] = "Hello"; printf("%c", str[0]); // 'H' printf("%d", str[0]); // 72}  2. NULL 문자: 문자열이 끝나기 전에 반드시 NULL 문자(\0)라는 특수한 값으로 끝나야한다. 문자열의 크기가 5개라도 NULL문자를 생각해서 크기를 6개로 설정해야한다.  char str[6] = "Hello";  ❓ 왜 N.. 2024. 11. 4.
9-7장 이중 포인터 이중 포인터: 포인터를 가르키는 포인터이다. 즉, 주소를 갖고 있는 메모리의 주소를 갖고있는 메모리를 의미한다.  #includeint main(){ int a = 3; int* p = &a; int** pp = &p; printf("%d\n", *p); //3 printf("%d\n", **pp); //3 } 이처럼 pp가 이중 포인터이다. a의 주소를 담고 있는 p의 주소를 담고 있는 pp이다. 따라서, 간접 참조 연산자를 2개 써줘야하는데, **pp는 pp의 값을 접근하고, 다시 그 값은 주소이니깐 그 주소의 값을 접근하는 형태이다.  [예제]#includeint globlal_value = 30;void call_by_value(int* val){ //매개변수가 포.. 2024. 10. 29.
9-6장 함수 포인터 함수 포인터: 함수 포인터란, 함수를 가르키는 포인터이다. 즉 함수의 주소를 가질 수 있다. [형식]반환형 (* 함수 포인터 이름)(매개 변수1, 매개 변수2, ...);//예시int (*pf)(int, int); 함수 포인터는 따로 body가 필요하지 않다.또한 배열처럼 함수 이름 자체가 주소이기 때문에 주소 연산(&)는 필요하지 않다.  [예시 - 1]#includevoid A(){ printf("A입니다.");}void B(){ printf("B입니다.");}void C(){ printf("C입니다.");}int main(){ int x = 0; void(*p)(); printf("함수 명을 선택하시오. (A: 0, B: 1, C: 0): "); scanf("%.. 2024. 10. 29.
9-5장 함수가 포인터를 반환하는 경우 함수가 포인터를 반환하는 경우: 함수 종료시에도 남아 있는 변수의 주소를 반환해야한다. 만일 지역 변수의 주소를 반환한다면 함수가 종료되면 소멸되므로, 오류가 발생할 수 있다. [지역 변수]#include//결과를 result 저장하고 그 주소를 반환int* add(int x, int y){ int result; result = x + y; return &result;}int main(){ int* p = add(3, 4); printf("%d", *p); //오류 발생}  [전역 변수]#include//결과를 result 저장하고 그 주소를 반환int result;int* add(int x, int y){ result = x + y; return &result;}i.. 2024. 10. 29.
9-4장 배열과 포인터 배열의 이름이 바로 포인터이다. 즉, 배열은 따로 주소가 없이 배열 이름자체가 주소이다.   #includeint main(){ int a[] = {10, 20, 30, 40, 50}; printf("배열의 이름 = %u\n", a); // 배열의 이름 = 1868132144 printf("첫 번째 원소의 주소 = %u\n", &a[0]); // 첫 번째 원소의 주소 = 1868132144}   따라서, 포인터도 배열처럼 사용할 수 있다. #includeint main(){ int a[] = {10, 20, 30, 40, 50}; int *p; p=a; printf("a의 첫 번째 원소 = %u\n", a[0]); // 10 printf("p의 첫.. 2024. 10. 28.
9-3장 포인터와 함수 함수 호출 시 인수 전달 방법1. 값에 의한 호출: 인수의 값이 매개 변수로 복사된다. 따라서 함수가 종료되면 매개 변수의 값은 사라진다. 즉, 실제 인자들의 값은 유지됨. 2. 참조에 의한 호출: 인수의 주소가 매개 변수로 복사된다. 따라서 함수에서 인자로 받은 주소를 이용해서 값을 변경하면 실제 인자들의 변수 값도 변경된다. 포인터 사용시 주의할 점🚨 초기화가 안된 포인터를 사용하면 안된다.🚨 초기화 되지 않은 포인터 변수에 값을 넣으면 그 포인터가 어느 곳에 있는지 모르기 때문에 해당 포인터가 프로그램에서 중요한 연산에 있는 메모리를 할당하고 있는 상황에서 값을 넣으면 프로그램이 망가질 수 있기 때문에 주의해야한다. 🚨 포인터가 아무것도 가리키고 있지 않은 경우에는 NULL로 초기화해야 한다.🚨 예.. 2024. 10. 28.
9-2장 포인터의 연산 포인터연산에는 증가(++), 감소(--), 덧셈(+), 뺄셈(-) 연산이 있다. 증감 연산의 경우 포인터가 가르키는 객체의 크기가 1의 의미를 가지게 된다.   int x = 10; int *p = &x; //1000++p; //1000 + sizeof(int) = 1004    포인터의 증감 연산    간접 참조 연산자와 증감 연산자 2024. 10. 28.
9-1장 포인터란? ❓포인터란?: 주소 그 자체이다. 즉, 메모리의 주소이다. ❓포인터 변수란?: 메모리의 주소를 가지고 있는 변수를 의미한다.  메모리: 변수가 저장되는 공간을 의미한다. 메모리는 byte 단위로 접근할 수 있다.  메모리에는 데이터 영역, Heap 영역, Stack영역이 있다.   데이터 영역: 전역 변수 및 static 변수가 할당되는 영역 (프로그램의 시작 시 할당되어 종료 시 소멸된다.) Heap영역: 프로그래머가 할당하는 영역(프로그래머가 명시적으로 할당하고 소멸시킨다.)  Stack 영역: 함수 호출 시 생성되는 지역 변수 및 매개 변수가 저장되는 영역( 함수 호출이 완료되면 소멸된다.)     자료형 별 메모리에 저장되는 형식int main(void){ int i = 10; char.. 2024. 10. 28.
8장 함수 1. 함수의 정의    2. 지역변수와 전역변수: 함수 안에서 정의되는 변수는 지역 변수라고 부르고, 해당 함수 안에서 만 사용이 가능하다. 반면에 함수의 외부에서 선언되는 변수는 전역 변수라고 불린다. 함수의 매개변수는 지역 변수일까?맞다! 다만 초기값은 인자로 받는 다는 점에서만 다르고 나머지는 지역 변수의 특징과 같다.  지역 변수전역 변수기본 초기값쓰레기 값0동시에 존재할 경우{ } 내부에서는 지역 변수가 우선이다. { } 외부에서는 전역 변수가 우선이다.   3. 정적 지역 변수: 블록에서만 사용되지만 블록을 벗어나도 자동으로 삭제되지 않는 변수 / 앞에 static을 붙인다. : 함수가 여러번 선언되어도 새로 초기화하지 않고 호출된 이후 연산된 값을 유지한다. : 정적 지역변수는 함수내부에서만.. 2024. 10. 25.
7장 배열 1. 중간 점검 퀴즈(1)Quiz 1) n개의 요소를 가지는 배열의 경우, 첫 번째 요소의 번호는 무엇인가?: 0 Quiz 2) n개의 요소를 가지는 배열의 경우, 마지막 요소의 번호는 무엇인가?: n - 1 Quiz 3) 범위를 벗어나는 인덱스를 사용하면 어떻게 되는가? 즉, int a[10];과 같이 선언된 배열이 있는 경우, a[10]에 6을 대입하면 어떻게 되는가?: 배열 인덱스 범위 초과 오류가 생긴다.   2. 중간 점검 퀴즈(2)Quiz 1) 배열 a[6]의 요소를 1, 2, 3, 4, 5, 6으로 초기화int a[6] = {1, 2, 3, 4, 5, 6};  Quiz 2) 배열의 초기화에서 초기값이 배열 요소의 개수보다 적은 경우: 배열 요소보다 초기화 값이 적으면 나머지 요소는 0으로 초.. 2024. 10. 25.
6장 1. 종이접기#include #include #include int main(){ double height = 0.001; int count = 0; while(height   2. 디지털 시계#include #include #include int main() { int hour, min ,sec; hour = min = sec = 0; while(1){ system("cls"); printf("%02d: %02d: %02d", hour, min, sec); sec++; if(sec == 60) { min++; sec = 0; } if(min == 60) { .. 2024. 10. 25.
5장 조건문 1. 논리 연산자연산의미x && yx와 y가 모두 참이면 참, 그렇지 않으면 거짓x || yx나 y중에서 하나만 참이면 참, 모두 거짓이면 거짓!xx가 참이면 거짓, x가 거짓이면 참 중요한 것!C언어에서는 0을 제외한 나머지 값은 모두 참으로 간주한다. 따라서, -1도 참이 되고, 100도 참이 된다.  2. 단축 연산자AND 연산자의 경우, 여러 개의 피연산자 중에서 처음 피연산자의 값이 거짓이면 다른 연산자들의 값은 계산되지 않는다.if((2>3)&&(++x (++x 3)이 거짓이기 때문에!  3. if문에서 주의할 점if (score >= 90) printf("합격!"); printf("장학금!"); 이렇게 하면 아래의 장학금 출력문은 아무런 조건 없이 출력된다.  if( x > 0).. 2024. 10. 24.
4장 수식과 연산자 1. 나눗셈 연산자정수형 / 정수형 == 정수형(소수점 이하의 값은 버려진다.)#include int main() { int a = 10; int b = 3; int result = a / b; // 정수끼리 나누기, 소수점 이하 값은 버려짐 printf("정수형 나눗셈: %d\n", result); // 출력: 3 return 0;} 실수형 / 실수형 == 실수형#include int main() { float a = 10.0; float b = 3.0; float result = a / b; // 실수끼리 나누기 printf("실수형 나눗셈: %.2f\n", result); // 출력: 3.33 return 0;}   2. 증감 연산.. 2024. 10. 23.
3장 변수와 자료형 1. 변수 1. 변수의 정의: 변수란, 프로그램에서 값들이 저장되는 공간을 변수라고 한다.  2. 변수의 선언: 변수는 반드시 사용하기 전에 미리 선언을 해야한다.자료형 변수이름 = 초기값;int num = 0;char alpha = 'a';  3. 변수의 명명법 ★★★알파벳 문자와 숫자, 밑줄 문자로 이루어진다.이름의 중간에 공백이 들어가면 안된다.첫 번째 문자는 반드시 알파벳 또는 밑줄 문자이어야한다. (숫자를 첫 번째 문자로 사용은 불가능) 대문자와 소문자를 구분하여 서로 다른 것으로 취급한다. 따라서, 변수 index와 Index, INDEX는 서로 다른 변수이다.C언어에서 사용하고 있는 키워드(예약어)와 똑같은 이름은 허용되지 않는다. 4. 변수의 초기화변수를 초기화시키지 않으면?☞ 변수가 어디.. 2024. 10. 23.
2장 기초사항 보호되어 있는 글 입니다. 2024. 10. 23.