c언어 수행 능력 확인 문제

문제1
길이가 5인 int형 배열을 선언해서 프로그램 사용자로부터 총 5개의 정수를 입력 받자.
그리고 입력이 끝나면 다음의 내용을 출력하도록 예제를 작성해보자.
  - 입력된 정수 중에서 최대값
  - 입력된 정수 중에서 최소값
  - 입력된 정수의 총 합

단, 반드시 입력을 완료한 상태에서 '최대값'과 '최소값' 그리고 '총합'을 계산해야 한다.

A:

#include <stdio.h>

void main()
{
int array[5];
int sum=0;

for (int i = 0; i < 5; i++)
{
printf("input : ");
scanf_s("%d", &array[i]);
}

int max = array[0], min = array[0];

for (int i = 0; i < 5; i++)
{
sum += array[i];

if (max < array[i]) max = array[i];
if (min > array[i]) min = array[i];
}


printf("입력된 정수 중에서 최대값 : %d\n", max);
printf("입력된 정수 중에서 최소값 : %d\n", min);
printf("입력된 정수의 총 합 : %d\n", sum);


}



문제2.
프로그램 사용자로부터 하나의 영단어를 입력 받아서 입력 받은 영단어의 길이를 계산하여 출력하는 프로그램을 작성해보자. 예를 들어서 "Array"라는 단어가 입력되면 5가 출력되어야 한다.( 입력받을 수 있는 영단어의 최대 글자수가 30개까지 
 되도록 배열변수의 크기를 선언하자.)

A:

#include <stdio.h>

void main()
{
char word[30];

printf("영단어 하나를 입력하면 영단어 길이를 알려주는 프로그램\n\n");

printf("입력 : ");
scanf_s("%s", word,30);

int length=0;

for (int i = 0; i < 30; i++)
{
if (word[i] == NULL)
{
length = &word[i] - &word;
}
}


printf("영단어 길이 : %d", length);
}

 



문제3.
프로그램 사용자로부터 영단어을 입력 받는다. 그리고 나서 입력 받은 영단어를 구성하는 문자 중에서 아스키 코드의 값이 가장 큰 문자를 찾아서 출력하는 프로그램을 작성해보자. 예를 들어서 입력된 영단어가 "LOVE"라면 이 중에서 아스키 코드 값이 가장 큰 문자는 V이므로 V가 출력되어야 한다.

A:

#include <stdio.h>

void main()
{

char word[30];

printf("영단어 입력 : ");
scanf_s("%s", &word,30);

int max = 0;

for (int i = 0; i < 30; i++)
{
if (word[i] > max) max = word[i];
}


printf("아스키코드 값이 가장 큰 문자 : %c\n", max);
}



문제4.
프로그램 사용자로부터 영단어를 입력 받아서 char형 배열에 저장한다. 그 다음 배열에 저장된 영단어를 역순으로 뒤집는다. 물론 이 때에 널 문자의 위치를 변경해서는 안된다. 뒤집고 나서는 제대로 뒤집혔는지 확인하기 위해서 출력해보자.
(입력받을 수 있는 영단어의 최대 글자수가 30개까지 되도록 배열변수의 크기를 선언하자.)

A:

#include <stdio.h>

void main()
{
char word[30];
char backward[30] = { 0 };

printf("영단어 입력 : ");
scanf_s("%s", &word,30);

// NULL값 위치 찾기
int i = 0;
for (; i < 30; i++)
{
if (word[i] == NULL) break;
}

//NULL값 전까지 위치를 바꾸기
for (int j = 0; j < i; j++)
{
backward[j] = word[i - j - 1];
}

printf("영단어 역순 : %s", backward);
}

 



문제 5.
아래와 같이 학생들의 성적을 받아서 평균을 구하는 프로그램을 작성해보자.
(단, 최대 학생수는 10명으로 제한한다.)

실행결과 예시)

 학생의 수를 입력하시오 : 2

 학생 1의 성적을 입력하세요 : 20
 학생 2의 성적을 입력하세요 : 110
 잘못된 성적입니다. 다시 입력하시오.
 학생 2의 성적을 입력하세요 : 30
 
 성적 평균은 25.0 입니다.

 

A:

#include <stdio.h>

void main()
{
int scores[10] = { 0 };

//학생 수 입력
int count;
printf("학생의 수를 입력하시오 : ");
scanf_s("%d", &count);
printf("\n");

//성적 입력
int i=0,sum = 0;
do
{
printf("학생 %d의 성적을 입력하세요 : ", i + 1);
scanf_s("%d", &scores[i]);

if (scores[i] < 0 || scores[i] > 100)
{
printf("잘못된 성적입니다. 다시 입력하시오.\n"); 
continue;
}

sum += scores[i];
i++;


printf("\n");
} while (i < count);

printf("성적 평균은 %.1lf 입니다.", (double)sum / count);

}

 



