21-1
프로그램 사용자로부터 알파벳 문자를 하나 입력받아서, 입력받은 문자가 대문자면 이를 소문자로변환해서 출력해주고, 입력받은 문자가 소문자면 이를 대문자로 변환해서 출력해주는 프로그램을 작성해보자. 단, 문자의 입출력에는 getchar함수와 putchar함수를 사용하기로하자. 그리고 프로그램 사용자가 알파벳 이외의 문자를 입력하는 경우에는 오류메시지를 간단히 출력하기로 하자.
#include <stdio.h>
int ConvCase(int ch){
int diff='a'-'A';
if(ch>='A'&&ch<='Z'){
return ch+diff;
}
else if(ch>='a'&&ch<='z'){
return ch-diff;
}
else{
return -1;
}
}
int main(void){
int ch;
printf("문자입력:");
ch=getchar();
ch=ConvCase(ch);
if(ch==-1){
puts("범위벗어남");
return -1;
}
putchar(ch);
return 0;
}
21-2
문제1) 적당한 길이의 문자열을 입력받아서 그 안에 존재하는 숫자의 총 합을 계산해서 출력하는 프로그램을 작성해보자. 예를 들어서 프로그램 사용자로부터 입력 받은 문자열이 "A15#43"이라 하면, 이 문자열중 아라비아 숫자는 1,5,4,3이니 1+5+4+3의 연산결과가 출력되어야 한다.
#include <stdio.h>
int sum=0;
int number(char c){
static int diff=1-'1';
printf("%d A15#43", diff);
return c+diff;
}
int main(void){
char str[10];
printf("문자열 입력: ");
fgets(str,sizeof(str), stdin);
int len=strlen(str);
for(int i=0;i<len;i++){
if('1'<=str[i]&&str[i]<='9'){
sum+=number(str[i]);
}
}
printf("%d", sum);
return 0;
}
사실 이 내용을 이해하는데에 꽤 오랜 시간이 걸렸다. 그래도 이해를 했으니 말로 설명을 해보도록 하겠다.
일단 문자열을 입력 받는데에는 어려움이 없다. 여기 단원에서 배운 fget을 이용하면 훨씬 좋고 strlen을 배웠으므로 문자열 길이도 계산 간으하다. for문까지 만드는데에는 쉬운데 여기서 조금 걸렸다. 숫자만 걸러내는 과정이 필요하다.
숫자를 걸러내기 위해서는 먼저 문자 '1' 과 '9' 사이에 있도록 해야 한다. 그리고 여기서 왜 함수를 써야하는지 의문이 들었는데 그 이유는 문자이기 때문이다. 합을 위해서는 숫자로 바꾸어 주어야 한다. 문자 1은 49이다. 그리고 숫자 1은 1이다. 즉 48만큼의 차이가 있다는 것이다. 다른 숫자도 같은 간격이다. 그러므로 '문자+문자와 숫자 간격'을 더해주면 문자가 숫자로 바뀌는 처리가 된다. 이를 통해 합을 구해주어야 숫자가 정상적으로 더해질 수 있다. 이 처리를 해주지 않는다면 쓰레기 값이 나오게 된다.
마지막으로 합을 출력해주면 끝이다.
문제2) 다음과 같이 총 3개의 배열을 선언한다.
char str1[20];
char str2[20];
char str3[20];
그리고는 str1과 str2를 통해서 프로그램 사용자로부터 문자열을 입력 받되, fgets함수 호출을 통해서 입력받는다. 이어서 str1에 저장된 문자열을 str3에 복사하고,str2에 저장된 문자열을 str3에 저장된 문자열의 뒤에 덧붙이자. 그리고 마지막으로 str3에 저장된 문자열을 출력하자. 다소 설명이 복잡했는데, 예를 들어서 str1과 저장된 문자열이 각각 다음과 같다면,
str1 "Simple"
str2 "String"
str3에는 문자열"SimpleString이 저장되어야한다. 그런데 여기서 한가지 주의해야 할 사항이 있다. fgets 함수를 통해서 문자열을 읽어들이면 \n문자도 함께 읽혀지는데 이는 문자열의 일부가 되지 않도록 해야 한다는 점이다. 쉽게 말해서 str1과 str2에 저장된 문자열에서 \n은 소멸시켜야 한다.
#include <stdio.h>
#include <string.h>
int main(void){
char str1[20];
char str2[20];
char str3[20];
fgets(str1, sizeof(str1),stdin);
fgets(str2, sizeof(str2),stdin);
str1[strlen(str1)-1]=0;
strcpy(str3,str1);
strcat(str3,str2);
puts(str3);
}
여기서는 문자열을 선언하고 입력받는데까지는 큰 어려움이 없었다. 그렇지만 조금 머뭇거리던 부분은 바로 \n을 없애는 부분이었다. 이것을 없애주기 위해서는 별도의 줄에서 처리를 해 주어야 한다. strlen이 1개보다 작은 것이 끝자리다. 0부터 시작하기 때문이다. 그래서 여기 부분을 0으로 처리해준다. 그러면 \n이 사라질 수 있다. 이후에는 copy 하는 형태인 strcpy를 이용하고 뒤에 붙여주는 형태인 strcat을 하면된다. 이 두가지를 생각하고 \n형태는 더더욱 기억하는 것이 앞으로 문제풀 때 중요할 것 같다는 생각이 들었다.
문제3) 프로그램 사용자로부터 이름과 나이를 다음의 형식에 맞춰서 하나의 무자열로 입력 받는다.
"이정선 29"
"한수정 7"
"오선주 17"
이름은 세글자가 아닐 수도 있고 영문으로 입력될 수도 있다. 단 이름과 나이 사이에만 공백이 삽입되어야 한다. 이러한 형식으로 두 사람의 정보를 입력 받아서 이름과 나이가 각각 닽은지 다른지를 판단하여 출력하는 프로그램을 작성해보자. 참고로 이 문제는 수준이 어느정도 있는 문제이니 천천히 생각하며 해결하기 바란다.
#include <stdio.h>
#include <string.h>
int main(void){
char str1[20];
char str2[20];
int age1;
int age2;
printf("이름과 나이 입력1: ");
scanf("%s %d", &str1, &age1);
printf("이름과 나이 입력2: ");
scanf("%s %d", &str2, &age2);
if(!strcmp(str1,str2)){
puts("두 사람의 이름은 같습니다.");
if(age1==age2){
puts("두 사람의 나이는 같습니다.");
}
else{
puts("두 사람의 나이는 다릅니다.");
}
}
else{
puts("두 사람의 이름은 다릅니다.");
if(age1==age2){
puts("두 사람의 나이는 같습니다.");
}
else {
puts("두 사람의 나이는 다릅니다.");
}
}
}
음 나는 어렵게 풀지 않았다. 풀이를 보니 굉장히 복잡하게 함수로 엮여져 있는데 나는 그냥 한 곳 안에서 끝내버렸다. 이번 단원에서 배운 것중에 사용한 것은 strcmp이다 문자 비교인데 이것을 이용하여 이름을 판단해 주었다. 숫자는 문자 비교 보다는 아무래도 같은지 다른지 한번에 판단이 가능하기 때문에 if문 안에서 ==을 이용해 해 주었다. 이를 if else로 나누어서 풀었다. 출력은 puts로 해 주었다.
'C language > 열혈C 문제풀이' 카테고리의 다른 글
[C] 열혈C 문제풀이 11-2 (0) | 2021.08.12 |
---|---|
[C] 열혈C 문제풀이 11-1 1번 (0) | 2021.08.12 |
[C] 열혈C 문제풀이 도전프로그래밍 2 (0) | 2021.08.07 |
[C] 열혈 C 문제풀이 도전프로그래밍1 (0) | 2021.08.07 |
[C] 열혈C 문제풀이 9-1 (0) | 2021.08.04 |