2020年MOOCC言語プログラム設計精髄第13週プログラミング問題練兵

55072 ワード

2最高点の学生を探す
テーマ内容:以下のプログラムの機能は動的配列プログラミングで任意のmクラスの学生(クラスごとにn人の学生)のある授業の成績を入力し、最高点を計算し、その最高点の成績を持つ学生が何番目のクラスの何番目の学生であるかを指摘する.ここで、mおよびnの値は、ユーザがキーボードから任意に入力する(mおよびnの上限値は限定されない).プログラムの実行結果は以下の通りである:Input array size m,n:3,4↙ Input 34 array: 80 82 63 74↙ 60 81 75 68↙ 87 91 78 92↙ maxScore=92,class=3,number=4入力フォーマット:入力配列サイズフォーマット:“%d,%d”入力配列要素フォーマット:“%d”出力フォーマット:入力配列サイズのヒント情報:“Input array size m,n:”入力配列要素のヒント情報:“Input%d%d array:”出力データフォーマット:“maxScore=%d,class=%d,number=%d”
     /** _________ **/    
        printf            ,    。
#include  
#include  
void InputScore(int *p, int m, int n);
int  FindMax(int *p, int m, int n, int *pRow, int *pCol);             
int main()
{ 
    int  *pScore, m, n, maxScore, row, col;
    printf("Input array size m,n:
"
); scanf("%d,%d", &m, &n); /**_________**/ pScore=(int *)calloc(m*n,sizeof(int)); /* */ if (pScore == NULL) { printf("No enough memory!
"
); exit(0); } InputScore(pScore, m, n); /**_________**/ maxScore = FindMax(pScore,m,n,&row,&col); printf("maxScore = %d, class = %d, number = %d
"
, maxScore, row+1, col+1); free(pScore); /* */ return 0; } /* : m n */ /**_________**/ void InputScore(int *p, int m, int n) { int i, j; printf("Input %d*%d array:
"
, m, n); for (i=0; i<m; i++) { for (j=0; j<n; j++) { /**_________**/ scanf("%d", &(p[i*n+j])); } } } /* : m n , */ int FindMax(int *p, int m, int n, int *pRow, int *pCol) { int i, j, max = p[0]; /**_________**/ *pRow=0; /**_________**/ *pCol=0; for (i=0; i<m; i++) { for (j=0; j<n; j++) { /**_________**/ if (max<p[i*n+j]) { max = p[i*n+j]; *pRow = i; /* */ *pCol = j; /* */ } } } return max; }

3プログラムの変更
テーマ内容:以下のプログラムの機能は、m人の学生(最大30人)n科目(最大5科目)の成績を入力し、各学生の各科目の総得点と平均点を計算して印刷することです.ここで、mおよびnの値は、ユーザがキーボードから入力する.希望の実行結果は、プログラムの実行結果は以下の通りです:How many students?4↙ How many courses? 3↙ Input scores: 60 60 60↙ 70 70 70↙ 80 80 80↙ 90 90 90↙ Result:60 60 60 180 60.0 70 70 70 210 70.0 80 80 240 80.0 90 90 270 90.0入力フォーマット:
学生数、カリキュラム数、成績の入力フォーマットはすべて:“%d”出力フォーマット:学生数プロンプト情報を入力:“How many students?”カリキュラム数プロンプト情報を入力:“How many courses?”成績のプロンプト情報を入力:“Input scores:”出力結果のプロンプト情報:“Result:”学生毎の授業成績の出力フォーマット:“%4 d”合計スコアと平均スコアの出力フォーマット:“%5 d%6.1 f”
     /**    FOUND    **/    
        printf            ,    。
#include  
#define STUD   30      /*           */
#define COURSE 5       /*            */
void  Total(int *pScore, int sum[], float aver[], int m, int n);
void  Print(int *pScore, int sum[], float aver[], int m, int n);
int main()
{
    int     i, j, m, n, score[STUD][COURSE], sum[STUD];
    float   aver[STUD];
    printf("How many students?
"
); scanf("%d", &m); printf("How many courses?
"
); scanf("%d", &n); printf("Input scores:
"
); for (i=0; i<m; i++) { for (j=0; j<n; j++) { scanf("%d", &score[i][j]); } } Total(*score, sum, aver, m, n); Print(*score, sum, aver, m, n); return 0; } void Total(int *pScore, int sum[], float aver[], int m, int n) { int i, j; for (i=0; i<m; i++) { sum[i] = 0; for (j=0; j<n; j++) { /** FOUND **/ sum[i] = sum[i] + pScore[i*COURSE+j]; } aver[i] = (float) sum[i] / n; } } void Print(int *pScore, int sum[], float aver[], int m, int n) { int i, j; printf("Result:
"
); for (i=0; i<m; i++) { for (j=0; j<n; j++) { /** FOUND **/ printf("%4d", pScore[i*COURSE+j]); } printf("%5d%6.1f
"
, sum[i], aver[i]); } }

4マトリクス転置
题目内容:次のプログラムの机能は2次元配列の列の指针を使って関数の実参として、mを计算して出力します×n次行列の回転行列.ここで、mおよびnの値は、ユーザがキーボードから入力する.mとnの値はいずれも10を超えないことが知られている.プログラムの実行結果は以下の通りである:Input m,n:4,5↙ Input 4*5 matrix: 45 89 90 26 65↙ 21 34 56 77 99↙ 31 25 62 50 46↙ 78 69 84 73 15↙ The transposed matrix is: 45 21 31 78 89 34 25 69 90 56 62 84 26 77 50 73 65 99 46 15
     /** _________ **/    
        printf            ,    。
