2019 C语言程序设计基础期末题详解

简介

为了提升各位同学面对期末考试的信心,同时尽可能的解决同学们的问题,于是决定简单的把19年的题写一下题解。
简单分析可以发现期末考题的考试内容主要还是基础语法的考察,基本不太需要怎么动脑子,大家只要掌握好基础的操作就可以轻松应对考试了。
其实是由于长期没写blog,又不想动脑子想主题,于是决定写一下期末题解水一篇文章

原题

还没有做过这些题的同学,强烈建议先自己试着做一下再来看题解,看能不能稍微学到一点点东西。如果没有自己写过而只是单纯的看代码,我相信这样的提升是不大的

第一题

1st

第二题

2nd

第三题

3rd

第四题

4th

第五题

5th

题解

注意:这里的题解是按照我的思路阐述的,但是编程永远不会只有一种解
大家不要被限制住想象力,多思考,多实践

第一题

考点:

  • for循环嵌套

这题考点很简单,就是简单的for循环嵌套。
注意的是内存循环显然是有两个循环的,只用一个循环会比较难实现。
不多赘述

第二题

考点:

  • 循环嵌套
  • 二维数组
  • 寻找最大最小值

仍然是循环题,不过加入了寻找最大最小值这一经典结构。
我们需要对每行遍历,也需要对每列遍历,来找出每行每列的最大最小值。
循环找出的结果可以分别存储在数组中。
最后一步找最大值也简单的遍历一下存储最小值的数组就好啦~

第三题

考点:

  • while循环输入不定大小数组
  • 字符串操作
  • 整数按位操作

这题稍有难度,考点是字符串操作、ascii码的操作、利用while循环输入不定大小数组等等的。
我们来简单分析一下这个题。

整体框架
整体框架非常明显:

  • 首先创建两个数组,一个用来存储整数,一个用来存储字符串
  • 然后对每个整数进行处理,变成对应的字符串,存储起来
  • 最后把每个字符串按要求输出

Very Very simple,是吧(/▽\)
然后把每个部分具体实现就可以了
显然第二步是重点,我们用一个函数来实现:

转换函数
首先看这个函数的功能:把整数进行相应的转换存在一个字符串里面
所以很明显他的形参有两个: 整数 字符型指针


然后再来想怎么实现具体功能:
相信大家对整数从低位到高位都很熟悉了,但是从高位到低位处理没有太多经验
那么我们显然可以把这个整数颠倒过来进行处理就行了

while (num)
    {
        num_rev = num_rev * 10 + num % 10;
        num /= 10;
    }


在这之后,我们只需要逮着这个 num_rev 进行各种风骚的操作就可以了。
需要注意的是当转换完成后一定不要忘记在字符串的末尾加上结束符 \000

第四题

考点:

  • 指针

emmmmmmmmmmmmmmmmmm
水题,略

第五题

考点:

  • 结构体
  • 排序算法
  • 结构体指针

这题啊,这题是语法题。指针搞明白了,结构体用熟了,没啥问题。
排序算法只需要在整数数组排序算法的基础上改两个地方就行了:

  1. 判断条件
  2. 交换数值

参考答案

再次提醒各位:编程没有唯一解,这只是我自己的解法,还望大家能够多思考,多实践,找到自己的代码风格

本来应该写点注释好好讲讲的,但是毕竟水文章嘛~水嘛ο(=•ω<=)ρ⌒☆

第一题

#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < i; j++)
        {
            printf(" ");
        }
        for (int j = 0; j < n; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

第二题

#include <stdio.h>
int main()
{
    int num[3][5];
    int min_row[3];
    int min_clm[5];
    int max;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            scanf("%d", &num[i][j]);
        }
    }

    for (int i = 0; i < 3; i++)
    {
        int min = num[i][0];
        for (int j = 0; j < 5; j++)
        {
            min = min < num[i][j] ? min : num[i][j];
        }
        min_row[i] = min;
    }
    for (int j = 0; j < 5; j++)
    {
        int min = num[0][j];
        for (int i = 0; i < 3; i++)
        {
            min = min < num[i][j] ? min : num[i][j];
        }
        min_clm[j] = min;
    }

    max = min_row[0];
    for (int i = 0; i < 3; i++)
    {
        max = max > min_row[i] ? max : min_row[i];
    }
    for (int j = 0; j < 5; j++)
    {
        max = max > min_clm[j] ? max : min_clm[j];
    }

    printf("%d", max);

    return 0;
}

第三题

#include <stdio.h>

void trans(int, char *);

int main()
{
    int num[200];
    int n = 0;
    scanf("%d", &num[n]);
    while (num[n] != -1)
    {
        n++;
        scanf("%d", &num[n]);
    }
    char str[n][20];

    for (int i = 0; i < n; i++)
    {
        trans(num[i], str[i]);
    }

    for (int i = 0; i < n; i++)
    {
        printf("%s ", str[i]);
    }
    return 0;
}

void trans(int num, char *str)
{
    int num_rev = 0;
    int i = 0;
    while (num)
    {
        num_rev = num_rev * 10 + num % 10;
        num /= 10;
    }
    do
    {
        int double_num = num_rev % 10 * 10 + num_rev % 100 / 10;
        if (double_num < 26)
        {
            str[i++] = 'A' + double_num;
            num_rev /= 100;
        }
        else
        {
            str[i++] = 'A' + num_rev%10;
            num_rev /= 10;
        }
    }while(num_rev);
    str[i] = 0;
    return;
}

第四题

#include <stdio.h>

int sum(int *, int);

int main()
{
    int num[5];
    for (int i = 0; i < 5; i++)
    {
        scanf("%d", &num[i]);
    }
    printf("%d", sum(num, 5));
    return 0;
}

int sum(int *num, int n)
{
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += num[i];
    }
    return sum;
}

第五题

#include <stdio.h>
#include <string.h>

struct fruit_info
{
    int ID;
    char name[20];
    double sales;
    double price;
    double profit;
};

void set(struct fruit_info *);
void print(struct fruit_info);
void fruitcpy(struct fruit_info *, struct fruit_info *);
void swap(struct fruit_info *, struct fruit_info *);
void sort(struct fruit_info[], int);

int main()
{
    struct fruit_info fruit[6];
    for (int i = 0; i < 6; i++)
    {
        set(&fruit[i]);
    }
    sort(fruit, 6);
    for (int i = 0; i < 6; i++)
    {
        print(fruit[i]);
    }
    return 0;
}
void set(struct fruit_info *fruit)
{
    scanf("%d", &fruit->ID);
    scanf("%s", fruit->name);
    scanf("%lf", &fruit->sales);
    scanf("%lf", &fruit->price);
    fruit->profit = fruit->sales * fruit->price;
    return;
}
void print(struct fruit_info fruit)
{
    printf("%d ", fruit.ID);
    printf("%s ", fruit.name);
    printf("%.2lf ", fruit.sales);
    printf("%.2lf ", fruit.price);
    printf("%.2lf\n", fruit.profit);
    return;
}
void swap(struct fruit_info *a, struct fruit_info *b)
{
    struct fruit_info tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
    return;
}
void sort(struct fruit_info arr[], int len)
{
    int i, j;
    for (i = 0; i < len - 1; i++)
    {
        int min = i;
        for (j = i + 1; j < len; j++)
            if (arr[j].profit < arr[min].profit)
                min = j;
        swap(&arr[min], &arr[i]);
    }
}