C \ C++/C 스터디 예제 풀이

[세연교재] 2과 풀이

안정민 2023. 3. 18. 21:16

17. 학생 열 명의 국어, 영어, 수학 성적을 처리하여 다음과 같이 출력하는 프로그램을 작성하세요. (단, 배열을 사용해 학생들의 학번, 국어, 영어, 수학, 총점, 평균을 저장)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*
int sum(int korean, int english, int math);
int average(int korean, int english, int math);
*/

int main(void) {

	int grade[10][3]={
		{80,70,90},
		{30,50,40},
		{70,90,100},
		{100,100,100},
		{90,95,60},
		{75,45,75},
		{80,90,90},
		{10,20,30},
		{50,70,75},
		{100,90,40}
	};
	int korean, english, math;

	printf("  학번  국어  영어  수학  총점  평균  \n");
	printf("***************************************\n"); // 이거 정렬을 깔끔하게 어떻게 할까

	for (int i = 0; i < 10; i++) {
		korean = grade[i][0];
		english = grade[i][1];
		math = grade[i][2];

		int sum = korean + english + math;
		int average = (korean + english + math) / 3;

		printf("  %d   %d  %d  %d   %d   %d\n", i+1, korean, english, math, sum, average);
	}

}

/*
int sum(int korean, int english, int math) {
	return (korean + english + math);
}

int average(int korean, int english, int math) {
	return (korean + english + math) / 3;
}
*/

18. 정수형 1차원 배열을 {19, 2, 25, 92, 36, 45}로 초기화하고,다음을 수행하는 프로그램을 작성

-배열에 저장된 원소들을 화면에 출력

-배열 원소들 중에서 최솟값과 최댓값을 출력한다

-배열 원소들의 평균을 구하세요

-배열 원소들의 분산을 구하세요

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int arr[6] = { 19, 2, 25, 92, 36, 45 };

	// 1번 프로그램
	for (int i = 0; i < 6; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");

	//2번 프로그램
	int max = arr[1];
	int min = arr[1];

	for (int i = 1; i < 6; i++) {
		if (max < arr[i])
			max = arr[i];
		if (min > arr[i])
			min = arr[i];
	}
	printf(" 배열 내부의 최대값은 %d, 최소값은 %d\n", max, min); // 포인터 안 써도 되나?

	//3번 프로그램
	int sum=0;
	for (int i = 0; i < 6; i++) {
		sum += arr[i];
	}
	int average = sum / sizeof(arr);
	printf("배열 원소들의 평균은 %d\n", average);

	//4번 프로그램
	int sumforvariance=0;

	for (int i = 0; i < 6; i++) {
		int num = average - arr[i];
		sumforvariance += num * num;
	}
	int variance = sumforvariance / sizeof(arr);
	printf("배열 원소들의 분산값은 %d", variance);
}

20. 문자열 두 개를 입력받고 문자열이 같은지 다른지 출력하는 함수를 만들어라

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	char word1[20], word2[20];

	printf("첫 번째 문자열을 입력하세요>>>");
	scanf("%s", &word1);
	printf("두 번째 문자열을 입력하세요>>>");
	scanf("%s", &word2);

	while (1) {
		for (int i = 0; i != NULL; i++) {
			if (word1[i] != word2[i])
				printf("두 개의 문자열은 다릅니다.");
		}
		printf("두 개의 문자열은 같습니다.");
		break;
	}
	
}

21. 포인터를 사용해 실수값 두 개를 교환하여 저장하고 출력하는 함수를 만들어라

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int num1=5, num2=10;

	printf("원본 x의 값은 %d, y의 값은 %d이다", num1, num2);

	int* p = &num1;
	int* q = &num2;
	int x = *p;
	*p = *q;
	*q = x;

	printf("변경된 x의 값은 %d, y의 값은 %d이다", num1, num2);
}

22. 문자열을 입력받아 대문자는 소문자로, 소문자는 대문자로 변환하여 출력하는 프로그램을 작성하여라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main(void) {
    char str[20];
    
    printf("문자열을 대소문자를 구분하여 20자 이내로 입력하세요 >>> ");
    scanf("%s", str);
    for (int i = 0; str[i] != '\0';i++) {
        if (str[i] >= 65 && str[i] <= 90)
            str[i] = str[i] + 32; 
        else if (str[i] >= 97 && str[i] <= 122)
            str[i] = str[i] - 32;
    
    }
    puts(str);
    
    
}