#include 
#define M 10
#define N 10
void Transpose(int *a, int *at, int m, int n);
void InputMatrix(int *a, int m, int n);
void PrintMatrix(int *at, int n, int m); 
int main()
{
    int s[M][N], st[N][M], m, n;
    printf("Input m, n:
"
); scanf("%d,%d", &m, &n); /** _________ **/ InputMatrix(*s, m, n); /** _________ **/ Transpose(*s,*st,m,n); printf("The transposed matrix is:
"
); PrintMatrix(*st, n, m); return 0; } /* : m*n a at */ void Transpose(int *a, int *at, int m, int n) { int i, j; for (i=0; i<m; i++) { for (j=0; j<n; j++) { /** _________ **/ at[j*N+i]=a[i*N+j]; } } } /* : m*n a */ void InputMatrix(int *a, int m, int n) { int i, j; printf("Input %d*%d matrix:
"
, m, n); for (i=0; i<m; i++) { for (j=0; j<n; j++) { /** _________ **/ scanf("%d", &a[i*N+j]); } } } /* : n*m at */ void PrintMatrix(int *at, int n, int m) { int i, j; for (i=0; i<n; i++) { for (j=0; j<m; j++) { /** _________ **/ printf("%-5d", at[i*N+j]); } printf("
"
); } }

5昇順ソートの配列に要素を挿入
テーマの内容:関数のプログラミングで実現して1つの昇順に並べ替えた配列の中でxが挿入すべき位置を探して、xを配列の中に挿入して、配列要素を依然として昇順に並べます.ヒント:挿入(Insertion)は配列の基本操作の1つです.挿入法ソートアルゴリズムの鍵は、正しい挿入位置を見つけて、挿入位置とその後のすべての要素を順番に移動し、この位置を空けて挿入する要素を入れることです.挿入ソートの原理を図に示す:プログラム実行結果例:Input array size:5↙ Input array: 1 3 5 7 9↙ Input x: 4↙ After insert 4:1 3 4 5 7 9入力フォーマット:挿入前配列要素個数、配列要素、挿入する要素xの入力フォーマットはすべて:“%d”出力フォーマット:挿入前配列要素個数ヒント情報を入力:“Input array size:”挿入前に昇順に並べられた配列要素ヒント情報を入力:“Input array:”挿入する要素xヒント情報を入力:「Input x:」出力x挿入後の配列要素ヒント情報:「After insert%d:」配列要素出力フォーマット:「%4 d」
#include 

int main(){
    int i,j,n,*a,x;
    printf("Input array size:
"
); scanf("%d",&n); a=(int *)calloc(n+1,sizeof(int)); printf("Input array:
"
); for(i=0;i<n;i++){ scanf("%d",&a[i]); } printf("Input x:
"
); scanf("%d",&x); for(i=0;i<n;i++){ if(x<a[i]) break; } for(j=n-1;j>=i;j--){ a[j+1]=a[j]; } a[i]=x; printf("After insert %d:
"
,x); for(i=0;i<n+1;i++) printf("%4d",a[i]); }

6平均、中央値、および衆数の計算
テーマ内容:調査データ分析(Survey data analysis)では、常に平均数、中位数、衆数を計算する必要がある.関数プログラミングで40個の入力データ(1~10の間の任意の整数を取る)の平均数(Mean)、中位数(Median)、衆数(Mode)を計算する.中位数とは、配列の中央に並ぶ数のこと.衆数とは、配列の中で最も出現回数が多い数(2つ以上の入力データが同じである場合を考慮しない).ヒント:中位数を計算する際には、まず配列を昇順に並べ替えるソート関数を呼び出し、並べ替え後の配列の中央位置の要素answer[n/2]を取り出すを選択すると、中位数が得られます.配列要素の個数が偶数であれば、中位数は、配列の中央にある2つの要素の算術平均値に等しくなります.衆数とは、40個の入力データの中で最も出現回数が多いものです.衆数を計算する際には、まず、異なる値の入力データが出現した回数を統計し、次に出現回数が最も多かったデータを探し出します.プログラム実行結果例:Input the feedback of 40 students:10 9 10 8 7 6 5 10 8↙ 8 9 7 6 10 9 8 8 7 7↙ 6 6 8 8 9 9 10 8 7 7↙ 9 8 7 9 7 6 5 9 8 7↙ Mean value=7 Median value=8 Mode value=8入力フォーマット:“%d”出力フォーマット:入力データのヒント情報:“Input the feedback s of 40 students:”平均数出力:“Mean value=%d”中位数出力:“Median value=%d”衆数出力:“Mode value=%d”
#include 
#define N 40
#define MAX 11

void BubbleSorting(int *a,int n){
    int i,j,temp;
    for(i=0;i<n-1;i++){
        for(j=n-1;j>i;j--){
            if(a[j-1]>a[j]){
                temp=a[j];
                a[j]=a[j-1];
                a[j-1]=temp;
            }
        }
    }
}

int main(){
    int *a,median,mode=1,sum=0,i;
    int times[MAX]={0};
    a=(int *)calloc(N,sizeof(int));
    printf("Input the feedbacks of 40 students:
"
); for(i=0;i<N;i++){ scanf("%d",&a[i]); times[a[i]]++; sum+=a[i]; } printf("Mean value=%d
"
,sum/N); BubbleSorting(a,N); if(N%2!=0) median=a[N/2]; else median=(a[N/2]+a[N/2-1])/2; printf("Median value=%d
"
,median); for(i=1;i<MAX;i++){ if(times[i]>times[mode]) mode=i; } printf("Mode value=%d
"
,mode); }