도전1) 길이 10인 배열을 선언하고 총10개의 정수를 입력받아서, 홀수와 짝수를 구분지어 출력하는 프로그램을 작성해보자. 일단 홀수부터 출력하고 나서 짝수를 출력하도록 하자. 단, 10개의 정수는 main함수 내에서 입력받도록 하고 배열 내에 존재하는 홀수만 출력하는 함수와 배열 내에 존재하는 짝수만 출력하는 함수를 각각 정의해서 이 두 함수를 호출하는 방식으로 프로그램을 완성하자
(수정: 21.10.12/한정된 코드로 되어 있어 새롭게 수정)
#include <stdio.h>
int main(void){
int arr[10];
for(int i=0;i<10;i++){
printf("입력: ");
scanf("%d" ,&arr[i]);
}
printf("홀수 출력: ");
for(int i=0;i<10;i++){
if(i%2==0){
printf("%d, ", arr[i]);
}
}
printf("\n");
printf("짝수 출력: ");
for(int i=0;i<10;i++){
if(i%2!=0){
printf("%d, ", arr[i]);
}
}
}
처음에 함수로 안풀고 그냥 if, for써서 만들었다가 급하게 분리했다. 경고문은 뜨기는 하지만 그래도 실행은 정상적
도전2) 프로그램 사용자로부터 10진수 형태로 정수를 하나 입력 받은 다음, 이를 2진수로 변환해서 출력하는 프로그램을 작성해보자
#include <stdio.h>
int main(void){
int N,i=0;
char num[30];
scanf("%d", &N);
while(N>0){
num[i++]=N%2;
N/=2;
}
while(i>0){
i--;
printf("%d ", num[i]);
}
return 0;
}
일단 공간과 정수를 선언해주고 저장한다음에 진수 변환방식을 써주어야 한다. 나저미가 있으면 더해주고 숫자 역시 나누어 주는 것이 필요하다. 이것을 나만의 방식으로 i++을 내보내려 했는데 잘 안되긴 해서 저자의 말을 따르기로 했다. 안익숙한 것은 사실이다. 그리고 탈출한 다음에는 이를 거꾸로 출력해야 하므로 i를 올린 상태에서 다시 -를 통해 출력을 시켜중야 한다.
도전3) 길이가 10인 배열을 선언하고 총 10개의 정수를 입력 받는다. 단, 입력받은 숫자가 홀수이면 배열의 앞에서부터 채워나가고 짝수이면 뒤에서부터 채워나가는 형식을 취하기로 하자. 따라서 사용자가 [1,2,3,4,5,6,7,8,9,10]을 입력했다면 배열에는[1,3,5,7,9,10,8,6,4,2]순으로 저장되어야 한다.
#include <stdio.h>
int main(void){
int num;
int new[10];
int f=0,e=9;
for(int i=0; i<10;i++){
printf("입력: ");
scanf("%d", &num);
if(num%2==1){
new[f++]=num;
}
else if(num%2==0){
new[e--]=num;
}
}
printf("배열요소의 출력: ");
for(int i=0;i<10;i++){
printf("%d ", new[i]);
}
}
이 것도 처음에 나만의 방식을 만들려고 했다. 처음에 앞에것은 i++로 올려주고 뒤에서부터 오는 것은 10-i-1를 활용하려고 했다. 다시 생각해보니 불가인 것이었다. 숫자가 겹칠 수 있기 때문이다. 그래서 사실 초기화를 시키면서 숫자를 지정해서 거기서부터 빼는게 확실히 맞는 말 같았다. 충돌없이 마무리가 가능하다. 출력과정은 for문 돌리는 것이므로 어렵지는 않다.
도전4) 회문은 앞으로 읽으나 뒤로 읽으나 차이가 없는 단어들을 뜻한다. 예를 들어서 level,bob과 같은 단어들은 회문에 속한다. 이에 우리는 인자로 전달되는 영단어가 회문인지 아닌지를 판단해서 그 결과를 출력한는 기능의 함수를 정의하고 이에 적절한 main함수를 정의해보고자 한다. 단 구현의 편의를 위해서 대문자까지 일치해야 회문으로 인정하기로 하겠다.
#include <stdio.h>
void Pal1(char* word){
int len=0;
int num=0;
while(word[len]!=0){
len++;
}
for(int i=0; i<len/2;i++){
if(word[i]!=word[len-i-1]){
num +=1;
}
}
if(num ==0){
printf("회문입니다.");
}
else{
printf("회문이 아닙니다.");
}
}
int main(void){
char Pal[30];
scanf("%s", &Pal);
Pal1(Pal);
return 0;
}
이것도 굉장히 고민을 많이 했다. 함수선언도 익숙치 않았고 guide 부분에서 strlen이 있다는 것을 알려줘서 그것을 쓰라하는 줄 알았는데 아니어서 당황했다. 그냥 여기서는 while문으로 len을 구해준다. 그리고 반으로 나누어서 앞과 뒤를 검사하고 만약 다를 경우에는 +1를 해주는 형태로 구현해보았다. 회문이라면 num가 올라가지 않을 것이므로 회문이라고 출력하도록 하였고 나머지 경우에는 회문이 아니라고 하였다. 이를 함수 안에서 구현하였다.
도전5) 배열에 저장되어 있는 요소들을 내림차순으로 정렬한는 함수를 정의하자.(함수의 이름은 DesSort로 정의하자) 그리고 이 함수를 호출하는 예제를 작성해보자. 프로그램의 흐름은 다음과 같이 구성을 하자. 일단 길이가 7인 int형 배열을 선언해서 프로그램 사용자로 부터 7개의 정수를 입력받도록 하자. 그리고 입력받은 정수를 내림차수능로 정렬하기 위해서 배열을 인자로 전달하면서 DesSort함수를 호출하자. 그리고 마지막으로 제대로 정렬이 되었는지 확인하기 위해서 배열의 요소들을 순서대로 출력해보자
#include <stdio.h>
void DesSort(int ary[], int len);
int main(void){
int arr[7];
int i;
for(i=0;i<7;i++){
printf("입력 %d:", i);
scanf("%d", &arr[i]);
}
DesSort(arr,sizeof(arr)/sizeof(int));
for(i=0;i<7;i++){
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
void DesSort(int ary[], int len){
int i,j;
int temp;
for(i=0;i<len-1;i++){
for(j=0;j<(len-i)-1;j++){
if(ary[j]<ary[j+1]){
temp=ary[j];
ary[j]=ary[j+1];
ary[j+1]=temp;
}
}
}
}
이것은 문제 앞에서 형태를 주어졌기 때문에 큰 어려움은 없었다. 함수 이름 변화와 배열의 크기 변화주기, 그리고 scanf를 통해 저장해주는 것, 그리고 바꿔주는 형태에서 부등호의 방향만 바꿔주었다. 배열의 전달방식을 알고있는게 필요할 것 같다. 그리고 for문 2개를 통해 차례대로 그리고 거꾸로 검사할 수 있다는 것을 확인해야 겠다. 바꿔주는 것은 temp로 하는 것은 익숙하니까.....
도전프로그래밍 2 끝!!!!!
'C language > 열혈C 문제풀이' 카테고리의 다른 글
[C] 열혈C 문제풀이 11-2 (0) | 2021.08.12 |
---|---|
[C] 열혈C 문제풀이 11-1 1번 (0) | 2021.08.12 |
[C] 열혈C 문제풀이 21-1, 21-2 (0) | 2021.08.10 |
[C] 열혈 C 문제풀이 도전프로그래밍1 (0) | 2021.08.07 |
[C] 열혈C 문제풀이 9-1 (0) | 2021.08.04 |