数组
C程序设计实验报告
姓名:杨怡程 实验地点:520教室 实验时间:6.12
一、实验目的与要求
1.掌握一维和多维数组的定义和数组元素的引用方法。
2.了解一维和多维数组初始化的方法。
3.学习一维和多维数组的基本算法。
二、实验内容
- 实验一
问题描述:写一个函数,对用随机函数产生的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]);
}
问题分析:程利用srand(time(0))播下种子,再利用for循环内嵌套rand()函数产生10个未知数。要使用srand(time(0))和rand()函数需要包含stdlib.h和time.h。利用升降排序的方法构造函数sort1.即可得到所要的程序
*实验二
问题描述:用选择排序实现对随机数的排序
代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
sort1(int s[ ],int n)
{
int i,j,k;
int temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<=n-1;j++)
{
if(s[j]<s[k])
k=j;
}
if(k!=i)
{
temp=s[k];
s[k]=s[i];
s[i]=temp;
}
}
}
main()
{
int i,a[10];
srand(time(0));
for(i=0;i<10;i++)
{
a[i]=rand()%100;
}
printf("随机产生十个随机数:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
sort1(a,i);
printf("排序后的结果:\n");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
}
问题分析:前面的数与后面的数进行比较,后面的数比前面的数小则升序,后面的数比前面的数大则降序。以此为思路构建函数。
- 实验三
问题描述:利用复化梯形公式计算定积分输出指定行数的杨辉三角形
代码:
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");}
}
问题分析:首先是a[i][1]确定第一列都是1,然后从第三排开始就是开始相加,最后那个for是输出数组,看起来很复杂,需要细心。
- 实验四
问题描述::编写程序,从键盘输如年,月,日,计算该天是这年中的第几天。
代码:
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));
}
问题分析:做的时候想修改一下,感觉数组前面没必要加上0,我再去掉0之后发现结果也没错,后来发现其他月不会出错,但一月会出错
三、实验小结
本次实验题量不多,但是越是学到后面,每道题也更复杂,运用了更多编写方式,代码也更长,流程图也很复杂,自己之前学的也不是很扎实,加上学数组后就一直没听懂,很多题目其实只要静下来想一想就可以出来,但我就有点钻牛角尖,看得这么复杂就不想想了。以后做题要耐心,不能浮躁,还有定期的去复习前面的知识,别让自己模棱两可。