본문 바로가기
교육관련/한화비전 VEDA 수강일지

[VEDA 1기 수강일지] 2일차 - C언어 기초 (2) : 함수, 배열, 포인터

by 김수효 2024. 7. 16.
수강한 개념

 

함수
- 가독성이 좋아짐
- 유지보수가 용이함
- 변수를 선언하듯 함수도 선언해야함
- 선언 > 정의 > 호출
- 헤더파일 -> 함수 선언부가 있음
- 함수선언은 헤더파일, 정의는 별도의 소스파일에, 메인은 메인대로 ->  습관들이기

재귀함수
- 잘못짜면 무한루프 엔딩

배열
- c에서는 배열의 크기가 정해져있어야한다
- 배열의 이름 = 배열의 시작주소 = 상수
- rank 알고리즘

문자배열
- scanf -> 공백문자를 구분자로 받음
- 표준입력 : gets( str ); puts( str ); -> 배열길이 넘어도 입력을 받음 (안전하지 않은 함수)
- 파일입력 : fgets( str, 80(크기지정), stdin(파일포인터) );
- strcpy (to(주소), from(주소)); 문자열 복사
- strcmp (배열1, 배열2) 문자열 내용 비교 : 리턴값 0 = 문자열 두개가 같다, -1 = 첫문자 값이 작다, 1= 첫문자 값이 크다
- strlen(배열1) 문자열의 길이 반환(널문자 카운트 x)
- strcat(배열1, 배열2) 문자열 합성
ㄴ 문자열들의 크기체크를 안하기때문에 개발자가 체크

포인터
- 포인터 앞 자료형 = 포인터가 가리키는 주소에 있는 값의 자료형
- 포인터는 8바이트 or 4바이트
char str[80];
char* pstr = str;
str++; <--- 안됨. str은 상수
- 포인터 변수는 반드시 초기화 필요

const 포인터
- const = 상수
- 주소변경은 가능, 내용을 직접 바꾸는 것은 불가능
- 함수 호출시 호출 되는 쪽에서 주소로 접근해서 내용물을 변경 할 수 있음 

다차원 배열
- 연속적으로 메모리에 접근하도록 행단위로 먼저 접근하는 것이 일반적
- 1401 다시 해보기

포인터 배열
- 개념 확실히 하기

 

문제 구현 / 개선방안

 

1. 포인터 - 메뉴 구현 / 성적처리

- 함수를 호출할때 포인터가 어떻게 전달되고 처리되는지 더 공부할 필요가 있음

- 하지만 결정적으로 못 푼 원인은 count 가산을 안했다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "score.h"

int main() {
	//do-while 입력/출력/검색 메뉴 프로그램

	int menuNo;
	int score[30];
	int stCount = 0; //학생수

	do {
		printf("\n----메뉴----\n");
		printf("1. 입력\n");
		printf("2. 출력\n");
		printf("3. 검색\n");
		printf("9. 종료\n");
		printf("선택 --->");

		scanf("%d", &menuNo);

		switch (menuNo) {
		case 1:
			printf("입력 선택하였습니다\n");
			//배열은 배열이름으로, 변수는 &붙여서 주소값을 넘긴다.
			//학생수를 변경해야 하기 때문에 포인터로 전달.
			scoreEnter(score, &stCount);			//성적 입력
			break;
		case 2:
			printf("출력 선택하였습니다\n");
			//학생수는 값만 전달하면 되기때문에 그냥 전달
			scorePrint(score, stCount);			//성적 출력
			break;
		case 3:
			printf("검색 선택하였습니다\n");
			scoreSearch(score, stCount);			//성적 검색 : 번호 기준
			break;
		case 9:

			break;
		default:
			printf("잘못 선택하였습니다\n");
			break;
		}

	} while (menuNo != 9);
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void scoreEnter(int * score, int* stCount)		//성적 입력
{
	while (*stCount < 30)
	{
		printf("점수 입력 : ");
		scanf("%d", &score[*stCount]);
		if (score[*stCount] == -1) break;
		(*stCount)++; //가산 연산을 하지 않아서 작동하지 않음. 아래도 마찬가지
	}
}

void scorePrint(int* score, int stCount)		//성적 출력
{
	for (int i = 0; i < stCount; i++) printf("%d번 : %d점\n", i+1, score[i]); 
}

void scoreSearch(int* score, int stCount)		//성적 검색 : 번호 기준
{
	int snum;
	printf("번호 입력 : ");
	scanf("%d", &snum);
	printf("%d번 : %d점\n", snum, score[snum-1]); 
}
#pragma once

void scoreEnter(int* score, int* stCount);
void scorePrint(int* score, int stCount);
void scoreSearch(int* score, int stCount);

 

2. 다차원 배열 - 문자열 비교

- 2차원 배열이라서 문자열 비교가 안되는건가 했는데 그냥 배열 타입을 char가 아닌 int로 했었다

- 하.......

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
	char names[30][10]; //배열 타입 잘 확인하기

	for (int i = 0; i < 30; i++) //입력
	{
		fgets(names[i], 10, stdin);
		names[i][strlen(names[i]) - 1] = '\0';

		printf("%s", names[i]); //확인용
	
		if (!strcmp(names[i], "end")) break; 
        //strncmp n개만큼 비교하기 ->이러면 앞에 end가 포함된 모든 단어가 해당됨
	}

	return 0;
}
기타 사항

 

- make, Cmake 알아보기
- 전역변수는 프로그램이 종료될때까지 메모리를 먹음 / 지역변수는 실행될때만 먹음

 


VEDA 바로가기 : www.vedacademy.co.kr

VEDA(한화비전 아카데미) 영상으로 확인하기 : https://url.kr/zy9afd

본 후기는 VEDA(한화비전 아카데미) 1기 학습 기록으로 작성되었습니다.

댓글