综合实验 2: 循环结构及数组排序的综合应用——各国新冠疫情排序与分析程序
一、实验目的:
1. 进一步掌握 C 语言中的选择结构、循环控制结构的编程方法;
2. 学习 C 语言中数组定义和引用的编程方法;
3. 理解和掌握冒泡排序法、选择排序法的基本原理,掌握其程序实现方法;
4. 用本章的排序和直方图绘制方法对各国新冠疫情进行可视化分析。
5. 编译并运行你的程序。调试正确后,①将源程序*.c 文件上载;②将两个可执行程序*.exe 压缩在一起后上载。
二、实验要求
第一部分:随机整数的排序与棒图显示
1) 在源程序起始的文件头注释块(comment header)中写上必要的信息;
2) 定义一个可以存放 20 个元素的一维整型数组 rArray,用随机数函数srand、rand生成20个1~50 之间的随机整数,并把它们存放在该整型数组中。
3) 定义一个可以存放 51 个字符元素的一维字符型数组 cArray,并将其全部初始化为’\0’。
4) 按照数组 rArray 的下标顺序在屏幕上依次输出数组中的这20 个随机整数,并在后面紧跟着输出对应的可视化棒图。 显示棒图的说明:最简单的棒图可以用显示字符 ’*’ 的数量来表示。如显示整数13的棒图,可①利用循环语句在一行中显示出13个字符 ’*’;②也可先将13个字符’*’ 写入字符型数组cArray中,然后使用字符串形式输出显示。
5) 等待键盘输入回车键或者任意键后,继续进行下面的过程:
6) 用冒泡排序算法对这 20 个随机数按照由大到小的降序排序,将排序结果存放到原数组之中。
7) 按照排序后的数组下标顺序,在屏幕上输出数组中的这20 个随机整数,并同时在屏幕上显 2示出已经排序后的数组的棒图。
8) 等待键盘输入回车键或者任意键后,继续进行下面的过程:
9) 用选择排序算法再对上述第 7)步中得到的数组,按照由小到大的升序排序,将排序结果存放到原数组之中。
10) 按照排序后的数组下标顺序,在屏幕上输出数组中的这20 个随机整数,并同时在屏幕上显示出已经排序后的数组的棒图。
第二部分:各国新冠疫情数据的分析与显示
1) 在源程序起始的文件头注释块(comment header)中写上必要的信息;
2) 需要定义如下 4 个数组用于保存数据:
1 二维字符数组:country[国家数][ 最长国家名+‘\0’]。按顺序存储各国家名的字符串,注意一个汉字占用两个字符。
2 一维整型数组:patient[国家数],按顺序存储该国的确诊人数。
3 一维整型数组:recovery[国家数],按顺序存储该国的治愈人数。上述三个数组在定义时即用附录 B 中的数据进行初始化,例如:char country[51][12] = {“美国”, ”西班牙”, ”意大利”,……} int patient[51] = {367650, 136675,……}
4 一维实型数组:recoveryRatio[国家数]。该数组存储计算出的该国的病人治愈率。
3) 编制一段程序,计算出每个国家的病人治愈率,存储在数组recoveryRatio[国家数]中。治愈率 = 治愈人数 / 确诊人数。
4) 用 冒泡排序算法 对上面的数据按照确诊人数由多到少的顺序排序,将结果显示在屏幕上,其中屏幕上每一行的显示形式为: 序号 确诊人数 国家 治愈人数 治愈率
5) 用 选择排序算法 对上面的数据按照治愈人数由多到少的顺序排序,将结果显示在屏幕上,其中屏幕上每一行的显示形式为: 序号 治愈人数 国家 确诊人数 治愈率
6) 用 选择排序算法 对上面的数据按照治愈率由大到小的顺序排序,将结果显示在屏幕上,其中屏幕上每一行的显示形式为: 序号 治愈率 国家 确诊人数 治愈人数
7) 在上述 4)、5)、6)中,除了显示数据信息外,紧接在后面绘出排序数组的棒图。提示:先找出排序数组的最大值和最小值,假设最大值对应40 个‘*’,0 值对应0个‘*’。则值 y 对应的: ‘*’的个数 = (int)(y * 40.0 / 最大值)
三、代码部分
————————————————
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
printf("20个随机数及其棒图:\n\n");
int i,rArray[20],t,j,min,kon; //定义数组rArray
char cArray[51];//定义字符型数组cArray,其数默认为\0
srand((unsigned)time(NULL));
for (i=0;i<20;i++)
{
rArray[i]=rand() % 50 + 1; //得到1-50随机数
cArray[i]=rArray[i];
printf("[%-2d] %2d ",i,rArray[i]) ; //打印数组
int sum=0;
while (sum!=rArray[i]-1) //用while语句输出星号棒图
{
sum+=1;
printf("*");
}
printf("*\n");
}
printf("\n等待键盘打回车后进行冒泡排序......") ;
kon=getchar();
printf("\n冒泡排序后的结果及其棒图:\n\n");
for (i=0;i<19;i++)
{
for (j=0;j<19-i;j++)
{
if (rArray[j]<rArray[j+1]){t=rArray[j];rArray[j]=rArray[j+1];rArray[j+1]=t;} //进行冒号排序 ,结果存储到原数组中
}
}
for (i=0;i<20;i++)
{
printf("[%-2d] %2d ",i,rArray[i]) ;
int sum=0;
while (sum!=rArray[i]-1)
{
sum+=1;
printf("*");
}
printf("*\n");
}
printf("\n等待键盘打回车后进行选择排序......") ;
kon=getchar();
printf("\n选择排序后的结果及其棒图:\n\n");
for (i=0;i<20;i++)
{
for (j=i;j<20;j++)
if (cArray[j]<=cArray[i])
{
min=cArray[i];
cArray[i]=cArray[j]; //进行选择排序
cArray[j]=min;
}
}
for (i=0;i<20;i++)
{
rArray[i]=cArray[i]; //将结果储存到原数组中
printf("[%-2d] %2d ",i,cArray[i]) ;
int sum=0;
while (sum!=cArray[i]-1)
{
sum+=1;
printf("*");
}
printf("*\n");
}
printf("\n等待键盘打回车后结束......") ;
kon=getchar();
return 0;
}
#include <stdio.h>
#include<string.h>
int main()
{int i,j,t,re,max;
char k;
char country[51][12] = {"美国", "西班牙", "意大利", "德国", "法国", "中国", "伊朗", "英国", "土耳其", "瑞士", "比利时", "荷兰", "加拿大", "奥地利", "巴西", "葡萄牙", "南韩", "以色列", "瑞典", "俄罗斯", "澳大利亚", "挪威", "爱尔兰", "捷克", "智利", "印度", "丹麦", "波兰", "罗马尼亚", "日本", "巴基斯坦", "马来西亚", "厄瓜多尔", "菲律宾", "卢森堡", "沙地阿拉伯", "秘鲁", "印度尼西亚", "墨西哥", "泰国", "塞尔维亚", "芬兰", "巴拿马", "阿联酋", "卡塔尔", "多米尼加", "希腊", "南非", "阿根廷", "哥伦比亚", "冰岛"};
int patient[51] = {367650, 136675, 132675, 103375, 98010, 81740, 60500, 51608, 30217, 21657, 20814, 18803, 16667, 12332, 12232, 11730, 10331, 8904, 7206, 6343, 5908, 5865, 5364, 4828, 4815, 4778, 4681, 4413, 4057, 3906, 3864, 3793, 3747, 3660, 2843, 2605, 2561, 2491, 2439, 2258, 2200, 2176, 2100, 2076, 1832, 1828, 1755, 1686, 1628, 1562, 1562};
int recovery[51] = {19810, 40437, 22837, 36081, 17250, 77167, 24236, 135, 1326, 8056, 3986, 250, 3616, 3463, 127, 140, 6694, 585, 205, 406, 2547, 32, 25, 127, 728, 382, 1378, 162, 406, 592, 429, 1241, 100, 73, 500, 551, 997, 192, 633, 824, 118, 300, 14, 167, 131, 33, 269, 95, 325, 88, 460};
double recoveryRatio[51],tes;
//定义各个数组
for (i=0;i<51;i++) recoveryRatio[i]=(recovery[i]*1.0)/(patient[i]*1.0); //计算治愈率 ,储存在数组中
printf("\n确诊人数冒泡排序后的结果及其棒图:\n\n");
for (i=0;i<50;i++)
{
for (j=0;j<50-i;j++)
{
if (patient[j]<patient[j+1]){t=patient[j];patient[j]=patient[j+1];patient[j+1]=t;
t=recovery[j];recovery[j]=recovery[j+1];recovery[j+1]=t;
tes=recoveryRatio[j];recoveryRatio[j]=recoveryRatio[j+1];recoveryRatio[j+1]=tes;
for (re=0;re<12;re++){k=country[j][re];country[j][re]=country[j+1][re];country[j+1][re]=k;
};
} //进行冒号排序
}
}
printf("序号 确诊人数 国家 治愈人数 治愈率\n");
for (i=0;i<51;i++)
{
printf("%2d %6d %-10s %-8d %-lf ",i,patient[i],country[i],recovery[i],recoveryRatio[i]);//打印结果
t=((patient[i]*60)/patient[0]);
int sum=0;
while (sum!=t)
{
sum+=1;
printf("*");
}
printf("*\n");
}
printf("\n治愈人数选择排序后的结果及其棒图:\n\n");
for (i=0;i<51;i++)
{
for (j=i;j<51;j++)
if (recovery[j]>=recovery[i])
{
max=recovery[i];
recovery[i]=recovery[j]; //进行选择排序
recovery[j]=max;
t=patient[j];patient[j]=patient[i];patient[i]=t;
tes=recoveryRatio[j];recoveryRatio[j]=recoveryRatio[i];recoveryRatio[i]=tes;
for (re=0;re<12;re++){k=country[j][re];country[j][re]=country[i][re];country[i][re]=k;}
}
}
printf("序号 治愈人数 国家 确诊人数 治愈率\n");
for (i=0;i<51;i++)
{
printf("%2d %6d %-10s %-8d %-lf ",i,recovery[i],country[i],patient[i],recoveryRatio[i]);//打印结果
t=((recovery[i]*50)/recovery[0]);
int sum=0;
while (sum!=t)
{
sum+=1;
printf("*");
}
printf("*\n");
}
printf("\n治愈率选择排序后的结果及其棒图:\n\n");
for (i=0;i<51;i++)
{
for (j=i;j<51;j++)
if (recoveryRatio[j]>=recoveryRatio[i])
{
max=recovery[i];
recovery[i]=recovery[j]; //进行选择排序
recovery[j]=max;
t=patient[j];patient[j]=patient[i];patient[i]=t;
tes=recoveryRatio[j];recoveryRatio[j]=recoveryRatio[i];recoveryRatio[i]=tes;
for (re=0;re<12;re++){k=country[j][re];country[j][re]=country[i][re];country[i][re]=k;}
}
}
printf("序号 治愈率 国家 确诊人数 治愈人数\n");
for (i=0;i<51;i++)
{
printf("%2d %-lf %-10s %-8d %-6d ",i,recoveryRatio[i],country[i],patient[i],recovery[i]);//打印结果
t=((recoveryRatio[i]*50)/recoveryRatio[0]);
int sum=0;
while (sum!=t)
{
sum+=1;
printf("*");
}
printf("*\n");
}
printf("\n等待键盘打回车后结束......") ;
char kon=getchar();
return 0;
}