C語言程序設計精髓(MOOC第13周 )題

第13周練兵區編程題

1. 尋找最高分成績的學生

題目內容:
下面程序的功能是用動態數組編程輸入任意m個班學生(每班n個學生)的某門課的成績,計算最高分,並指出具有該最高分成績的學生是第幾個班的第幾個學生。其中,m和n的值由用戶從鍵盤任意輸入(不限定m和n的上限值)。

#include  <stdio.h>
#include  <stdlib.h>
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:\n");
    scanf("%d,%d", &m, &n);
    pScore = (int*)malloc(m*n*sizeof(int)); /* 申請動態內存 */
    if (pScore == NULL)
    {
        printf("No enough memory!\n");
        exit(0);
    }
    InputScore(pScore, m, n);
    maxScore = FindMax(pScore,m,n,&row,&col);
    printf("maxScore = %d, class = %d, number = %d\n", 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:\n", 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 (p[i*n+j] > max)
            {
                max = p[i*n+j];
                *pRow = i;       /*記錄行下標*/
                *pCol = j;             /*記錄列下標*/
            }
        }
    }
    return max;
}

2. 程序改錯

題目內容:
下面程序的功能是輸入m個學生(最多爲30人)n門課程(最多爲5門)的成績,然後計算並打印每個學生各門課的總分和平均分。其中,m和n的值由用戶從鍵盤輸入。

在這裏插入圖片描述

#include  <stdio.h>
#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?\n");
    scanf("%d", &m);
    printf("How many courses?\n");
    scanf("%d", &n);
    printf("Input scores:\n");

    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++)
        {
            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:\n");
    for (i=0; i<m; i++)
    {
        for (j=0; j<n; j++)
        {
            printf("%4d\t", pScore[i*COURSE+j]);
        }
    printf("%5d\t%6.1f\n", sum[i], aver[i]);
    }
}

4. 矩陣轉置

題目內容:
下面程序的功能是用二維數組的列指針作爲函數實參,計算並輸出m×n階矩陣的轉置矩陣。其中,m和n的值由用戶從鍵盤輸入。已知m和n的值都不超過10。程序的運行結果如下所示:

在這裏插入圖片描述

#include <stdio.h>
#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:\n");
    scanf("%d,%d", &m, &n);
    InputMatrix(*s, m, n);
    Transpose(*s, *st, m, n);
    printf("The transposed matrix is:\n");
    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*M+i] = a[i*N+j];
        }
    }
}
/* 函數功能:輸入m*n矩陣a的值 */
void InputMatrix(int *a, int m, int n)
{
    int i, j;
    printf("Input %d*%d matrix:\n", 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*M+j]);
        }
        printf("\n");
    }
}


5. 在升序排序的數組中插入一個元素

題目內容:
用函數編程實現在一個按升序排序的數組中查找x應插入的位置,將x插入數組中,使數組元素仍按升序排列。

#include<stdio.h>
int main()
{
    int n,x;
    int i, j = 0;
    int a[200] = {0};
    printf("Input array size:\n");
    scanf("%d",&n);
    printf("Input array:\n");
    for(i = 0; i < n; i++)
        scanf("%d",&a[i]);
    printf("Input x:\n");
    scanf("%d",&x);
    while(a[j] < x)
        j++;
    for(i = n - 1;i >= j; i--)
    {
        a[i + 1] = a[i];
    }
    a[j] = x;
    printf("After insert %d:\n",x);
    for(i = 0; i <= n; i++)
        printf("%4d",a[i]);
    return 0;
}

6. 計算平均數、中位數和衆數

題目內容:
在調查數據分析(Survey data analysis)中經常需要計算平均數、中位數和衆數。用函數編程計算40個輸入數據(是取值1—10之間的任意整數)的平均數(Mean)、中位數(Median)和衆數(Mode)。中位數指的是排列在數組中間的數。衆數是數組中出現次數最多的那個數(不考慮兩個或兩個以上的輸入數據出現次數相同的情況)。

#include<stdio.h>
#include<stdlib.h>
int cmp(const void* a,const void* b)
{
    const int *x = (const int*)a;
    const int *y = (const int*)b;
    if(*x -*y == 0)
        return 0;
    else if(*x - *y > 0)
        return 1;
    else
        return -1;
}
int Mean(int a[], int n);
int Median(int a[], int n);
int Mode(int a[], int n);
int main()
{
    int stu[40] = {0};
    int mean,med,mode;
    printf("Input the feedbacks of 40 students:\n");
    for(int i = 0; i < 40; i++)
        scanf("%d",&stu[i]);
    mean = Mean(stu,40);
    med = Median(stu,40);
    mode = Mode(stu,40);
    printf("Mean value=%d\n",mean);
    printf("Median value=%d\n",med);
    printf("Mode value=%d\n",mode);
    return 0;
}

int Mean(int a[], int n)
{
    int i,sum = 0;
    for(i = 0; i < n; i++)
        sum += a[i];
    return sum / n;
}

int Median(int a[], int n)
{
    qsort(a,n,sizeof(int),cmp);
    return a[n/2];
}

int Mode(int a[], int n)
{
    int num[11] = {0};
    int max = 0;
    int pos = 1;
    for(int i = 0; i < n; i++)
        num[a[i]]++;
    for(int i = 1; i <= 10; i++)
    {
        if(num[i] > max)
        {
            max = num[i];
            pos = i;
        }

    }
    return pos;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章