++ 풀면서 복습 겸 다시 한 번 깨달은 점

C에서 for문 작성할 때 괄호 안 첫 번째 요소가 반복 시작점, 두 번째 요소가 반복 끝 점이 아니고

첫 번째 요소가 초기값, 두 번째 요소가 반복 조건이라는 점을 다시 한 번 머리게 빡 박고 간다... 반성 반성

 

++ 아스키 코드 이용해서 풀이하는 건 다른 사람 코드 보고 영감 받은 건데, 이제 머리에 빡 박고 다음부터 이런 문제 나오면 바로 적용할 수 있도록 아이디어 체화하고 잊지 말자


23. 입력받은 문자를 역순으로 출력하는 reverse 함수를 작성하세요

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

char reverse(char str[], int strlength);

int main(void) {
    int strlength;
    char str[30];
    printf("문자열을 입력하세요>>> ");
    gets(str);
    strlength = strlen(str);
    reverse(str, strlength);

}

char reverse(char str[], int strlength) {
    for (int i = strlength; i >= 0; i--)
    {
        printf("%c", str[i]);
    }
    printf("\n");
}

24. 주소록 프로그램

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

void lookup(yellowbook* pl, int len); //구조체를 함수 인자로 받을 때는 포인터 변수 사용
void add(yellowbook* pl, int len);
void search(yellowbook* pl, int len);
void delete(yellowbook* pl, int len);

typedef struct {
	char name[10];
	char number[13];
	char address[30];
	char birthday[10]; //2001-02-09의 형식으로 입력
}yellowbook;

int main(void) {
	int i;
	int length = 0;

	yellowbook pl[] = (yellowbook*)malloc(100 * sizeof(yellowbook));

	int x;
	printf("주소록 프로그램 기능 보기입니다.\n");
	printf("목록 보기 (1), 추가하기 (2), 탐색하기 (3), 삭제하기 (4)을 입력하세요. >>> ");
	scanf("%d", &x);
	if (x == 1)
		lookup(pl, length);
	else if (x == 2)
		add(pl, length);
	else if (x == 3)
		search(pl, length);
	else
		delete(pl.)


}

void lookup(yellowbook* pl, int len) {
	for (int i = 0; i < len; i++) {
		printf("%s", pl[i].name);
		printf("%s", pl[i].number);
		printf("%s", pl[i].address);
		printf("%s", pl[i].birthday);
	}
}

void add(yellowbook* pl, int len) {
	int i;
	printf("주소록 프로그램입니다.\n");
	printf("이름, 전화번호, 주소와 생일(****-**-**의 형태) 을 순서대로 입력하세요, 입력을 마치려면 0을 입력합니다.\n");

	while (i != 0) {
		printf(">>>");
		if (scanf("%s", &i) == "0")
			break;
		else {
			scanf("%s", &pl[i].name);
			scanf("%s", &pl[i].number);
			scanf("%s", &pl[i].address);
			scanf("%s", &pl[i].birthday);
			len++;
		}
	}

}

void search(yellowbook* pl, int len) {
	char finder[10];
	printf("찾을 정보의 이름을 입력하세요.>>> ");
	scanf("%s", &finder);

	for (int i = 0; i < len;) {
		if (pl[i].name == finder)
			printf("찾으시는 &s의 전화번호는 &s, 주소는 &s, 생일은 &s입니다.", pl[i].name, pl[i].number, pl[i].address, pl[i].birthday);
		else
			i++;
	}

}

void delete(yellowbook* pl, int len) {
	char deleter[10];
	printf("t삭제할 정보의 이름을 입력하세요.>>> ");
	scanf("%s", &deleter);

	for (int i = 0; i < len;) {
		if (*pl[i].name == deleter)
			free(*pl[i]);
		else
			i++;
	}
}

25. 정수값을 입력받고 1부터 입력받은 값까지의 합을 구하는 프로그램을 재귀호출을 이용해 작성

++다시