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 给定某年某月某日,将其转换成这一年的第几天并输出

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

     回到顶部

posted @ 2020-05-07 17:08  赖瑾  阅读(1280)  评论(0编辑  收藏  举报