• 第七章实验报告


    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、实验练习(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,temp;
    for(i=0;i<n-1;i++)
            {
                for(j=9;j>=i+1;j--)
                   {
                       if(s[j]<s[j-1])
                         {
                             temp=s[j];
                             s[j]=s[j-1];
                             s[j-1]=temp;
                         }
                   }
            }
    }
    main()
    {
        int i,a[10];
        srand(time(NULL));
        printf("随机产生10个整数:
    ");
        for(i=0;i<10;i++)
           a[i]=rand()%100;
        for(i=0;i<10;i++)
           printf("%d  ",a[i]);
           printf("
    ");
        sort1(a,10);
           printf("排序后的结果:
    ");
        for(i=0;i<10;i++)
           printf("%d  ",a[i]);    
    }

    3.问题分析:

    a、主要的问题:首先这个程序的最主要的问题是函数的调用问题。

          解决方法:该程序的一个核心算法就是冒泡排序法,它是通过选取两个数进行比较以及数之间换位置来进行排序,而两数之间的数值交换是引入第三变量,该算法大概就是这样。

    还有就是对于参数的定义,例如形参int s[ ],当我后面在用时应该用a[ ],而不是s,否则不会对这10个数进行排列。

    b、程序运行如下:

    2、实验练习(7.3.1.2):

    1.问题的简单描述:

    编写函数,利用随机函数产生10个随机数,按升序排列输出.

    2.程序流程图:

    3.实验代码:

    #include"stdio.h"
    #include"stdlib.h"
    #include"time.h"
    void sort2(int s[],int n)
    {
        int i,j,k;
        int temp;
        for(i=0;i<n-1;i++)
            {   
                k=i;
                for(j=i+1;j<=n-1;j++)
                   {
                       if(s[j]<s[k])
                         {
                             k=j;
                             }
                   }
                   if(k!=i)
                             {
                        temp=s[k];
                             s[k]=s[i];
                             s[i]=temp;
                             }
            }
    }
    main()
    {
        int i,a[10];
        srand(time(NULL));
        printf("随机产生10个整数:
    ");
        for(i=0;i<10;i++)
           a[i]=rand()%100;
        for(i=0;i<10;i++)
           printf("%d  ",a[i]);
           printf("
    ");
        sort2(a,10);
           printf("排序后的结果:
    ");
        for(i=0;i<10;i++)
           printf("%d  ",a[i]);    
    }

    4.问题分析:

    a、这个程序中的main函数和上面的那个程序中的一样,主要是它的排序方法变了,使用的是选择排序法,主要按照流程图来,并不是很难。

    b、程序运行如下:

    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("%5d",a[i][j]);
                    printf("
    ");
                }
                printf("
    ");
        
    }

    3.问题分析:

    a、主要的问题:怎么样将数字能够按照书上这么排列

          解决方法:该程序用了两个嵌套的for循环,其中的第一个和最后一个是输入和输出数组,而其中最核心的算就是 a[i][j]=a[i-1][j-1]+a[i-1][j],其意义就是下一项目是上面两项的和,让后在用换行就行

    b、程序运行如下:

    4、实验练习(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;
            printf("%d",i);
            for(j=1;j<m;j++)
               {
                   s=s+day_tab[i][j];
               }
               s=s+d;
               return s;
        }
        main()
        {
            int y,m,d,n;
            printf("input year_month_day:
    ");
            scanf("%d%d%d",&y,&m,&d);
            n=day_year(y,m,d);
            printf("是这年的第%d天
    ",n);
        }

    4.问题分析:

    a、这个程序是但是问题最大的一个题目了,首先是不知道书上提示的统计函数的头部怎么编写,这个问题是通过看书上的内容自行解决,也就是最year,month,day进行整形就行,应为这几个变量都只能是整数。第二个问题就是运行的结果一直都是347天,而正确的答案是346天,这个问题是通过老师的帮助完成的,老师让我输出一下 i 的值,结果 i 的值一直都是1,而其应该是0,所以这才是错误的根源。而我这个程序的最大的问题就是搞清楚if中的判断条件,不应该用i,而是用year,通过year来判断 i 的取值。

    b、程序运行如下:

    5、实验练习(7.3.3):

    1.问题的简单描述:

    编写 程序,从键盘输入一个字符串,判断其是否为回文数。

    2.程序流程图:

     

    3.实验代码:

    #include"stdio.h"
    #include"string.h"
    #define n 40
    main()
    {
        char str[n],ch='y',s;
        int i;
        int len;
        printf("请输入一段字符:");
        scanf("%s",str);
        len=strlen(str);
        for(i=0;i<=len/2;i++)
        {
            if(str[i]!=str[len-i-1])
            {
                ch='n';
                break;
            } 
        }
        
            if(ch=='y')
            printf("%s是一个回文数
    ",str);
            else
            printf("该字符串不是回文数");                       
    }

    4.问题分析:

    a、这个程序最大的问题就是理解这个算法,以及我一直出错的地方,if中的判断语句。其实很多时候都是应为这种小的问题,而导致整个程序无法运行。回文数从左至右和从右至左一致,所以只需判断前一半与后一半对应数是否一致,所以无需判断所有的字符。

    b、程序运行如下:

     

    三、实验小结

    这次实验课总共完成了5个实验,我觉得这次的几个实验都比较有难度。这是我在这次实验课上的收获:1、#include "stdio.h",这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 stdio 的文件,而其就是一个输入和输出函数。2、选择排序法和冒泡排序法的异同点,相同点:¹都是通过n-1组排出具有n个数的顺序  ²都是通过逐个比较,调整位置。不同点:冒泡排序法是最值在其中和其他值交换。选择排序法确是假定一个最值,所以最值和其他值得交换就发生在假定最值得地方。3、rand()函数的作用是随机产生数,而其最大的缺陷就是会产生重复的随机数,在rand函数后面加上%100的意思就是100以内的随机数。4、%md指的是以宽度m输出整数,数据宽度不足m时,左补空格。杨辉三角之间的空格就可以用%5d来实现。

  • 相关阅读:
    win10 uwp 如何判断一个对象被移除
    win10 uwp 如何判断一个对象被移除
    上传代码 CodePlex
    上传代码 CodePlex
    如何使用 Q#
    让 AE 输出 MPEG
    让 AE 输出 MPEG
    解决 vs 出现Error MC3000 给定编码中的字符无效
    解决 vs 出现Error MC3000 给定编码中的字符无效
    PHP date_date_set() 函数
  • 原文地址:https://www.cnblogs.com/zjm956/p/10948381.html
Copyright © 2020-2023  润新知