您的当前位置:首页正文

C语言程序设计实验报告六

2023-08-26 来源:意榕旅游网
C语⾔程序设计实验报告六C程序设计实验报告六

姓   名:赖瑾  

实验地点:家                      实验时间:2020年5⽉7⽇                 实验项⽬:                                  

⼀、实验⽬的与要求

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 给定某年某⽉某⽇,将其转换成这⼀年的第⼏天并输出1. 使⽤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#include#includevoid sort1(int s[],int n){

int i,j; int temp;

for(i=9;i>0;i--)

for(j=0;js[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 \ printf(\"\\n\"); sort1(a,10);

printf(\"输出排序后的10个整数\\n\"); for(i=0;i<10;i++) printf(\"%d \}

4、问题:①不太理解冒泡排序法怎么实现的 ②随机数的取法忘记了 ③%100以确保取的数在100以内      

5、分析:①我在纸上写了⼀些数字按冒泡排序法排了⼀下就理解了,就是从第⼀个数开始两两相⽐,⼤的放后⾯,这样⽐较后会使全部数中最⼤的数排在最后 ②在C语⾔中,rand()函数可以⽤来产⽣随机数,但是这不是真正意义上的随机数,是⼀个伪随机数,利⽤srand((unsigned int)(time(NULL))是⼀种⽅法,因为每⼀次运⾏程序的时间是不同的。 ③如果没有这个%100取到的数会偏⼤,这个算是⼀种技巧处理。6、最终运⾏效果:     

(2)7.3.1练习2 选择排序法的运⽤

1、问题的简单描述:写⼀个函数,对⽤随机函数产⽣的10个整数按从⼩到⼤的顺序排序(升序,⽤选择排序实现)2、流程图:3、实验代码:

#include#include#includesort2(int s[],int n){

int i,j,k,temp; for(i=0;ifor(j=i+1;j<=n-1;j++) //第i个数与后⾯n-i个数⽐较⼤⼩ {

if (s[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 \ printf(\"\\n\"); sort2(a,10);

printf(\"排序后的结果:\\n\"); for(i=0;i<10;i++) printf(\"%d \}

     

4、问题:这个⼤体是跟前⼀个是⼀样的,主要问题也是对选择排序法不清楚    

5、分析:选择排序法就是 第⼀次从下标为0的开始下标为0的这个数与后⾯的n-1个进⾏⽐较,找出最⼩或者最⼤的放在下标为0的这个位置,第⼆次从下标为1的开始⽐较,查询剩下的最⼤或者最⼩值,放在 下标为1的位置,以此类推,直到结束。6、最终运⾏效果:        

(3)7.3.2练习1 输出指定⾏数的杨辉三⾓

1、问题的简单描述:输出指定⾏数的杨辉三⾓形输出指定⾏数的杨辉三⾓形 

2、流程图: 3、实验代码:

#includemain(){

int a[50][50],i,j,n;

printf(\"请输⼊杨辉三⾓形的⾏数:\") ; scanf(\"%d\ 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\ printf(\"\\n\"); }}

       

4、问题:这个主要是要理解杨辉三⾓的构成还有就是空格排布        

5、分析:要先将它外围的1全部输⼊了构成⼀个框架,然后才能实现这种两数相加等于下⼀⾏的那个数的杨辉三⾓。如果没有%-4d这个部分的-4的话数字会排在⼀起不太好看,然后如果是4的话就是左补空格右对齐,这样看起来也怪怪的,加上-就是右补空格左对齐了。6、最终运⾏效果:         

(4)7.3.2练习1 输出指定⾏数的杨辉三⾓(等腰)

1、问题的简单描述:输出指定⾏数的杨辉三⾓形(等腰三⾓形)  

2、实验代码:

#includemain(){

int a[50][50],i,j,n;

printf(\"请输⼊杨辉三⾓形的⾏数:\") ; scanf(\"%d\ 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\ printf(\"\\n\"); }}

3、问题:这个之前也做过⽐较多了,但是这次⼜有点不同,我刚开始按之前那样做变成了下⾯这个样⼦    

4、分析:我刚开始就觉得很奇怪怎么会变成这样呢,代码没有什么问题呀,然后发现调整⼀下空格数量把%-4d改成了%-6d就变成等腰的了。5、最终运⾏效果:

(5)7.3.2练习2 输⼊年⽉⽇计算第⼏天

1、问题的简单描述:编写程序,从键盘分别输⼊年,⽉,⽇。计算出该天是这年中的第⼏天。2、流程图:  

3、实验代码:

#includeint 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;js=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\

printf(\"是这年的第%d天\\n\}

4、问题分析:这个基本没有什么问题,就是复习了⼀下闰年的判断条件,还有就是运⽤了⼆维数组,更了解了⼆维数组的⽤处⽤法。  

5、最终运⾏效果:

(6)7.3.3 判断输⼊的数是不是回⽂数

1、问题的简单描述:编写程序,从键盘输⼊⼀个字符串,判断其是否为回⽂数。2、流程图: 3、实验代码:

#include#include#define N 40main(){

char str[N],ch='Y'; int i; int len;

printf(\"Intput a string:\"); scanf(\"%s\

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\ else

printf(\"%s不是⼀个回⽂数\\n\ }

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加-右补空格。     

因篇幅问题不能全部显示,请点此查看更多更全内容