프로그래밍/C,C++

[ANSI C 프로그래밍]8,9장 프로그래밍 연습

수학가형 2022. 1. 6. 16:18

단원:

8. 배열

9. 문자배열과 문자열

 

 

[프로그래밍 연습 8.5]학생 100명의 시험결과가 다음과 같이 입력된다고 하자. (학생번호  과목1점수  과목2점수 과목3점수)

ex)

      1  80  70  56

      2  40  50  100

먼저 데이터를 읽어 들인 다음과 같은 계산을 하는 프로그램을 작성하시오.

(a) 학생의 과목 총점

(b) 과목에 대하여 최고 점수와 해당 학생번호

(c) 최고 합산 점수를 기록한 학생번호

코드:

#include<stdio.h>
 
main()
{
         int i, m, n, k, column, row, stop, mode;
         int scoredata[100][4] = { {0,0,0,0} };
 
         //데이터 입력부
         for (row = 0;; row++)
         {
                  printf("%d 번째 학생의 학생번호,과목1 점수, 과목2 점수, 과목 3 점수를 입력하세요.\n 입력을 중단하려면 -1 입력하세요\n", (row + 1));
                  for (column = 0; column < 4; column++)
                  {
                           scanf("%d", &scoredata[row][column]);
                           if (scoredata[row][0] == -1)
                                    break;  //입력 중단조건
                  }
                  if (scoredata[row][0] == -1)
                           break;  //입력 중단조건
         }
 
         //총점 계산부
         int total[100];
         for (row = 0;; row++)
         {
                  total[row] = scoredata[row][1] + scoredata[row][2] + scoredata[row][3];
                  if (scoredata[row][0] == -1)
                           break;
         }
 
select:   //모드 선택부
 
         printf("계산하고자 하는 정보를 입력하세요.\n 1번은 특정 학생의 총점 출력\n 2번은 특정 과목에 대하여 최고점 해당 학생번호\n 3번은 최고 합산 점수를 기록한 학생의 학생번호와 총점입니다.\n");
         scanf("%d", &mode);
 
         switch (mode)
         {
 
         case(1):   //총점 출력
         {
                  printf("총점을 구할 학생의 학번을 입력하세요.\n");
                  scanf("%d", &i);
                  for (row = 0;; row++)
                  {
                           if (i == scoredata[row][0]) //학번i scoredata [row][0] 학번 데이터와 일치하는 경우에만 출력
                           {
                                    printf("%d\n", total[row]);
                                    break;
                           }
                  }
                  break;
         }
 
         case(2):       // 과목에 대하여 최고점수 해당 학생번호
         {
                  printf("최고점수 해당 학생을 구할 과목번호를 입력하세요\n");
                  int scoreindex, studentindex[100] = { 0 }, maxscore = 0;
                  int naturalnumber[100];
                  int index;
 
                  scanf("%d", &scoreindex);
                  for (row = 0; row < 100; row++)
                  {
                           if (scoredata[row][scoreindex] >= maxscore)
                                    maxscore = scoredata[row][scoreindex];
                  }
 
                  for (row = 0; row < 100; row++)
                  {
                           if (scoredata[row][scoreindex] == maxscore)
                                    studentindex[row] = scoredata[row][0];    //maxscore 점수가 같은 학생들의 학번을 변수 studentindex 저장
                  }
 
                  printf("%d 과목 최고점수는 %d, 최고점 득점 학생의 학번은\n", scoreindex, maxscore);
                  for (row = 0; row < 100; row++)
                  {
                           if (studentindex[row] != 0)
                                    printf("%d, ", studentindex[row]);     //studentindex 0 아닌 데이터만 출력
                  }
                  break;
         }
 
         case(3):     //최고 합산 점수인 학생번호 출력
         {
                  int maxtotal = 0, maxstudent[100] = { 0 };
                  int stumaxindex[100] = { 0 };
 
                  for (row = 0; row < 100; row++)
                  {
                           if (total[row] >= maxtotal)
                                    maxtotal = total[row];
                  }
 
                  for (row = 0; row < 100; row++)
                  {
                           printf("최고 합산 점수를 얻은 학생들의 학번은:\n");
                           if (maxtotal == total[row])
                                    printf("%d,", scoredata[row][0]);
                  }
                  printf("이며 합산 점수는 %d 점입니다.\n", maxtotal);
                  break;
         }
         default:
         {
                  printf("올바른 입력이 아닙니다.\n");
                  goto select;
         }
         }
}

 

 

[프로그래밍 연습 8.7]다음처럼 동일한 행과 열의 개수를 가지는 개의 행렬을 입력받아 곱셈을 통하여 세번째 행렬이 나오는 프로그램을 작성하라.

A = [a(i,j)]  B = [b(i,j)]    i = 1, … n,  j = 1, …, n

C = [c(i,j)]   c(i,j)   = Sum_k=1to n ( a(i,k)b(k,j) )

코드:

#include<stdio.h>
 
