实验项目:第七章数组实验
姓名:谢丽萍 时间:2019年5月29号 地点:514教室
一、实验目的与实验要求
①7.3.1-1本实验旨在巩固学生对数组这种数据结构的理解,增强程序设计能力。在这个实验中,学生将练习:定义一个一维整形数组,其大小为10,即它能存放10个数据;使用循环语句,利用随机函数生产10个整数放在数组中;编写排序函数sort1()使用循环语句,将排好序的10个数依次存放在数组中。在强化练习中,学生将练习:将数组定义为全局数组或局部数组;在主函数中,用随机函数生成10个元素放入数组中;将sort1()函数部分放入主函数中。
②7.3.2本实验旨在巩固学生对二维数组这种数据结构的理解,增强程序设计能力。在这个实验中,学生将练习:怎样定义和使用二维数组;怎样用循环进行二维数组中的计算;使用循环依次输出二维数组中的元素;用if语句根据条件判断某个字符是否是大写字母。
③7.3.3本实验旨在巩固学生对字符串这种数据结构的理解,增强程序设计能力。在这个实验中,学生将练习:用scanf()函数,从键盘输入一个字符串,存入字符数组中;求出该字符串的长度;用for循环依次比较,循环的终值为长度的一半;设置一个标识符ch,初值为“y”,若某字符对不相等,将其设置为“N”;根据ch是“Y”还是“N”输出该字符串是否是回文数;在强化练习中学生将练习:不用strlen()函数求出字符串的长度;将求回文数的部分独立出来,编成一个函数。
二、实验内容
1、实验练习
问题描述:编写程序,利用随机函数产生的10个整数按从小到大的顺序排序(升序,冒泡排序法)
流程图:
实验代码:
#include<stdio.h> #include<stdlib.h> #include<time.h> void sort1(int s[],int n) { int i,j,k; 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((unsigned int)time(NULL)); printf("随机产生10个整数: "); for(i=0;i<10;i++) a[i] =rand()%100; for(i=0;i<10;i++) printf("%d ",a[i]); printf(" "); sort1(a,10); printf("输出排序后的10个整数 "); for(i=0;i<10;i++) printf("%d ",a[i]); }
运行结果:
问题分析:这道题中我遇到了几个问题,分别是:①给出随机种子和随机产生10个整数这两个语句的函数我已开始拿到题目不会,后面上网百度了一下,就解决了。老师说这个我们还没学过,但之前碰到过,这次又碰到了,算是又巩固一遍吧。②对于我一开始的代码运行出来的结果是这些数字连在一起的,没有分开。后面我问了一下同桌才发现问题出在没有给输出函数空格,后面改过来后更美观了。
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 i,a[10]; srand((unsigned int)time(NULL)); printf("随机产生10个整数: "); for(i=0;i<10;i++) a[i] =rand()%100; for(i=0;i<10;i++) printf("%d ",a[i]); printf(" "); sort2(a,10); printf("输出排序后的10个整数 "); for(i=0;i<10;i++) printf("%d ",a[i]); }
运行结果:
问题分析:这道题和上一道题一样只是使用的方法不一样而已,所以在做出第一道题后再来做这道题,再加上流程图的帮助就更简单了许多。但还是遇到了问题,就是在sort2中的最后一个if语句后面的内容没有包含到for循环中最后导致运行出来的结果只有部分数据调换了为置。
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(" "); } }
运行结果:
问题分析:对于这道题我一开始没有怎么搞懂其原理,导致我在经过很长时间思考后还是运行不出来后去看同学的代码时都没看懂。后面经过同学的解释后最后恍然大悟,解出了这道题。我开始没有分清最后两个for循环的含义,导致没搞懂。原来第二个for循环是算出中间的那些数,最后一个for循环是控制输出的。
4、实验练习
问题描述:编写程序,从键盘分别输入年、月、日,计算出改天是这年中的第几天。
流程图:
实验代码:
#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("输入年,月,日:"); scanf("%d%d%d",&y,&m,&d); printf("是这年的第%d天 ",day_year(y,m,d)); }
运行结果:
问题分析:这道题中犯了一个错误就是if(year%4==0&&year%100!=0||year%400==0)中的year刚开始用i来代替了,导致运行不出来。后面在晓鹏老师的帮助下,发现了问题,并改过来了。以后要谨记定义的变量是什么就用什么,不然白定义了程序识别不了。
5、实验练习
问题描述:编写程序,从键盘输入一个字符串,判断其是否是回文数。
流程图:
实验代码:
#include<string.h> #define N 40 main() { char str[N],ch='Y'; int i; int len; printf("please input a string "); scanf("%s",str); len=strlen(str); for(i=0;i<(len/2);i++)//回文数从左至右和从右至左一致,所以只需判断前一半与后一半对应数是否一致 ,所以i<len/2 { if(str[i]!=str[len-1-i]) { ch='N'; break; } } if(ch=='Y') printf("%s是一个回文数 ",str); else printf("%s不是一个回文数 ",str); }
运行结果:
问题分析:对于这道题还好,没遇到啥问题,进行的挺顺利的。
三、实验小结
这次实验中我们又再次接触到了随机函数,学会了随机数的表达。还有在使用变量时要注意,必须用之前定义的,不能随便改变,不然会识别不了,导致程序运行不出来。