第七章实验报告
C程序设计实验报告
实验练习:
7.3.1.1、写一个函数,对用随机的函数产生的10个整数按从小到大的顺序排序(升序,用冒泡排序法实现)
7.3.1.2、写一个函数,对随机产生的10个整数按从小到大的顺序排序(升序,用选择排序法实现)
7.3.2.1、输出指定行数的杨辉三角
7.3.2.2、给定某年某月某日,将其装换成这一年的第几天并输出
7.3.3.、编写程序,判断某一字符串是不是“回文数”,回文数是从左至右或者从右至左读起来都是一样的字符串
姓名:钟俊敏 实验地点:教学楼514教室 实验时间:5月29日
7.3.1.1、写一个函数,对用随机的函数产生的10个整数按从小到大的顺序排序(升序,用冒泡排序法实现)
● 定义一个一维整型数组,其大小为10,即它能存放10个数据
● 使用循环语句,利用随机函数产生10个整数存放在数组中。
● 编写排序函数sort1()
●使用循环语句,将排好序的10个数依次输出
●将数组定义为全局数组或局部数组
●在主函数中,用随机函数生成10个元素放入数组中
●将sort(1)函数部分放入主函数中
7.3.1.2、写一个函数,对随机产生的10个整数按从小到大的顺序排序(升序,用选择排序法实现)
● 定义一个一维整型数组,其大小为10,即它能存放10个数据
● 使用循环语句,利用随机函数产生10个整数存放在数组中。
● 编写排序函数sort1()
●使用循环语句,将排好序的10个数依次输出
●将数组定义为全局数组或局部数组
●在主函数中,用随机函数生成10个元素放入数组中
●将sort(1)函数部分放入主函数中
7.3.2.1、输出指定行数的杨辉三角
● 怎样定义和使用二维数组
●怎样用循环进行二维数组中值的计算
●使用循环依次输出二维数组中的元素(注意换行)
●用if语句根据条件判断某个字符是否是大写字母
7.3.2.2、给定某年某月某日,将其装换成这一年的第几天并输出
● 使用scanf()函数输入年、月、日
●使用一个二维数组存放闰年和非闰年的每个月的天数
●使用逻辑表达式判断某年是否是闰年
●使用变量day对前几个月的天数进行累加
●在强化练习中,学生将练习不使用二维数组存放每个月的天数
●使用if语句对年、月、日的正确性进行验证
●将存放每个月的天数的二维数组说明为局部数组
7.3.3、编写程序,判断某一字符串是不是“回文数”,回文数是从左至右或者从右至左读起来都是一样的字符串
● 用scanf()函数,从键盘输入一个字符串存入字符数组中
●求出该字符串的长度
●用for循环依次比较,循环的终值为长度的一半
●设置一个标志符ch,初值为‘Y’,若某字符对不相等,将其设置为‘N’
●根据ch是‘Y’还是‘N’,输出该字符串是否是回文数
●强化练习中不使用strlen()求出字符串的长度
●将求回文数的部分独立出来,编成一个函数
二、实验内容
1、实验练习(7.3.1.1):
1.问题的简单描述:
编写程序,利用随机函数产生10个随机数,按升序排列输出。
2.流程图如下:
3.实验代码:
#include"stdio.h" #include"stdlib.h" #include"time.h" void sort1(int s[],int n) { int i,j,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]); }
3.问题分析:
a、主要的问题:首先这个程序的最主要的问题是函数的调用问题。
解决方法:该程序的一个核心算法就是冒泡排序法,它是通过选取两个数进行比较以及数之间换位置来进行排序,而两数之间的数值交换是引入第三变量,该算法大概就是这样。
还有就是对于参数的定义,例如形参int s[ ],当我后面在用时应该用a[ ],而不是s,否则不会对这10个数进行排列。
b、程序运行如下:
2、实验练习(7.3.1.2):
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.问题分析:
a、这个程序中的main函数和上面的那个程序中的一样,主要是它的排序方法变了,使用的是选择排序法,主要按照流程图来,并不是很难。
b、程序运行如下:
3、实验练习(7.3.2.1):
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"); } printf("\n"); }
3.问题分析:
a、主要的问题:怎么样将数字能够按照书上这么排列
解决方法:该程序用了两个嵌套的for循环,其中的第一个和最后一个是输入和输出数组,而其中最核心的算就是 a[i][j]=a[i-1][j-1]+a[i-1][j],其意义就是下一项目是上面两项的和,让后在用换行就行
b、程序运行如下:
4、实验练习(7.3.2.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 y,int m,int d) { int i,j,s=0; if(y%4==0&&y%100!=0||y%400==0) i=1; else i=0; printf("%d",i); for(j=1;j<m;j++) { s=s+day_tab[i][j]; } s=s+d; return s; } main() { int y,m,d,n; printf("input year_month_day:\n"); scanf("%d%d%d",&y,&m,&d); n=day_year(y,m,d); printf("是这年的第%d天\n",n); }
4.问题分析:
a、这个程序是但是问题最大的一个题目了,首先是不知道书上提示的统计函数的头部怎么编写,这个问题是通过看书上的内容自行解决,也就是最year,month,day进行整形就行,应为这几个变量都只能是整数。第二个问题就是运行的结果一直都是347天,而正确的答案是346天,这个问题是通过老师的帮助完成的,老师让我输出一下 i 的值,结果 i 的值一直都是1,而其应该是0,所以这才是错误的根源。而我这个程序的最大的问题就是搞清楚if中的判断条件,不应该用i,而是用year,通过year来判断 i 的取值。
b、程序运行如下:
5、实验练习(7.3.3):
1.问题的简单描述:
编写 程序,从键盘输入一个字符串,判断其是否为回文数。
2.程序流程图:
3.实验代码:
#include"stdio.h" #include"string.h" #define n 40 main() { char str[n],ch='y',s; int i; int len; printf("请输入一段字符:"); scanf("%s",str); len=strlen(str); for(i=0;i<=len/2;i++) { if(str[i]!=str[len-i-1]) { ch='n'; break; } } if(ch=='y') printf("%s是一个回文数\n",str); else printf("该字符串不是回文数"); }
4.问题分析:
a、这个程序最大的问题就是理解这个算法,以及我一直出错的地方,if中的判断语句。其实很多时候都是应为这种小的问题,而导致整个程序无法运行。回文数从左至右和从右至左一致,所以只需判断前一半与后一半对应数是否一致,所以无需判断所有的字符。
b、程序运行如下:
三、实验小结
这次实验课总共完成了5个实验,我觉得这次的几个实验都比较有难度。这是我在这次实验课上的收获:1、#include "stdio.h",这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 stdio 的文件,而其就是一个输入和输出函数。2、选择排序法和冒泡排序法的异同点,相同点:¹都是通过n-1组排出具有n个数的顺序 ²都是通过逐个比较,调整位置。不同点:冒泡排序法是最值在其中和其他值交换。选择排序法确是假定一个最值,所以最值和其他值得交换就发生在假定最值得地方。3、rand()函数的作用是随机产生数,而其最大的缺陷就是会产生重复的随机数,在rand函数后面加上%100的意思就是100以内的随机数。4、%md指的是以宽度m输出整数,数据宽度不足m时,左补空格。杨辉三角之间的空格就可以用%5d来实现。