发布于 

2020全国大学生计算机技能应用大赛决赛C语言编程题摘录

记录决赛两道编程题,比赛时由于时间紧张和经验不足,未有效完成。
现记录并完善。

综合应用题

题目

2020年是特殊的一年,COVID-19 的传播给全世界都带来了极大的威胁。中国在疫情防治工作上有着突出表现,向社会、世界都做出了极大的贡献,让我们一同为祖国点赞。疫情防治工作,重在预防,各个地区都应当相互学习合适又优秀的防疫措施。如果能够依据现有的疫情数据分析出具有相似疫情情况的地区,那么对于挖掘疫情发展规律、分析疫情防控效能和落实疫情防治举措都会有积极的影响。现给出5个地区的当前疫情数据,请分析出疫情最相似的两个地区。具体要求如下:

  1. 使用C语言程序设计实现;

  2. 为每个地区的疫情情况构建结构体,该结构体包括以下属性:
    地区名、新增患者数、现有患者数、累积患者数、治愈患者数、死亡患者数。

  3. 相似程度算法如下:

    其中,i 指的是 x 和 y 对象的第 i 维特征。sim越大,则两个对象越相似。

  4. 现有的5个地区的当前疫情数据是:

    序号 地区名 新增患者数 现有患者数 累积患者数 治愈患者数 死亡患者数
    1 cityA 3 3 582 573 6
    2 cityB 4 3 238 234 1
    3 cityC 5 3 197 191 3
    4 cityD 3 2 692 683 7
    5 cityE 6 2 171 163 6
  5. 要求提供数据输入功能。

    要求输出部分必须有最相似的两个地区的名字。

    输入输出样例:

(有改编)

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <math.h>
#include <string.h>
typedef struct _City
{
char name[50];
int add;
int exist;
int count;
int cure;
int die;
} City;
// 定义_similarity结构体用于存最大的相似值
typedef struct _similarity
{
char name1[50];
char name2[50];
double sim_number;
} similarity;
// 根据公式求相似值
double sim(City x, City y)
{
int sum1 = 0, sum2 = 0, sum3 = 0;
sum1 = x.add * y.add + x.exist * y.exist + x.count * y.count + x.cure * y.cure + x.die * y.die;
sum2 = x.add * x.add + x.exist * x.exist + x.count * x.count + x.cure * x.cure + x.die * x.die;
sum3 = y.add * y.add + y.exist * y.exist + y.count * y.count + y.cure * y.cure + y.die * y.die;
return sum1 / sqrt(sum2) / sqrt(sum3);
}
int main(int argc, char *argv[])
{
int n;
printf("Pleas input the number of cities:");
scanf("%d", &n);
City city[n];
printf("\nPleas input the information of %d cities:\n", n);
//输入各个结构体
for (int i = 0; i < n; i++)
{
printf("NO.%d city:\n", i + 1);
printf("\tCity name:");
scanf("%s", city[i].name);
printf("\tNumber of new patients:");
scanf("%d", &city[i].add);
printf("\tNumber of existing patients:");
scanf("%d", &city[i].exist);
printf("\tCumulative number of patients:");
scanf("%d", &city[i].count);
printf("\tNumber of patients cured:");
scanf("%d", &city[i].cure);
printf("\tNumber of patients died:");
scanf("%d", &city[i].die);
printf("\n");
}
//先将最相似定义为第一个city和第二个city
similarity most_like;
strcpy(most_like.name1, city[0].name);
strcpy(most_like.name2, city[1].name);
most_like.sim_number = sim(city[0], city[1]);
printf("-------------------------------------------------------------------\n");
printf("The results of the analysis between each two cities are as follows:\n");
//分析每两个之间的相似值,并记录相似值最大的那两个
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
printf("The similarity of epidemic situation between %s and %s: %.6f\n", city[i].name, city[j].name, sim(city[i], city[j]));
if (most_like.sim_number < sim(city[i], city[j]))
{
strcpy(most_like.name1, city[i].name);
strcpy(most_like.name2, city[j].name);
most_like.sim_number = sim(city[i], city[j]);
}
}
}
printf("\n");
printf("%s and %s are the most similar!", most_like.name1, most_like.name2);
return 0;
}

程序设计题

题目

实现一个矩阵左右循环移动的小程序。用户通过输入数据,程序作出相应动作。规定:函数fun1的功能是向左移动,函数fun2的功能是向右移动,当用户输入q时,结束程序。在给出代码框架中,可以决定是否使用全局变量r。

参考输入输出:

要求:

  1. 不改变已给出的代码;
  2. 补充fun1和fun2函数;
  3. 补充main()函数两个注释之间的代码:要求在此补充菜单式的控制流程,要求能够实现对上次变化后的矩阵进行循环横向转移(可设置转移方向和转移步数);
  4. 关于方向,规定:输入1,代表向左转移;输入2,代表向右转移;
  5. 关于步数,规定:输入值为大于等于1的正整数。

代码框架:

代码框架
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#define N 4
int r[4][4];
void fun1(int (*a)[N], int x){
/* 控制向左移动 */
}
void fun2(int (*a)[N], int x){
/* 控制向右移动 */
}
int main()
{
int t[][N]={25,33,14,28,19,42,57,48,39,53,39,34,27,40,77,61},i,j,m,p;
char ch;
printf("原始矩阵:\n");
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
printf("%d ",t[i][j]);
}
printf("\n");
}
// 在下面写出菜单式控制流程代码

// 在上面写出菜单时控制流程代码
return 0;
}

(有改编)

代码实现

我觉得思考清晰了就没什么难度,想清楚如何循环,每个循环的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#define N 4
void fun1(int (*a)[N], int x)
{
char temp;
for (int i = 0; i < N; i++) // 第 0 ~ N 行
{
for (int k = 0; k < x; k++) // 每一行移动 x 次
{
temp = a[i][0];
for (int j = 1; j < N; j++) // 每一次的移动过程
{
a[i][j - 1] = a[i][j];
}
a[i][N - 1] = temp;
}
}
}
void fun2(int (*a)[N], int x)
{
char temp;
for (int i = 0; i < N; i++) // 第 0 ~ N 行
{
for (int k = 0; k < x; k++) // 每一行移动 x 次
{
temp = a[i][N - 1];
for (int j = N; j > 0; j--) // 每一次的移动过程
{
a[i][j] = a[i][j - 1];
}
a[i][0] = temp;
}
}
}
int main()
{
int t[][N] = {{25, 33, 14, 28}, {19, 42, 57, 48}, {39, 53, 39, 34}, {27, 40, 77, 61}}, i, j, m, p;
char ch;
printf("原始矩阵:\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%d ", t[i][j]);
}
printf("\n");
}
do
{
printf("\n\n输入移动的方向[向左1,向右2]:");
scanf("%d", &m);
printf("输入移动的步数:");
scanf("%d", &p);
if (m == 1)
fun1(t, p);
else
fun2(t, p);
printf("\n\n移动后的矩阵:\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%d ", t[i][j]);
}
printf("\n");
}
printf("退出请按q键,继续请按任意键后回车");
getchar();
ch = getchar();
} while (ch != 'q' && ch != 'Q');
return 0;
}