第七章 数组实验
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、实验练习:
1问题的简单描述:编写程序,利用随机函数产生10个整数,按升序排列输出。算法程序为:
2实验代码:
1 #include"stdio.h" 2 #include"stdlib.h" 3 #include"time.h" 4 void sort1(int s[ ],int n) 5 { 6 int i,j; 7 int temp; 8 for(i=0;i<n-1;i++) 9 { 10 for(j=9;j>=i+1;j--) 11 { 12 if(s[j]<s[j-1]) 13 { 14 temp=s[j]; 15 s[j]=s[j-1]; 16 s[j-1]=temp; 17 } 18 } 19 } 20 } 21 main() 22 { 23 int i,a[10]; 24 srand(time(NULL)); 25 printf("随机产生十个整数:\n"); 26 for(i=0;i<10;i++) 27 a[i]=rand()%100; 28 for(i=0;i<10;i++) 29 printf(" %d",a[i]); 30 printf("\n"); 31 sort1(a,10); 32 printf("排序后的十个整数:\n"); 33 for(i=0;i<10;i++) 34 printf(" %d",a[i]); 35 printf("\n"); 36 }
3运行结果:
4问题分析:
该开始我并不知道怎样给出随机种子以及调用排序函数,导致程序报错。
解决办法:通过百度,将srand()改为srand(time(NULL)),将sort1改为sort1(a,10)。srand(time(NULL))是以当前时间为种子,产生随意数。其中,time(NULL)用来获取当前时间,本质上得到的是一个大整数,然后用这个数来出随机数。
实验练习 2
1、简单问题描述
写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,选择排序实现)。程序流程图如下所示:
2、实验代码
1 #include"stdio.h" 2 #include"stdlib.h" 3 #include"time.h". 4 void sort2(int s[],int n) 5 { 6 int i,j,k; 7 int temp; 8 for(i=0;i<n-1;i++) 9 { 10 k=i; 11 for(j=i+1;j<=n-1;j++)/*用于排序内的循环*/ 12 { 13 if(s[j]<s[k]) 14 k=j; 15 } 16 if(k!=i) 17 { 18 temp=s[k];/*利用中间变量完成两数组元素的交换*/ 19 s[k]=s[i]; 20 s[i]=temp; 21 } 22 } 23 } 24 main() 25 { 26 int i,a[10]; 27 srand(time(NULL));/*给出随机种子*/ 28 printf("随机产生10个整数:\n"); 29 for(i=0;i<10;i++) 30 { 31 a[i]=rand()%100; 32 printf("%d ",a[i]); 33 } 34 printf("\n"); 35 sort2(a,i); 36 printf("排序后的结果:\n"); 37 for(i=0;i<10;i++)/*输出排序后的结果*/ 38 printf("%d ",a[i]); 39 }
3运行结果:
4问题分析:此题与第一个程序差别不大。
实验练习 3
1、简单问题描述
编写程序,从键盘输入行数,输出指定行数的杨辉三角形。程序流程图如下所示:
2、实验代码
1 #include"stdio.h" 2 main() 3 { 4 int a[50][50],i,j,n; 5 printf("请输入杨辉三角的行数:\n"); 6 scanf("%d",&n); 7 for(i=1;i<=n;i++) 8 { 9 a[i][i]=1; 10 a[i][1]=1; 11 } 12 for(i=3;i<=n;i++) 13 { 14 for(j=2;j<=i-1;j++) 15 { 16 a[i][j]=a[i-1][j-1]+a[i-1][j]; 17 } 18 } 19 for(i=1;i<=n;i++) 20 { 21 for(j=1;j<=i;j++) 22 printf("%6d",a[i][j]); 23 printf("\n"); 24 } 25 26 27 28 }
3运行结果:
4问题分析:这个程序我觉得有点难,我做了三遍,因为前面的几行需要特别注意。
实验练习 4
1、简单问题描述
编写程序,从键盘分别输入年、月、日,计算出该天是这年中的第几天。程序流程图如下所示:
2、实验代码
1 #include"stdio.h" 2 int day_tab[2][13]={ 3 {0,31,28,31,30,31,30,31,31,30,31,30,31}, 4 {0,31,29,31,30,31,30,31,31,30,31,30,31}}; 5 int day_year(int y,int m,int d) 6 { 7 int i,j,s=0; 8 if(y%4==0&&y%100!=0) 9 i=1; 10 else i=0; 11 for(j=1;j<m;j++) 12 { 13 s=s+day_tab[i][j]; 14 } 15 s=s+d; 16 return s; 17 } 18 main() 19 { 20 int y,m,d; 21 printf("please input year_month_day:"); 22 scanf("%d%d%d",&y,&m,&d); 23 printf("是这年的第%d天\n",day_year(y,m,d)); 24 }
3运行结果:
4问题分析:此处的return s不能省去,同时参数需要在函数中用到。
实验练习 5
1、简单问题描述
编写程序,从键盘输入·一个字符,判断其是不是“回文数”,程序流程图如下所示:
2、实验代码
1 #include"stdio.h" 2 #include"string.h" 3 #define N 40 4 main() 5 { 6 char str[N],ch='Y';/*ch为一个标记位,可以为别的/ 7 int i; 8 int len; 9 printf("Input a string:"); 10 scanf("%s",&str); 11 len=strlen(str); 12 printf("\n"); 13 printf("字符串的长度为%d",len); 14 printf("\n"); 15 printf("\n"); 16 for(i=0;i<=len/2;i++)/*比较一半就可以,也可以全部/ 17 { 18 if(str[i]!=str[len-1-i]) 19 { 20 ch='N'; 21 break; 22 } 23 } 24 if(ch=='Y') 25 printf("%s是一个回文数\n",str); 26 else 27 printf("%s不是一个回文数",str); 28 }