C语言程序设计实验报告六
C程序设计实验报告六
姓 名:赖瑾
实验地点:家
实验时间:2020年5月7日
实验项目:7.3.1练习1 冒泡排序法的运用
7.3.1练习2 选择排序法的运用
7.3.2练习1 输出指定行数的杨辉三角
7.3.2练习1 输出指定行数的杨辉三角(等腰)
7.3.2练习2 输入年月日计算第几天
7.3.3 判断输入的数是不是回文数
一、实验目的与要求
7.3.1练习1 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,冒泡排序实现)
1.定义一个一维整型数组,其大小为10,即它能存放10个数据;
2.使用循环语句,利用随机函数产生10个整数存放在数组中;
3.编写排序函数sort1();
4.使用循环语句,将排好序的10个数依次输出;
5.将数组定义为全局数组或局部数组;
6.在主函数中,用随机函数生成10个元素放入数组中;
7.将sort1()函数部分放入主函数中。
7.3.1.练习2 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用选择排序实现)
1.定义一个一维整型数组,其大小为10,即它能存放10个数据;
2. 使用循环语句,利用随机函数产生10个整数存放在数组中;
3.编写排序函数sort1();
4.使用循环语句,将排好序的10个数依次输出;
5.将数组定义为全局数组或局部数组;
6.在主函数中,用随机函数生成10个元素放入数组中;
7.将sort1()函数部分放入主函数中。
7.3.2练习1 输出指定行数的杨辉三角形
1.怎样定义和使用二维数组;
2.怎样用循环进行二维数组中值的计算;
3.使用循环依次输出二维数组中的元素(注意换行);
4.用if语句根据条件判断某个字符是否是大写字母。
7.3.2练习2 给定某年某月某日,将其转换成这一年的第几天并输出
- 使用scanf()函数输入年、月、日;
2.使用一个二维数组存放闰年和非闰年的每个月的天数;
3.使用逻辑表达式判断某年是否是闰年;
4.使用变量day对前几个月的天数进行累加;
5.在强化练习中,学生将练习不使用二维数组存放每个月的天数;
6.使用if语句对年、月、日的正确性进行验证;
7.将存放每个月的天数的二维数组说明为局部数组。
7.3.3 编写程序,判断某一字符是不是“回文数”,回文数是从左至右或从从右至左读起来都是一样的字符
1.用scanf()函数,从键盘输入一个字符串存入字符数组中
2.求出该字符串的长度
3.用for循环依次比较,循环的终值为长度的一半
4.设置一个标志符ch,初值为‘Y’,若某字符对不相等,将其设置为‘N’
5.根据ch是‘Y’还是‘N’,输出该字符串是否是回文数
6.强化练习中不使用strlen()求出字符串的长度
7.将求回文数的部分独立出来,编成一个函数
二、实验内容
(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;
int temp;
for(i=9;i>0;i--)
for(j=0;j<i;j++) //从下标为0的数开始两两比较
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个整数:\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("输出排序后的10个整数\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
4、问题:①不太理解冒泡排序法怎么实现的 ②随机数的取法忘记了 ③%100以确保取的数在100以内
5、分析:①我在纸上写了一些数字按冒泡排序法排了一下就理解了,就是从第一个数开始两两相比,大的放后面,这样比较后会使全部数中最大的数排在最后 ②在C语言中,rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。 ③如果没有这个%100取到的数会偏大,这个算是一种技巧处理。
6、最终运行效果:
(2)7.3.1练习2 选择排序法的运用
1、问题的简单描述:写一个函数,对用随机函数产生的10个整数按从小到大的顺序排序(升序,用选择排序实现)
2、流程图:
3、实验代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
sort2(int s[],int n)
{
int i,j,k,temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<=n-1;j++) //第i个数与后面n-i个数比较大小
{
if (s[j]<s[k])
k=j;
}
if(k!=i) //if语句用于交换使最小数位于前方
{
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、问题:这个大体是跟前一个是一样的,主要问题也是对选择排序法不清楚
5、分析:选择排序法就是 第一次从下标为0的开始下标为0的这个数与后面的n-1个进行比较,找出最小或者最大的放在下标为0的这个位置,第二次从下标为1的开始比较,查询剩下的最大或者最小值,放在 下标为1的位置,以此类推,直到结束。
6、最终运行效果:
(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("%-4d",a[i][j]);
printf("\n");
}
}
4、问题:这个主要是要理解杨辉三角的构成还有就是空格排布
5、分析:要先将它外围的1全部输入了构成一个框架,然后才能实现这种两数相加等于下一行的那个数的杨辉三角。如果没有%-4d
这个部分的-4
的话数字会排在一起不太好看,然后如果是4
的话就是左补空格右对齐,这样看起来也怪怪的,加上-
就是右补空格左对齐了。
6、最终运行效果:
(4)7.3.2练习1 输出指定行数的杨辉三角(等腰)
1、问题的简单描述:输出指定行数的杨辉三角形(等腰三角形)
2、实验代码:
#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<=n-i;j++) //变成等腰三角形的关键
printf(" ");
for(j=1;j<=i;j++)
printf("%-6d",a[i][j]);
printf("\n");
}
}
3、问题:这个之前也做过比较多了,但是这次又有点不同,我刚开始按之前那样做变成了下面这个样子
4、分析:我刚开始就觉得很奇怪怎么会变成这样呢,代码没有什么问题呀,然后发现调整一下空格数量把%-4d
改成了%-6d
就变成等腰的了。
5、最终运行效果:
(5)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;
for(j=1;j<m;j++)
{
s=s+day_tab[i][j]; //计算整月的天数
}
s=s+d;
return s;
}
main()
{
int y,m,d;
printf("input year_month_day:\n");
scanf("%d,%d,%d",&y,&m,&d);
printf("是这年的第%d天\n",day_year(y,m,d));
}
4、问题分析:这个基本没有什么问题,就是复习了一下闰年的判断条件,还有就是运用了二维数组,更了解了二维数组的用处用法。
5、最终运行效果:
(6)7.3.3 判断输入的数是不是回文数
1、问题的简单描述:编写程序,从键盘输入一个字符串,判断其是否为回文数。
2、流程图:
3、实验代码:
#include<stdio.h>
#include<string.h>
#define N 40
main()
{
char str[N],ch='Y';
int i;
int len;
printf("Intput a string:");
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不是一个回文数\n",str);
}
4、问题分析:这个程序这句for(i=0;i<=len/2;i++)
比较关键回文数是前一半和后一半一样,这里如果是奇数用/
回舍去小数刚好满足我们的需求。
5、最终运行效果:
四、实验小结
这次的代码敲了比较久,主要是因为对冒泡排序法和选择排序法的理解不够清晰,光看理论表述感觉自己理解了,但其实还是没有动手写了一下过程感觉就理解多了。冒泡排序法就是比较相邻的两个数,将小数放在前面,大数放在后面这样比较下去最大的数就会排在最后面。选择排序法是第一次从下标为0的开始下标为0的这个数与后面的n-1个进行比较,找出最小或者最大的放在下标为0的这个位置,第二次从下标为1的开始比较,查询剩下的最大或者最小值,放在 下标为1的位置,以此类推,直到结束。
然后还要就是之前的一些知识忘记了不少,所以边敲边遇到问题又边回去复习就花了比较多的时间。
在这里记一下这次实验发现的忘记了的知识加深下记忆:
①在C语言中,rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。
②字段宽度修饰符:%md
以宽度m输出整型数,数据宽度不足m时,左补空格;%0md
以宽度m输出整型数,数据宽度不足m时,左补0;%m.nf
以宽度m输出实型小数,小数位为n;%-md
加-
右补空格。