2022综合实验2数据的排序分析与显示

综合实验 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;
}

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值