zoukankan      html  css  js  c++  java
  • 第七章 数组实验

    第七章 数组实验

    ----------------------------------周萌 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个整数按从小到大的顺序排列(升序,用冒泡排序实现)

    1. 定义一个一维数组,其大小为10,即它能存放10个数据;

    2. 使用循环语句,利用随机函数产生10个整数存放在数组中;

    3. 编写排序函数sort1();

    4. 使用循环语句,将排好序的10个数依次输出。

    7.3.1.2. 写一个函数,对用随机函数产生的10个整数按从小到大的顺序排列(升序,用选择排序实现)

    1. 定义一个一维数组,其大小为10,即它能存放10个数据;

    2. 使用循环语句,利用随机函数产生10个整数存放在数组中;

    3. 编写排序函数sort1();

    4. 使用循环语句,将排好序的10个数依次输出。

    7.3.2.1.输出指定行数的杨辉三角形

    1. 怎样定义和使用二维数组;

    2. 怎样用循环进行二位数组中值的计算;

    3. 使用循环依次输出二维数组中的元素(注意换行);

    4. 用if语句根据条件判断某个字符是否是大写字母。

    7.3.2.2.给定某年某月某日,将其转换成这一年的第几天并输出

    1. 使用scanf()函数输入年、月、日;

    2. 使用一个二维数组存放闰年和非闰年的每个月的天数;

    3. 使用逻辑表达式判断某年是否是闰年;

    4. 使用变量day对前几个月的天数进行累加。

    7.3.3. 编写程序,判断某一字符是不是回文数,回文数是从左至右或者从右至左读起来都是一样的字符串

    1. 用scanf()函数,从键盘输入一个字符串存入字符数组中;

    2. 求出该字符串的长度;

    3. 用for循环依次比较,循环的终值为长度的一半;

    4. 设置一个标识符ch,初值为‘Y’,若某字符对不相等,将其设置为‘N’;

    5. 根据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]<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个整数:
    ");
    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("
    ");
    33     sort1(a,i);
    34     printf("排序后的结果:
    ");
    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;i<n-1;i++)
     9     {
    10         k=i;  //开始一趟选择排序,假定第i个元素是后面n-i+1个未排序的元素中最小的元素
    11         for(j=i+1;j<n;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个整数:
    ");
    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("
    ");
    37     sort1(a,i);
    38     printf("排序后的结果:
    ");
    39     for(i=0;i<10;i++)
    40     printf("%d  ",a[i]);
    41 } 

    ◆输出结果:

    ◆问题分析:

    与上一个问题的区别就是sort1函数内部的运算不同,选择排序顾名思义就是选择性排序,每次选出一个最小的数进行排列。

     


    7.3.2.1.输出指定行数的杨辉三角形

    ◆问题描述:编写程序,从键盘输入行数,输出指定行数的杨辉三角形。

    ◆流程图:

    ◆实验代码:

     1 #include <stdio.h>
     2 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("
    ");  /*当一行输出完以后换行继续下一行的输出*/
    19                      }
    20         printf("
    ");
    21 }

    ◆输出结果:

    ◆问题分析:

    杨辉三角即从第三行开始,除两端的数外,其他的数都等于上一个数及其左边的数之和。抓住这一点,得出a[i][j]=a[i-1][j-1]+a[i-1][j],即可得出代码。

     


    7.3.2.2.给定某年某月某日,将其转换成这一年的第几天并输出

    ◆问题描述:编写程序,从键盘分别输入年、月、日,计算出该天是这年中的第几天。

    ◆流程图:

    ◆实验代码:

     1 #include<stdio.h>
     2 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<month;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天
    ",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("
    ");
    13      printf("字符串长度为%d",len);
    14      printf("
    ");
    15      printf("
    ");
    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是一个回文数
    ",str);
    26     else
    27     printf("%s不是回文数",str); 
    28 }

    ◆输出结果:

    ◆问题分析:

    搞清楚函数中形参与实参的含义,形参代表一个传值的符号,即把值传进函数中进行运算。

     


     

    三、实验小结

    ◆ 数据作为函数参数时,形参接收的是数组内存的起始地址,因此实参和形参传递的时候不是值传递,而是地址传递,因此在函数内部改变形参数组时,实参数组的值也会被改变。

    ◆ 各种排序方法提供了不同的方式进行排序,但是对很多排序方法仍然不熟悉,不了解内涵。

  • 相关阅读:
    [转]K/3加密控制规则
    修改Delphi2009的界面风格
    [转]软件版本号讲解: 什么是Alpha, Beta, RC
    百度程序题目连续数问题
    得到正整数a的16进制表示
    四舍五入至某小数位后返回数字串
    返回相同宽度数字型字符串
    百度程序题目连续数问题 另解
    求二进制表示中1的个数
    六支筷子取其二,恰为一双的概率
  • 原文地址:https://www.cnblogs.com/AwakenZed/p/10946182.html
Copyright © 2011-2022 走看看