第7章 数组实验
c程序实验报告
姓名:吕家浩 实验地点:教学楼514教室 实验时间:5月30日
实验项目:
1、写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,冒泡排序实现)
2、写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用选择排序实现)
3、输出指定行数的杨辉三角形
4、给定某年某月某日,将其转换成这一年的第几天并输出
5、编写程序,判断某一字符是不是“回文数”,回文数是从左至右或从从右至左读起来都是一样的字符
一、实验目的与要求
1.写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,冒泡排序实现)
定义一个一维整型数组,其大小为10,即它能存放10个数据
使用循环语句,利用随机函数产生10个整数存放在数组中。
编写排序函数sort1()
使用循环语句,将排好序的10个数依次输出
将数组定义为全局数组或局部数组
在主函数中,用随机函数生成10个元素放入数组中
将sort(1)函数部分放入主函数中
2.写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用选择排序实现)
定义一个一维整型数组,其大小为10,即它能存放10个数据
使用循环语句,利用随机函数产生10个整数存放在数组中。
编写排序函数sort1()
使用循环语句,将排好序的10个数依次输出
将数组定义为全局数组或局部数组
在主函数中,用随机函数生成10个元素放入数组中
将sort(1)函数部分放入主函数中
3.输出指定行数的杨辉三角形
怎样定义和使用二维数组
怎样用循环进行二维数组中值的计算
使用循环依次输出二维数组中的元素(注意换行)
用if语句根据条件判断某个字符是否是大写字母
4.给定某年某月某日,将其转换成这一年的第几天并输出
使用scanf()函数输入年、月、日
使用一个二维数组存放闰年和非闰年的每个月的天数
使用逻辑表达式判断某年是否是闰年
使用变量day对前几个月的天数进行累加
在强化练习中,学生将练习不使用二维数组存放每个月的天数
使用if语句对年、月、日的正确性进行验证
将存放每个月的天数的二维数组说明为局部数组
5.编写程序,判断某一字符是不是“回文数”,回文数是从左至右或从从右至左读起来都是一样的字符
用scanf()函数,从键盘输入一个字符串存入字符数组中
求出该字符串的长度
用for循环依次比较,循环的终值为长度的一半
设置一个标志符ch,初值为‘Y’,若某字符对不相等,将其设置为‘N’
根据ch是‘Y’还是‘N’,输出该字符串是否是回文数
强化练习中不使用strlen()求出字符串的长度
将求回文数的部分独立出来,编成一个函数
二、实验内容
1.实验练习:7.3.1.1
问题描述:
编写程序,利用随机函数产生10个随机数,按升序排列输出。
流程图:
实验代码:
#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 b,a[10]; srand((unsigned)time(NULL)); printf("随机产生10个整数:\n"); for(b=0;b<10;b++) a[b]=rand()%100; for(b=0;b<10;b++) printf("%d ",a[b]); printf("\n"); sort1(a,10); printf("排序后的结果:\n"); for(b=0;b<10;b++) printf("%d ",a[b]); }
实验结果:
问题分析:本题在生成随机数的时候上网查找了一下代码,然后没什么大问题,但是在最后运行的时候,发现其他的数都排列好了,就差最小的数,然后排序结果老是出现一个五位数,检查了一下,原来是for(j=9;j>=i+1;j--)打成了for(j=9;j>=i-1;j--),就没问题了
2.实验练习:7.3.1.2
问题描述:
编写函数,利用随机函数产生10个随机数,按升序排列输出.
流程图
实验代码:
#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[k]>s[j]) k=j; if(k!=i) { temp=s[k]; s[k]=s[i]; s[i]=temp; } } } main() { int b,a[10]; srand((unsigned)time(NULL)); printf("随机产生10个整数:\n"); for(b=0;b<10;b++) a[b]=rand()%100; for(b=0;b<10;b++) printf("%d ",a[b]); printf("\n"); sort2(a,10); printf("排序后的结果:\n"); for(b=0;b<10;b++) printf("%d ",a[b]); }
实验结果:
问题分析:本题和上一小题差不多,在这应用了选择排序法,除了定义函数不同其余都一样,基本无问题,但是要注意,在for循环的时候,有的部分要加上大括号,注意大括号使用的位置,不然程序很可能运行不出来
3.实验练习:7.3.2.1
问题描述:
编写程序,从键盘输入行数,输出指定行数的杨辉三角形。
流程图
实验代码;
#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("%d ",a[i][j]); printf("\n"); } printf("\n"); }
实验结果:
问题分析:本题也基本上无问题,原理和以前用嵌套方式打印图案有点相似吧,嘿嘿,控制好横纵关系和数值就欧克了
4.实验练习:7.3.2.2
问题描述:
编写程序,从键盘分别输入年,月,日。计算出该天是这年中的第几天。
流程图
实验代码:
#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,n; printf("Input year month day:\n"); scanf("%d%d%d",&y,&m,&d); n=day_year(y,m,d); printf("是这一年的第%d天\n",n); }
实验结果:
问题分析:开始运行的时候,发现结果总是四百多天,后来检查了一下,发现是在s=s+day的时候一起写进了上面的循环结构里面,后来解决了。本题判断是否闰年来确定i的值,随后确定要叠加计算的数组,思路清晰明了
5.实验练习:7.3.3
问题描述:
编写 程序,从键盘输入一个字符串,判断其是否为回文数。
流程图
实验代码:
#include <stdio.h> #include <string.h> #define N 40 main() { char str[N],ch='Y'; int i; int len; printf("请输入一个字符串:"); 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不是一个回文数",str); }
运行结果:
问题分析:本小题开始就是不管输入什么字符,都结果是回文数,经过检查,是由于if(ch=='Y')没有加双等号
三、实验小结
本次实验主要是一维数组,二维数组的运用,在编写代码的时候还是要注意细节吧,额,不管是以前还是现在,多多少少都还会因为一个符号或者是别的一个小细节出错,还是要理解算法和流程,不然很容易出错,