main()
{
         int row, column, size, i, j, k;
         float matrixA[100][100] = { 0 }, matrixB[100][100] = { 0 }, matrixM[100][100] = { 0 };
         float row_A[100] = { 0 }, column_B[100] = { 0 };
         float element, product;
         printf("정사각행렬의 곱셈을 구하는 프로그램입니다. 행과 열의 개수를 지정하세요.");
         scanf("%d", &size);
retype: //재입력
         //행렬 A입력부
         printf("행렬 A 입력하세요. 원소의 구분은 띄어쓰기, 행의 구분은 개행을 사용합니다.\n");
         for (row = 0;; row++)
         {
                  if (row >= size)
                  {
                           printf("행렬 A 입력이 완료되었습니다.\n");
                           break;
                  }
                  else
                  {
                           for (column = 0;column<size; column++)
                                    scanf("%f", &matrixA[row][column]);
                  }
         }
         //행렬 B입력부
         printf("행렬 B 입력하세요. 원소의 구분은 띄어쓰기, 행의 구분은 개행을 사용합니다.\n");
         for (row = 0;; row++)
         {
                  if (row >= size)
                  {
                           printf("행렬 B 입력이 완료되었습니다.\n");
                           break;
                  }
                  else
                  {
                           for (column = 0; column<size; column++)
                           {
                                    scanf("%f", &matrixB[row][column]);
                           }
                  }
         }
         //행렬 입력 확인부
         printf("입력한 행렬은 다음과 같습니다.\n\n");
         printf("행렬 A:\n");
         for (row = 0; row < size; row++)
         {
                  for (column = 0; column < size; column++)
                  {
                           printf("%7.2f", matrixA[row][column]);
                  }
                  printf("\n");
         }
         printf("행렬 B:\n");
         for (row = 0; row < size; row++)
         {
                  for (column = 0; column < size; column++)
                  {
                           printf("%7.2f", matrixB[row][column]);
                  }
                  printf("\n");
         }
         printf("\n입력한 행렬이 맞으면 숫자 1, 다시 입력하려면 아무 키나 누르세요.\n");
         //행렬 계산부//
         for (row = 0; row < size; row++)
         {
                  for (column = 0; column < size; column++)
                  {
                           element = 0;
                           i = row;
                           j = column;
                           product = 0;
                           element = 0;
                           int k;
                           for (k = 0; k < size; k++)
                           {
                                    product = matrixA[i][k] * matrixB[k][j];
                                    element = element + product;
                           }
                           matrixM[row][column] = element;
                  }
         }
         //입력 확인부//
         scanf("%d", &k);
         if (k == 1)
         {
                  printf("-------------------------------------------------------------\nA X B:\n");
                  for (row = 0; row < size; row++)
                  {
                           for (column = 0; column < size; column++)
                           {
                                    printf("%7.2f", matrixM[row][column]);
                           }
                           printf("\n");
                  }
                  printf("-------------------------------------------------------------\n");
         }
         else
                  goto retype;
}

 

 

[프로그래밍 연습 8.9]선택정렬(선택 정렬 - 위키백과, 우리 모두의 백과사전 (wikipedia.org))을 구현하시오.

코드:

#include<stdio.h>
 
main()
{
         int i, j, k, maxvalue=0, maxindex, tmp;
         int arrayee[9] = { 1,6,2,4,5,9,8,3,7 };
         printf("정렬 :\n");
         for (k = 0; k < 9; k++)
                  printf("%d", arrayee[k]);
         printf("\n");
         for (j = 8; j > 0; j--)
         {
                  for (i = 0; i <= j; i++)
                  {
                           if (arrayee[i] > maxvalue)
                           {
                                    maxvalue = arrayee[i];
                                    maxindex = i;
                           }
                  }
                  tmp = arrayee[j];
                  arrayee[j] = maxvalue;
                  arrayee[maxindex] = tmp;
                  maxvalue = 0;
         }
         printf("정렬 결과:\n");
         for (k = 0; k < 9; k++)
                  printf("%d", arrayee[k]);
}

 

 

[프로그래밍 연습 8.10]이진탐색(이진 검색 알고리즘 - 위키백과, 우리 모두의 백과사전 (wikipedia.org))을 구현하시오.

코드:

#include<stdio.h>
 
main()
{
         float arrayee[9] = { 8,12,23,47,75,106,117,708,900 };
         int maxindex = 8, lowindex = 0, index;
         float find;
        
         while (1 == 1)
         {
                  maxindex = 8, lowindex = 0;
                  scanf("%f", &find);
 
                  while (1 == 1)
                  {
                           if (lowindex > maxindex)
                           {
                                    printf("can't find %.2f\n", find);
                                    break;
                           }
                           index = (maxindex + lowindex) / 2;
                           if (arrayee[index] < find)
                                    lowindex = index + 1;
                           else if (arrayee[index] > find)
                                    maxindex = index - 1;
                           else if (arrayee[index] == find)
                           {
                                    printf("%.2f 위치 = 왼쪽에서 %d 번째 위치", find, index + 1);
                                    break;
                           }
                  }
         }
}

 

 

[프로그래밍 연습 9.8]키보드로 문자열을 읽어 문자열이 왼쪽이나 오른쪽 방향 어느쪽으로 읽어도 같은지 검사하는 프로그램을 작성하시오.  (예를 들어 Madam 이나 Anna 앞에서나 뒤로부터 알파벳순서가 동일하다)

코드:

#include<stdio.h>
#include<string.h>
 
main()
{
char string[20] = {0};
char compare[20] = { 0 };
int i, k, index, tmp = 0;
 
gets(string);
k = strlen(string);
index = k - 1;
for (i = 0;i<=index+1; i++) //모든 소문자를 대문자로 변경
{
         if ((97 <= string[i])||(string[i] <= 122)) //ASCII 코드값을 사용하여 소문자->대문자 변환
                  string[i] = string[i] - 32;
}
for (i = 0; i<=index ; i++)
{
         compare[index - i] = string[i];
}
 
for(i=0 ; i<index ; i++)
{
         if (compare[i] != string[i])
         {
                  printf("같지 않습니다.\n");
                  tmp = 1;
                  break;
         }
}
if (tmp == 0)
         printf("같습니다.\n");
}

 


문제 소스:

책정보, ANSI C 프로그래밍 : 네이버 책 (naver.com)

 

ANSI C 프로그래밍

책으로 만나는 새로운 세상

book.naver.com