C程序设计实验报告
实验项目: 函数和宏定义实验
姓名: 赖倍仟 实验地点: 514物联网实验室 实验时间:2019年5月29日
一、实验目的和要求
(1)掌握一维和多维数组的定义和数组元素引用方法。
(2)了解一维和多维数组初始化方法。
(3)学习以为和多维数组的基本算法。
(4)掌握字符数组的定义、初始化方法及元素的引用方法。
(5)掌握C语言提供的对字符串进行处理的基本库函数。
二、实验内容
(1)实验7.3.1练习一:
1、问题描述:
编写程序,利用随机函数产生10个整数,按升序排列输出。
2、冒泡排序算法流程图:
3、程序代码:
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
void sort1(int s[],int n)
{
int i,j;
int temp;
for(i=0;i<n-1;i++)
for(j=9;j>=i+1;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(time(NULL));
printf("随机产生10个整数:\n");
for(i=0;i<10;i++)
a[i]=rand()%100;
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
sort1( a, 10);
printf("排序后的结果:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
4、运行结果:
5、问题分析:
首先要熟悉冒泡排序法,结合一维数组,配合for循环结构嵌套使用进行数组中数的两两比较和交换位置,然后要记住交换元素位置是一定要用到中间变量。emmm 这里还要提一下随机函数的调用,要用到time文件中srand函数,所以要多学习了解各种固定文件和函数才能更好的解决问题。
(2)实验7.3.1练习二:
1、问题描述:写一个函数,对随机产生的10个整数按从小到大的顺序排序。
2、选择算法流程图:
3、程序代码:
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
void sort2(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(NULL));
printf("随机产生10个整数:\n");
for(i=0;i<10;i++)
a[i]=rand()%100;
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
sort2(a,10);
printf("排序后的结果:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
4、运行结果:
5、问题分析:
同样是排序,选择排序法在于从第一个元素开始找出最小的数,先将最小数放到一个位置上,用这个数与其他位置上依次比较,找出最小数,并用一个中间变量交换两个数的位置,然后再从第二个位置开始找最小数。还有就是要注意多重for循环嵌套,在自己的操作中发现,好像当第一个大的循环里出现了一对花括号,系统就会认为该循环到括号为止,所以在嵌套时要注意各层的关系,最好是一步步来,做到不出问题。
(3)实验7.3.2练习一:
1、问题描述:编写程序,从键盘输入行数,输出指定行数的杨辉三角形。
2、流程图:
3、程序代码:
#include"stdio.h"
main()
{
int a[50][50],i,j,n;
printf("输入杨辉三角形行数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
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(j=1;j<=i;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
4、运行结果:
5、问题分析:
杨辉三角形的输出,利用二维数组和之前编写过的for循环结构可以输出三角形的形状,然后杨辉三角形之间的数的关系的输出结合算法和数组元素的变化来实现 。
(4)实验7.3.2练习二
1、问题描述:编写程序,从键盘分别输入年、月、日,计算出该天是这年的第几天。
2、流程图:
3、程序代码:
#include"stdio.h"
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)
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("Input year_month_day:\n");
scanf("%d%d%d",&y,&m,&d);
printf("是这年的第%d天\n",day_year(y,m,d));
}
4、运行结果:
5、问题分析:
可以看到代码的实现是先用了两个数组来存放闰年和非闰年各个月份的天数,然后再对输入的年份进行判断该年是否为闰年,并将其逻辑值赋给变量i。i=1时表示是闰年,i=0时表示是非闰年。
(5)实验7.3.3
1、问题描述:编写程序,从键盘输入一个字符串,并判断其是否是回文。
2、流程图:
3、程序代码:
#include"stdio.h"
#include"string.h"
#define N 40
main()
{
char str[N],ch='Y';
int i;
int len;
printf("Input a string: ");
scanf("%s",&str);
len=strlen(str);
for(i=0;i<=len/2;i++)
{
if(str[i]!=str[len-1-i])
{
ch='N';
break;
}
}
if(ch=='Y')
printf("%s是一个回文\n",str);
else
printf("%s不是一个回文\n",str);
}
4、运行结果:
5、问题分析:
回文的分析也是利用循环不断进行比较判断,这里还要记录一下输入的字符串的长度,循环次数等于长度的一半。
三、实验小结
数组的学习与使用,让我们又多了一种解决问题的方式,当需要用的数据比较多时,或者需要多次使用某部分数据时,数组就可以给我们提供便利。然后也发现循环结构在各种问题的解决中也尤为重要,在循环嵌套的时候也要多多注意各个循环的关系,值的传递。当我们真正自己解决问题时,一步步分析理清循环关系也将是关键。希望自己可以多累积知识,最后拥有自己分析解决的问题的能力。