문제 6.
입력값들의 분포를 시각적으로 볼 수 있는 히스토그램을 만드는 프로그램을 작성하시오.
이 프로그램은 1부터 100이하의 정수 10개를 읽어야 하고, 1-10,11-20 등의 범위에 드는
값들의 횟수를 아래와 같이 출력하여야 한다.

  1 - 10 : ****
 11 - 20 : **
 21 - 30 : *
 31 - 40 : **
 ..........
 ..........

A:

#include <stdio.h>
void output(int x);

void main()
{
//정수 입력
int histo[10];
printf("입력 값들의 분포를 시각적으로 보여주는 프로그램\n");
printf("단, 정수는 1부터 100이하의 정수 10개\n\n");
for (int i = 0; i < 10; )
{
printf("정수 입력 : ");
scanf_s("%d", &histo[i]);
if (histo[i] > 100 || histo[i] < 1)
{
printf("범위에 해당하지 않는 정수 입니다. 다시 입력해주세요 \n");
continue;
}
i++;
}

//히스토그램 분류
int sum[10] = { 0 };
for (int i = 0; i < 10; i++)
{
if (histo[i] > 0 && histo[i] <= 10) sum[0] += 1;
else if (histo[i] > 10 && histo[i] <= 20) sum[1] += 1;
else if (histo[i] > 20 && histo[i] <= 30) sum[2] += 1;
else if (histo[i] > 30 && histo[i] <= 40) sum[3] += 1;
else if (histo[i] > 40 && histo[i] <= 50) sum[4] += 1;
else if (histo[i] > 50 && histo[i] <= 60) sum[5] += 1;
else if (histo[i] > 60 && histo[i] <= 70) sum[6] += 1;
else if (histo[i] > 70 && histo[i] <= 80) sum[7] += 1;
else if (histo[i] > 80 && histo[i] <= 90) sum[8] += 1;
else if (histo[i] > 90 && histo[i] <= 100) sum[9] += 1;
}

//출력
for (int i = 0; i < 10; i++)
{
printf(" %d1 - %d0 : ", i, i + 1);
output(sum[i]);
printf("\n");
}

}

void output(int x)
{
for (int i = 0 ; i < x; i++)
{
printf("*");
}
}




문제 7.
배열을 이용하여 간단한 극장 예약 시스템을 작성하여 보자. 아주 작은 극장이라서 좌석이
10개밖에 안 된다. 사용자가 예약을 하려고 하면 먼저 좌석 배치표를 보여준다. 즉, 예약이
끝난 좌석은 1로, 예약이 안된 좌석은 0으로 나타낸다.


 좌석을 예약하시겠습니까( 1(Y) 또는 0(N) )?  1

 현재의 예약 상태는 다음과 같습니다.
 -----------------------
 좌석 번호 :  1  2  3  4  5  6  7  8  9  10
 -----------------------
 예약 상태 :  0  0  0  0  0  1  1  1  0   1

 
 몇번째 좌석을 예약하시겠습니까? 6
 죄송합니다. 이미 예약된 좌석입니다. 다른 좌석을 선택해 주세요.
 
 몇번째 좌석을 예약하시겠습니까? 1
 1번 좌석 예약되었습니다.

 좌석을 예약하시겠습니까( 1(Y) 또는 0(N) )?  0
 예약을 종료합니다. 

A:

어떻게보면? 제대로 된 프로그램이라 코딩하는데 시간이 좀 걸렸다.

#include <stdio.h>
void currentStats(int* p);
void booking(int* p);
void question(int* p);

void main()
{
int seats[10] = { 0,0,0,0,0,1,1,1,0,1 };
//안내문 & 입력
question(seats);
}

void question(int* p)
{
int answer;
do
{
printf("좌석을 예약하시겠습니까( 1(Y) 또는 0(N) )? ");
scanf_s("%d", &answer);
printf("\n");
if (answer == 1)
{
currentStats(p);
booking(p);
break;
}
else if (answer == 0)
{
printf("예약을 종료합니다.\n");
break;
}
printf("잘못 입력하셨습니다. 다시 입력해주세요.\n\n");
} while (answer != 1 && answer != 0);
}


void currentStats(int* p)
{
printf("현재의 예약 상태는 다음과 같습니다. \n");
printf("-------------------------\n");
printf("좌석 번호 : ");

for (int i = 0; i < 10; i++)
{
printf(" %2d", i + 1);
}
printf("\n");
printf("-------------------------\n");
printf("예약 상태 : ");
for (int i = 0; i < 10; i++)
{
printf(" %2d", *(p+i));
}
printf("\n\n");
}

void booking(int* p)
{
int seat=0;
do
{
printf("몇번째 좌석을 예약하시겠습니까?");
scanf_s("%d", &seat);
if (p[seat - 1] == 1)
{
printf("죄송합니다. 이미 예약된 좌석입니다. 다른 좌석을 선택해 주세요.\n\n");

}
else if (p[seat - 1] == 0)
{
printf("%d번 좌석 예약되었습니다.\n\n", seat);
p[seat - 1] = 1;
question(p);
break;
}
} while (1);
}

 



