----------------------------------周萌 18物联网班
实验项目:
-
7.3.1.1. 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排列(升序,用冒泡排序实现)
-
7.3.1.2. 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排列(升序,用选择排序实现)
-
7.3.2.1. 输出指定行数的杨辉三角形
-
7.3.2.2. 给定某年某月某日,将其转换成这一年的第几天并输出
-
7.3.3. 编写程序,判断某一字符是不是回文数,回文数是从左至右或者从右至左读起来都是一样的字符串
一、实验目的与要求
7.3.1.1. 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排列(升序,用冒泡排序实现)
-
定义一个一维数组,其大小为10,即它能存放10个数据;
-
使用循环语句,利用随机函数产生10个整数存放在数组中;
-
编写排序函数sort1();
-
使用循环语句,将排好序的10个数依次输出。
7.3.1.2. 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排列(升序,用选择排序实现)
-
定义一个一维数组,其大小为10,即它能存放10个数据;
-
使用循环语句,利用随机函数产生10个整数存放在数组中;
-
编写排序函数sort1();
-
使用循环语句,将排好序的10个数依次输出。
7.3.2.1.输出指定行数的杨辉三角形
-
怎样定义和使用二维数组;
-
怎样用循环进行二位数组中值的计算;
-
使用循环依次输出二维数组中的元素(注意换行);
-
用if语句根据条件判断某个字符是否是大写字母。
7.3.2.2.给定某年某月某日,将其转换成这一年的第几天并输出
-
使用scanf()函数输入年、月、日;
-
使用一个二维数组存放闰年和非闰年的每个月的天数;
-
使用逻辑表达式判断某年是否是闰年;
-
使用变量day对前几个月的天数进行累加。
7.3.3. 编写程序,判断某一字符是不是回文数,回文数是从左至右或者从右至左读起来都是一样的字符串
-
用scanf()函数,从键盘输入一个字符串存入字符数组中;
-
求出该字符串的长度;
-
用for循环依次比较,循环的终值为长度的一半;
-
设置一个标识符ch,初值为‘Y’,若某字符对不相等,将其设置为‘N’;
-
根据ch是‘Y’还是‘N’,输出该字符串是否是回文数。
二、实验内容
7.3.1.1. 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排列(升序,用冒泡排序实现)
◆问题描述:
编写程序,利用随机函数产生10个整数,按升序排列输出。
◆流程图:
◆实验代码:
1 #include"stdio.h" 2 #include"stdlib.h" 3 #include"time.h" 4 int sort1(int s[],int n) 5 { 6 int i,j; 7 int temp; 8 for(i=0;i<9;i++) 9 { 10 for(j=0;j<9-i;j++) 11 { 12 if(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("随机产生10个整数:\n"); 26 for(i=0;i<10;i++) 27 { 28 a[i]=rand()%100; 29 } 30 for(i=0;i<10;i++) 31 printf("%d ",a[i]); 32 printf("\n"); 33 sort1(a,i); 34 printf("排序后的结果:\n"); 35 for(i=0;i<10;i++) 36 printf("%d ",a[i]); 37 }
◆输出结果:
◆问题分析:
函数调用时就不需要写明[]里面的如“int”数据类型了,写了的话会报错,编译无法通过。
7.3.1.2. 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排列(升序,用选择排序实现)
◆问题描述:
编写程序,利用随机函数产生10个整数,按升序排列输出。
◆流程图:
◆实验代码:
1 #include"stdio.h" 2 #include"stdlib.h" 3 #include"time.h" 4 int sort1(int s[],int n) 5 { 6 int i,j,k; 7 int temp; 8 for(i=0;i1;i++) 9 { 10 k=i; //开始一趟选择排序,假定第i个元素是后面n-i+1个未排序的元素中最小的元素 11 for(j=i+1;j ) 12 { 13 if(s[k] > s[j]) //如果发现比当前最小元素还小的元素,则更新记录最小元素的下标k 14 k=j; 15 } 16 //如果最小元素的下标不是后面n-i+1的未排序序列的第一个元素,则需要交换第i个元素和后面找到的最小元素的位置 17 if(k != i) 18 { 19 temp=s[k]; 20 s[k]=s[i]; 21 s[i]=temp; 22 } 23 } 24 } 25 main() 26 { 27 int i,a[10]; 28 srand(time(NULL)); 29 printf("随机产生10个整数:\n"); 30 for(i=0;i<10;i++) 31 { 32 a[i]=rand()%100; 33 } 34 for(i=0;i<10;i++) 35 printf("%d ",a[i]); 36 printf("\n"); 37 sort1(a,i); 38 printf("排序后的结果:\n"); 39 for(i=0;i<10;i++) 40 printf("%d ",a[i]); 41 }
◆输出结果:
◆问题分析:
与上一个问题的区别就是sort1函数内部的运算不同,选择排序顾名思义就是选择性排序,每次选出一个最小的数进行排列。
7.3.2.1.输出指定行数的杨辉三角形
◆问题描述:编写程序,从键盘输入行数,输出指定行数的杨辉三角形。
◆流程图:
◆实验代码:
1 #include2 main() 3 { 4 int i, j, n, a[50][50]; 5 printf("请输入杨辉三角的行数:"); 6 scanf("%d",&n); 7 for(i=1;i<=n;i++) 8 { 9 a[i][1] = 1; 10 a[i][i] = 1; /*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/ 11 } 12 for(i=3;i<=n;i++) 13 for(j=2;j<=i-1;j++) 14 a[i][j]=a[i-1][j-1]+a[i-1][j]; /*除两边的数外都等于上两顶数之和*/ 15 for(i=1;i<=n;i++){ 16 for(j=1;j<=i;j++) /*j<=i的原因是不输出其它的数,只输出我们想要的数*/ 17 printf("%5d",a[i][j]); 18 printf("\n"); /*当一行输出完以后换行继续下一行的输出*/ 19 } 20 printf("\n"); 21 }
◆输出结果:
◆问题分析:
杨辉三角即从第三行开始,除两端的数外,其他的数都等于上一个数及其左边的数之和。抓住这一点,得出a[i][j]=a[i-1][j-1]+a[i-1][j],即可得出代码。
7.3.2.2.给定某年某月某日,将其转换成这一年的第几天并输出
◆问题描述:编写程序,从键盘分别输入年、月、日,计算出该天是这年中的第几天。
◆流程图:
◆实验代码:
1 #include2 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 }; 6 int day_year(int year,int month,int day) 7 { 8 int i,j,s=0; 9 if(year%4==0&&year%100!=0||year%400==0)/*能被4整除但不能被100整除的年份为普通闰年.*/ 10 i=1; 11 else 12 i=0; 13 for(j=1;j ) 14 s=s+day_tab[i][j]; 15 s=s+day; 16 return s; 17 } 18 main() 19 { 20 int y,m,d,n; 21 printf("请输入年、月、日:"); 22 scanf("%d,%d,%d",&y,&m,&d); 23 n=day_year(y,m,d); 24 printf("%d年%d月%d日是这年的第%d天\n",y,m,d,n); 25 }
◆输出结果:
◆问题分析:
无。
7.3.3. 编写程序,判断某一字符是不是回文数,回文数是从左至右或者从右至左读起来都是一样的字符串
◆问题描述:编写程序,从键盘输入一个字符串,判断其是否为回文数。
◆流程图:
◆实验代码:
1 #include"stdio.h" 2 #include"string.h" 3 #define N 40 4 main() 5 { 6 char str[N],ch='Y'; 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-i-1]) 19 { 20 ch='N'; 21 break; 22 } 23 } 24 if(ch=='Y') 25 printf("%s是一个回文数\n",str); 26 else 27 printf("%s不是回文数",str); 28 }
◆输出结果:
◆问题分析:
搞清楚函数中形参与实参的含义,形参代表一个传值的符号,即把值传进函数中进行运算。
三、实验小结
◆ 数据作为函数参数时,形参接收的是数组内存的起始地址,因此实参和形参传递的时候不是值传递,而是地址传递,因此在函数内部改变形参数组时,实参数组的值也会被改变。
◆ 各种排序方法提供了不同的方式进行排序,但是对很多排序方法仍然不熟悉,不了解内涵。