본문 바로가기
IT/프로그래밍

C언어 본색 파트3 Chapter 2 연습문제 솔루션

by nutrient 2021. 5. 31.
728x90
728x170

 

1번

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int count(char*);

int main()
{
	char str[80];
	printf("단어를 입력하세요 : ");
	scanf("%s",str);
	strlwr(str);//대소문자 소문자로 
	count(str);

	return 0;
}

int count(char* inputStr){
	int countArr[26]={0,};//알파벳 갯수만큼 배열 잡음
	int cnt=0, srcLen=0, i=0;

	srcLen=strlen(inputStr);//문자열 길이 저장

	for(cnt=0;cnt<srcLen;cnt++){
		if(inputStr[cnt]-'a'>=0 && inputStr[cnt]-'a'<=122){//알파벳이면
			countArr[inputStr[cnt]-'a']++;
		}
		else
			continue;
	}

	//출력
	for(i=0; i<26; i++){
		printf("%c:%d개\n",97+i, countArr[i]);
	}


	return 0;
}

/*해설
str배열에 입력받은 문장을 저장합니다.
strlwr()함수로 문장을 모두 소문자로 변경합니다.
이후 count()함수로 문자의 갯수를 셉니다.
count()함수 내에서 다음과 같은 if문으로
	if(inputStr[cnt]-'a'>=0 && inputStr[cnt]-'a'<=122)
문자열의 cnt 위치의 문자가 소문자 알파벳인지 검사를 합니다.
소문자 알파벳이면 countArr배열로 해당 문자의 갯수를 하나 증가시킵니다.
	countArr[inputStr[cnt]-'a']++;
만약 알파벳이 아니라면 countinue 구문을 통해 다음 원소로 넘어갑니다.

문자열에서 알파벳 갯수를 모두 센 이후 printf문으로 출력을 합니다.
*/

 

2번

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

int main(){
	char inputStr[10][15], temp[15];
	int i=0, j=0, max;

	printf("입력을 종료하려면 그냥 엔터를 누르세요.\n");

	//입력
	for(i=0;i<10;i++){
		printf("%d번째? ",i+1);
		gets(temp);
		
		//문자열 길이 점검
		if(strlen(temp)==0){
			max = i;
			break;
		}

		strcpy(inputStr[i], temp);
	}

	//정렬
	for(i=max; i>=0; i--){
		for(j=max; j>i; j--){
			if( strcmp(inputStr[i], inputStr[j]) > 0 ){
				strcpy(temp, inputStr[i]);
				strcpy(inputStr[i], inputStr[j]);
				strcpy(inputStr[j], temp);
			}
		}
	}


	//출력
	for(i=0;i<max;i++){
		printf("%s  ", inputStr[i]);
	}
	puts("");
	return 0;
}

/*해설
문자혈 배열 temp로 입력을 받고, strlen()함수로 입력받은 문자열의 길이를 점검하여 길이가 0이면 입력을 중단한다.
문자열을 입력 받을 때 마다 inputStr 2차원 배열에 순서대로 저장을 한다.

입력이 모두 끝나면 inputStr배열을 내림차순으로 정렬을 한다.
정렬기법으로는 거품정렬을 사용하였다.

정렬이 끝나면 순서대로 문자열을 출력한 후 종료한다.
*/

 

3번

/*본래 문제의 코드*/
/* ex3.c */
/*
#include <stdio.h>
#include <string.h>
int main(void){
	char a[]="문자열";
	char b[]="문자열"

	if(a==b)
		puts("a와 b가 같습니다.");
	else
		puts("a와 b가 같지 않습니다.");

	return 0;
}
*/

/*문제 수정 코드*/
#include <stdio.h>
#include <string.h>
int main(void){
	char a[]="문자열";
	char b[]="문자열";

	if( strcmp(a, b)==0 )
		puts("a와 b가 같습니다.");
	else
		puts("a와 b가 같지 않습니다.");

	return 0;
}

/*해설
이번 문제는 숫자나 문자가 아닌 문자열을 비교하는 문제입니다.
c언어는 문자열을 하나의 데이터 타입으로 조작하는 것이 아니고, 연속적인 char형의 배열로 관리를 합니다.
데이터 타입으로 관리하는 것이 아니기 때문에 문자열을 조작하는 연산자를 제공하지 않습니다.
따라서 문자열을 조작하기 위해서는 문자열 조작 함수를 이용하여야합니다.
두 문자열을 비교하는 기본 제공 함수는 strcmp()이며, string.h에 정의되어 있습니다.
이 함수는 두 문자열의 문자 코드의 대소를 비교하는 것입니다.
자세한 strcmp()함수의 입출력 동작은 c언어 표준 함수 레퍼런스를 참고하시기 바랍니다.
*/

 

4번

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

int main(void){
	char inputStr[80], result[80];

	printf("문자열을 입력하세요 :\t");
	gets(inputStr);
	
	strcpy(result, inputStr);
	strrev(result);

	printf("앞뒤가 뒤집어진 출력 :\t%s\n", result);

	return 0;
}

/*해설
문자열을 앞뒤로 뒤집는 문제이다.
inputStr배열로 문자열을 입력받는다.
문자열을 뒤집는 표준 문자열 처리함수는 strrev()이다.
strrev()함수를 이용하여 문자열을 뒤집은 후 출력한다.
*/

 

5번

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

int main(void){
	char inputS[80];
	int result=0;

	printf("문자열을 입력하세요: ");
	gets(inputS);

	//문자열을 정수로 변환
	result = atoi(inputS);
	printf("문자열을 정수로 출력: %d\n", result);

	return 0;
}

/*해설
입력받은 문자열의 숫자를 정수형 데이터 형태로 반환하는 표준 함수 atoi()함수를 사용합니다.
*/

 

6번

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

int main () {

	char str[32] = "";
	int i = 0;
	int transGap = 'a' - 'A';

	printf("Enter string: ");
	scanf("%s", str);

	printf("Length of string : %d\n", strlen(str));

	for (i = 0; i < strlen(str); i++) {
		if (str[i] >= 'a' && str[i] <= 'z') str[i] -= transGap;
		else if (str[i] >= 'A' && str[i] <= 'Z') str[i] += transGap;
	}

	printf("Result string : %s\n", str);

	return 0;
}

 

7번

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

struct student {
	char sID[32];
	char sName[32];
	int englishScore;
	int koreanScore;
};

int main () {

	struct student std;
	
	printf("Enter student ID : ");
	scanf("%s", std.sID);

	printf("Enter student name : ");
	scanf("%s", std.sName);
	
	printf("Enter student english score : ");
	scanf("%d", &std.englishScore);
	
	printf("Enter student korean score : ");
	scanf("%d", &std.koreanScore);
	
	if ( strstr(std.sID, "2010") != NULL) {
		printf("\nThis student enterred in 2010\n");
		printf("Student ID : %s\n", std.sID);
		printf("Student Name : %s\n", std.sName);
		printf("Student English Score : %d\n", std.englishScore);
		printf("Student Korean Score : %d\n", std.koreanScore);
	}
	
	return 0;
}
728x90
그리드형

댓글