C:과제3

aiden·2023년 5월 26일
0

C

목록 보기
25/28

사용자로부터 문자열을 입력 받은 후 그 문자열에서 아래 기능들을 수행하는 프로그램을 작성하시오.
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
1번 기능에서 모음은 a, e, i, o, u를 의미하며 3번 기능에서는 길이가 같은 단어가 여러개 있으면 모두 출력한다. 문자열을 입력받는 기능과 1-3번 기능(4번 제외)은 모두 개별 함
수로 구현해야 한다. 이때 main() 함수에 선언된 배열을 매개변수로 사용해야 하며 사용자로부터 입력받아서 배열에 저장된 값 자체는 변경해서는 안된다.

<실행 예시>
문자열을 입력하시오 : We have to go home right now!
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오: 1
-> 자음 개수: 13
-> 모음 개수: 9
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오: 2
-> Wehavetogohomerightnow!
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오: 3
-> 가장 긴 단어: right
-> 가장 짧은 단어: We to go
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오: 4
-> 프로그램 종료합니다!

작성코드

#include <stdio.h>
#include <string.h>
typedef struct word { //기능3에 사용될 단어 정보 저장을 위한 구조체
	int start;
	int length;
}Word;

/*
함수 이름 : Consonant_Vowel
기능 : 문자열을 인자로 받아 자음과 모음의 개수를 출력한다.
인자 : char* s : 문자열 s
반환값 : 없음
작성 날짜 : 2023/05/22
작성자 : Aiden Lee
*/
void Consonant_Vowel(char* s) {
	int cons = 0, vow = 0, i = 0;
	
	while (s[i] != 0) {
		if ((s[i] >= 65 && s[i] <= 90) || (s[i] >= 97 && s[i] <= 122)) {
			if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'A' || s[i] == 'E' || s[i] == 'I' || s[i] == 'O' || s[i] == 'U') {
				vow++;
			}
			else {
				cons++;
			}
		}
		i++;
	}
	printf("-> 자음 개수: %d\n->모음 개수 : %d\n", cons, vow);
	return;
}

/*
함수 이름 : RemoveBlank
기능 : 문자열을 인자로 받아 공백을 제거하여 출력한다.
인자 : char* s : 문자열 s
반환값 : 없음
작성 날짜 : 2023/05/22
작성자 : Aiden Lee
*/
void RemoveBlank(char* s) {
	for (int i = 0; i < strlen(s); i++) {
		if (s[i] != ' ')
			printf("%c", s[i]);
	}
	printf("\n");
	return;
}

/*
함수 이름 : Longest_Shortest
기능 : 인자로 전달받은 문자열의 단어 중 가장 짧은 단어와 긴 단어를 출력한다.
인자 : char* s : 문자열 s
반환값 : 없음
작성 날짜 : 2023/05/22
작성자 : Aiden Lee
*/
void Longest_Shortest(char* s) {
	//각 단어의 정보를 구조체 배열에 저장하고 최대, 최소 길이 찾기
	Word word_arr[20]; //입력받은 문자열은 20단어 이하라고 가정
	int start = 0, word_index = 0;
	int min_index = 0, max_index = 0, min, max;

	for (int i = 0; i <= strlen(s); i++) {
		if (s[i] == ' ' || s[i] == 0) {
			word_arr[word_index].start = start;
			if(s[i] == ' ')
				word_arr[word_index].length = i - start;
			else
				word_arr[word_index].length = i - start - 1;
			start = i + 1;
			word_index++;
		}
	}
	
	//단어의 길이가 저장된 구조체 배열에서 최대, 최소 찾기
	for (int i = 0; i < word_index; i++) {
		if (word_arr[i].length < word_arr[min_index].length)
			min_index = i;
		if (word_arr[i].length > word_arr[max_index].length)
			max_index = i;
	}

	//최대, 최소 길이 단어 찾아 출력
	max = word_arr[max_index].length;
	min = word_arr[min_index].length;
	printf("-> 가장 긴 단어 : ");
	for (int i = 0; i < word_index; i++) {
		if (word_arr[i].length == max) {
			start = word_arr[i].start;
			for (int j = 0; j < max; j++)
				printf("%c", s[start + j]);
			printf(" ");
		}
	}
	printf("\n-> 가장 짧은 단어 : ");
	for (int i = 0; i < word_index; i++) {
		if (word_arr[i].length == min) {
			start = word_arr[i].start;
			for (int j = 0; j < min; j++)
				printf("%c", s[start + j]);
			printf(" ");
		}
	}	
	printf("\n");
	return 0;
}

/*
함수 이름 : main
기능 : 사용자로부터 문자열을 입력받아 문자열에 대해 원하는 기능을 제공한다.
인자 : 없음
반환값 : 정상 종료 시 0 반환
작성 날짜 : 2023/05/22
작성자 : Aiden Lee
*/
int main(void) {
	char string[50]; //입력받을 문자열은 길이 50 이하라고 가정
	int option;

	printf("문자열을 입력하시오 : ");
	fgets(string, sizeof(string), stdin);

	while(1){
		printf("메뉴:\n1. 자음 및 모음의 빈도 구하기\n2. 공백없이 출력하기\n3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기\n4. 종료하기\n\n연산을 입력하시오 : ");
		scanf("%d", &option);

		switch (option)
		{
		case 1:
			Consonant_Vowel(string);
			break;
		case 2:
			RemoveBlank(string);
			break;
		case 3:
			Longest_Shortest(string);
			break;
		case 4:
			printf("->프로그램을 종료합니다.");
			return 0;
		default:
			printf("주어진 메뉴를 선택하세요\n");
			break;
		}
	}
	return 0;
}

문자열을 입력하시오 : We have to go home right now!
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오 : 1
-> 자음 개수: 13
->모음 개수 : 9
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오 : 2
Wehavetogohomerightnow!
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오 : 3
-> 가장 긴 단어 : right
-> 가장 짧은 단어 : We to go
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오 : 4
->프로그램을 종료합니다.

문자열을 입력하시오 : Why you look sad
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오 : 1
-> 자음 개수: 8
->모음 개수 : 5
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오 : 2
Whyyoulooksad
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오 : 3
-> 가장 긴 단어 : look
-> 가장 짧은 단어 : Why you sad
메뉴:
1. 자음 및 모음의 빈도 구하기
2. 공백없이 출력하기
3. 단어 중에서 가장 긴 단어와 가장 짧은 단어 찾기
4. 종료하기
연산을 입력하시오 : 4
->프로그램을 종료합니다.

profile
파인애플 좋아하세요?

0개의 댓글