数组实验 七

实验报告


实验项目:数组实验

姓名:游文进          实验地点:520             实验时间:6.12

一.实验目的与要求

1.掌握一维和多维数组的定义和数组元素的引用方法。

2.了解一维和多维数组初始化的方法。

3.学习一维和多维数组的基本算法。


二.实验内容


7.31一维数组的应用

练习一

问题描述:写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用冒泡排序实现)

代码:

#include<stdlib.h>
#include<time.h>
int sortl(int s[],int a)//排序函数 
{ 
    int i,j;
    int temp;//定义中间变量
	for(i=0;i<a;i++)//排序外循环语句
	for(j=1;j<10-i;j++)//排序内循环语句
	if(s[j]<s[j-1]) 
	{
		temp=s[j];
		s[j]=s[j-1];
		s[j-1]=temp;
	}
	
 } 
main()
{
	int i,a[10];
	srand((int)time(NULL));
	printf("随机产生十个数: \n"); 
	for(i=0;i<10;i++)
	a[i]=rand()%1000;
	for(i=0;i<10;i++)
	printf("%d ",a[i]);
	printf(" \n");
	sortl (a,10);
	printf("排序后的10个整数为: \n");
	for(i=0;i<10;i++)
	printf("%d ",a[i]);
	
}

结果图

图片不存在

问题分析:

1.实现程序的模块化,将不同功能设计成不同函数,这里主要需要的功能是排序功能,且指明冒泡排序
冒泡排序是指比较相邻的元素如果第一个比第二个大(小),就交换他们两个,依次进行下去,最后的元素是最大的数,再针对所有的元素重复上面步骤
,除了最后一个元素,直到越来越少的元素为0,则排序完成。

2.再冒泡排序中重复了两个点,一个是对元素进行比较交换,另一个是除去最大值后再重新对元素进行比较交换,所以需要两个循环来完成函数。


练习二

问题描述:用选择排序实现对随机数的排序
代码

{
	int i,j,k;
	int temp;
	for(i=0;i<n-1;i++)
	{   k=i;
		for(j=i+1;j<n;j++)
		if(s[k]>s[j])
		k=j;
		//if(k!=i)假设s[k]自身为最小,则交换语句 是与本身值交换 
		{ 
		temp=s[i];
		s[i]=s[k];
		s[k]=temp;
		}
		
	}
}

结果图

问题描述:
1.同样是排序,只是方法不同,选择排序是指一次性比较全部元素,选出最大(小)的元素,将放置在选定的第一个位置,除去这个元素,再在剩余的元素中再次比较出最大(小)的元素,放置在第二个位置,重复其步骤,直至所有元素放置完毕。

2.选择排序的核心是,找出全部元素中的最值,将其安置在最值的位置,再通过循环重复寻找,安置,完成对数组的排序。
一:设定最值位--> k=i、
二:比较元素--> s[k]>s[j]
三:进行元素值的交换, 暂时将s[j]的值放在s[0]最值位上-->k=j
四:再进行步骤二,直到将元素最值放在最值位上


7.32

二维数组的应用


练习一

问题描述:输出指定行数的杨辉三角形
代码

main()
{
	int a[50][50],i,j,n,k;
	printf("please input 三角形行数n: ");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{//保持最外侧数字为1 
		a[i][i]=1; 
		a[i][1]=1;
	}
	for(i=3;i<=n;i++)
	for(j=2;j<=i-1;j++)
	{
		a[i][j]=a[i-1][j-1]+a[i-1][j];
	}
	for(i=1;i<=n;i++)
	{
	for(k=1;k<=n-i;k++)
	{
	printf(" ");
	printf(" ");
	}
	for(j=1;j<=n;j++)
	{
	printf("%d ",a[i][j]);
	printf(" ");//由于两位数的数字比一位数宽,变成等边三角形会有偏移不整齐,加空格来调整。 
	printf(" ");
	if(i==j)
	break;}
	printf("\n");}
}

结果图
``

问题分析:
1.观察规律 :每一行的首尾项都为1,将其代入二维数组即a[i][0],a[i][i]恒为1,利用循环对其赋值,
2.每行的元素为上一行相同列元素和前一列元素之和,代入二维数组即a[i][j]=a[i-1][j]+a[i-1][j-1];
3.在输出数组元素时,如果每一行输出相同的列数,由于存在未赋值的元素,则系统随机赋值,所以应该再输出完已赋值的数组元素后,使用break语句结束内循环。


练习二

问题描述:编写程序,从键盘输如年,月,日,计算该天是这年中的第几天。 代码:

int day_tab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31} };
int day_year(int year,int month,int day)
{ int i,j,s=0;
 // if(year%4==0||(year%100==0&&year%400==0))
  if(year%4==0&&year/100%4==0) 
  i=1;
  else i=0;
  for(j=1;j<month;j++)
  	s=s+day_tab[i][j];
  	s=s+day;
  	return s;
}
main()
{
	int y,m,d;
	printf("请输入年,月,日: \n");
	scanf("%d,%d,%d" ,&y,&m,&d);
    printf("是这年的第%d天!",day_year(y,m,d));
	
}

结果图

问题分析:
1.判断闰年的表达式 ,在函数定义中,变量要使用形参,而不是实参。
2.不要忘记了s=s+day.


实验小结

1.数组作为一种数据类型,作为函数参数,调用函数时,用数组名作为实参,这种方式称为"

传址

"数组名代表数组在内存中的首地址,实参与形参共用相同的内存单元,调用函数时吧实参在内存中的首地址传递给形参,其结果相当于同一数组采用了两个不同的数组名。
2.数组元素作为函数的实参,采用的时"

传值

"的方式,不会对实参造成影响。

posted @ 2021-06-20 16:15  小白和小新呀  阅读(160)  评论(0)    收藏  举报