数组实验 七
实验报告
实验项目:数组实验
姓名:游文进 实验地点: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.数组元素作为函数的实参,采用的时"
传值
"的方式,不会对实参造成影响。

浙公网安备 33010602011771号