문제 8.
첫번째 배열 arr1은 {10, 20, 30, 40, 50}의 정수형 요소값을 가지고 있다.
두번째 배열 arr2은 { 1,  2,  3,  4,  5}의 정수형 요소값을 가지고 있다.
세번째 배열 arr3의 요소값은 arr1의 요소와 arr2의 요소값을 차례로 덧셈한
결과를 저장하도록 프로그래밍 해보자. 단 arr2의 요소는 역순으로 더해지도록 하자.
즉, arr1의 0번 요소와 arr2의 4번 요소를 더해서 arr3의 0번 요소에 대입하도록 해야한다.
arr3의 1번 요소에는 arr1의 1번 요소와 arr2의 3번 요소가 더해져야 한다는 것이다.

이렇게 arr3의 요소값을 모두 대입하고 그 값을 차례대로 출력해보자.

A:

#include <stdio.h>

void main()
{
int arr1[5] = { 10,20,30,40,50 };
int arr2[5] = { 1,2,3,4,5 };
int arr3[5] = { 0 };

for (int i = 0; i < 5; i++)
{
arr3[i] = arr1[i] + arr2[4 - i];
printf(" arr3[%d] : %d\n", i, arr3[i]);
}

}

 



문제 9.
길이가 25인 정수형 배열을 만들어라. 그리고 이 배열의 각 요소에 1부터 25까지 25개의 정수값이
Random하게 저장되도록 프로그래밍 하시오. 단, 배열안에 저장된 Random값은 중복된 숫자가
있으면 안된다. 값들이 제대로 대입되어 있는지 알아보기 위해 1줄에 5개씩 5줄로 각 배열의 요소를
인덱스 순서대로 출력해보자.

 A:

신기하다... 난수배열은 해본적이 배운적이 없는데

이 문제를 낸 의도가 구글링해서 적용시켜보는 것이라고 한다.

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

void main()
{
int array[25];

//랜덤값 넣기
for (int i = 0; i < 25; i++)
{
array[i] = (rand() % 25) + 1;
for (int j = 0; j < i; j++)
{
if (array[i] == array[j]) i--;
}
}
//출력
for (int i = 0; i < 25; i += 5)
{
for (int j = i; j < i + 5; j++)
{
printf(" %2d", array[j]);
}
printf("\n");
}

}

 

 


문제 10.
위의 9번 문제를 가로 5, 세로 5인 2차원 배열로 만들어 보자.


A:

9번 문제를 한후 -> 이 수들을 2차원 배열에 넣으면 간단하다.

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

void main()
{
int array[25];

//랜덤값 넣기
for (int i = 0; i < 25; i++)
{
array[i] = (rand() % 25) + 1;
for (int j = 0; j < i; j++)
{
if (array[i] == array[j]) i--;
}
}

int array2[5][5];
//2차원 배열에 넣기
int k = 0;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
array2[i][j] = array[k];
k++;
}
}

//2차원 배열 출력
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
printf(" %2d", array2[i][j]);
}
printf("\n");
}

}

 

사진을 보면 1차원 배열과 2차원 배열이 같은 값을 가지고 잇는 것을 볼 수 있다.

즉.. 1차원 배열에서 2차원 배열로 잘 옮겼다는 것..



문제 11.
5*5크기의 Metrix에 나선형으로 숫자를 출력하는 프로그램을 작성해 보자.
가로가 5, 세로가 5인 matrix에 1부터 25까지의 숫자를 나선형으로 저장하는 프로그램으로
2차원 배열 buf[5][5]에 아래의 결과처럼 나오도록 각 배열요소에 값을 저장하는 프로그램
이다.

  1  16  15  14  13
  2  17  24  23  12
  3  18  25  22  11
  4  19  20  21  10
  5   6   7   8   9


 배열의 값을 출력하는 함수는 아래와 같다. 이 함수는 변경하지 못한다.
 
 void Display(void)
{
   int i,j;

   for(i =0; i<5; i++)
   {
        for(j=0;j<5;j++)
        {
             printf("%3d\t", buf[i][j]);
        }
        printf("\n");
   }
}
   

 

A:

좀 난이도가 있었다. 

#include <stdio.h>

void Display();

int buf[5][5] = {0 };

 

void main()

{

//나선형으로바꾸기(0제거하기)

int num = 0; // 초기시작값

int turn = 1; //방향변화값

int size = 5; // *몇배열인지

int i = -1, j = 0; //i는가로j는세로인덱스

 

while (1) //break전까지무한반복

{

for (int l = 0; l < size; l++)

{

num += 1;

i += turn;

buf[i][j] = num;

}

 

size = size - 1; //위에5개를하고44 33 22 11 하기위해

 

if (size <= 0) break

 

for (int m = 0; m < size; m++)

{

num += 1;

j += turn;

buf[i][j] = num; //i의처음시작은4, j =1

}

turn *= -1; //방향변경

}

 

 

Display();

}

void Display()

{

int i, j;

for (i = 0; i < 5; i++)

{

for (j = 0; j < 5; j++)

{

printf("%3d\t", buf[i][j]);

}

printf("\n");

}

}