数组

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之后发现结果也没错,后来发现其他月不会出错,但一月会出错

三、实验小结
本次实验题量不多,但是越是学到后面,每道题也更复杂,运用了更多编写方式,代码也更长,流程图也很复杂,自己之前学的也不是很扎实,加上学数组后就一直没听懂,很多题目其实只要静下来想一想就可以出来,但我就有点钻牛角尖,看得这么复杂就不想想了。以后做题要耐心,不能浮躁,还有定期的去复习前面的知识,别让自己模棱两可。

posted @ 2021-06-20 22:59  逆刃  阅读(48)  评论(0编辑  收藏  举报