第十六课 数组的引入 【项目1-5】

第十六课 数组的引入




项目一 【数组大折腾】

(1)创建一个有20个元素的整型数组。通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后(从第0个到第19个)输出数组中元素的值,每5个元素换一行。

  1. int main( )  
  2. {  
  3.     int a[20]={...};  //初始化前10个元素  
  4.     //键盘输入后10个元素的值  
  5.               
  6.     //由前往后输出数组中全部元素的值  
  7.     printf("由前往后,数组中的值是:\n");  
  8.   
  9.   
  10.     return 0;  
  11. }  
(2)创建一个长度为10的整型数组并初始化,由后往前(由第9个元素向第0个元素方向)输出数组中全部元素的值,改变数组元素的值,令全部的数据加倍,输出改变后的值。
(3)创建一个长度为16的整型数组a并初始化。先输出数组中元素值为3的倍数的数,再输出全部下标为3的倍数的元素值。输出如图示。



(4)创建一个长度为16的整型数组a并初始化,删除数组中全部能被3整除的元素(数组中实际有效使用的元素将不足16)。输出删除后数组中的全部元素。
(5)创建一个长度为16的整型数组a并初始化前15个元素,输入一个整数b。将b插入到a[0]位置(原有的数据往后“移动”)。


(1)代码:
#include<stdio.h>
#define NUM 20
int main()
{
    int a[NUM]={1,2,3,4,5,6,7,8,9,10};
    int i=1;
    for(i=NUM-10;i<NUM;i++)
        scanf("%d",&a[i]);
    for(i=0;i<20;i++)
    {
        printf("%d ",a[i]);
        if((i+1)%5==0)
            printf("\n");
    }
    return 0;
}

执行结果:



(2)代码:
#include<stdio.h>
int main()
{
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    int i;
    printf("变化之前\n");
    for(i=9;i>=0;i--)
        printf("%d ",a[i]);
    printf("\n");
    printf("数据变化两倍\n");
    for(i=9;i>=0;i--)
    {
        a[i]*=2;
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

执行结果:



(3)代码:
#include<stdio.h>
int main()
{
    int a[16]={15,64,67,19,35,42,6,25,39,48,67,51,62,35,33,59};
    int i;
    printf("元素值为3的倍数的数:\n");
    for(i=0;i<16;++i)
    {
        if((a[i]%3)==0)
            printf("a[%d]  %d\n",i,a[i]);
    }
    printf("以下为3的倍数元素值:\n");
    for(i=0;i<16;++i)
    {
        if(i%3==0)
            printf("a[%d]  %d\n",i,a[i]);
    }
    return 0;
}

执行结果:



(4)代码:
#include<stdio.h>
int main()
{
    int a[16]={36,39,13,46,24,45,34,16,34,84,33,18,99,14,36,24};
    int b[16];
    int i,j=0,k;
    printf("原数列:");
    for(i=0;i<16;++i)
    {
        printf("%d ",a[i]);
        if((a[i]%3)==0)
        {
            b[j]=a[i];
            j++;
        }
    }
    k=j;
    j=0;
    printf("\n以下数是3的倍数:");
    for(i=0;i<k;++i)
    {
        a[i]=b[j];
        j++;
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

执行结果:


(5)代码:
#include<stdio.h>
int main()
{
    int a[16]={12,35,64,36,46,3,57,24,7,53,35,94,91,76,64};
    int i,b;
    printf("请输入整数b:");
    scanf("%d",&b);
    for(i=14;i>=0;--i)
    {
       a[i+1]= a[i];
    }
    a[0]=b;
    printf("\n增加b数值后为:");
    for(i=0;i<16;i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

执行结果:







项目二【成绩处理】
在数组score中将要存储某小组C程序设计的成绩。请完毕以下的处理:
(1)输入小组人数及成绩。要保证成绩在0-100之间。
(2)输出该小组的最高成绩、最低成绩、平均成绩;
(3)输出考得最高成绩和最低成绩的同学的人数;
(4)输出考得最高成绩和最低成绩的同学的学号(设数组下标即学号,可能有同样的成绩)。
(5)(选做)求出全部同学成绩的标准偏差,标准偏差公式为。当中为样本(即某同学成绩)为均值(前面已经求出)。N为样本数目
提示1:能够採用“渐进式”策略。实现一个功能后调试通过,再实现下一个功能。


提示2:界面參考见图

提示3:请思考,假设这里的同学人数非常多。比如500、10000名,这个程序中通过键盘输入的方式,已经显得无能为力!怎样解决?

  1. int main()  
  2. {  
  3.     int score[50]; //保存成绩的数组,不会超过50名  
  4.     int num,i;        //小组人数  
  5.     printf("小组共同拥有多少名同学?";  
  6.     scanf("%d", &num);  
  7.   
  8.   
  9.     printf("请输入学生成绩:\n")  
  10.     //输入num名同学的成绩  
  11.   
  12.   
  13.     //求出并输出最高成绩、最低成绩和平均成绩  
  14.   
  15.   
  16.     //求出并输出考得最高成绩和最低成绩人数以及学号  
  17.   
  18.   
  19.     //求出并输出标准偏差(选做)  
  20.     return 0;  
  21. }  

代码:
#include <stdio.h>
#include<math.h>
int main()
{
    int a[50];
    int i,s=0,max=0,min=100;
    int minnum,maxnum,num,ave;
    printf("请输入学生人数:");
    scanf("%d",&num);
    printf("请输入成绩:\n");
    for(i=0;i<num;i++)
    {
        printf("输入第%d位同学成绩:",i+1);
        scanf("%d",&a[i]);
        if(a[i]>100||a[i]<0)
        {
            printf("输入错误!请又一次");
            i--;
            continue;
        }
        if(a[i]>max)
            max=a[i];
        if(a[i]<min)
            min=a[i];
        s=s+a[i];
    }
    ave=s/num;
    printf("\n最高成绩为:%d, 最低成绩为:%d, ",max,min);
    printf("平均成绩为:%d\n",ave);
    maxnum=0;
    minnum=0;
    for(i=0;i<num;i++)
    {
        if(a[i]==max)
            maxnum++;
        if(a[i]==min)
            minnum++;
    }
    printf(" %d位同学考了最高分%d分, 学号为:",maxnum,max);
    for(i=0;i<num;i++)
    {
        if(a[i]==max)
            printf("%d ",i+1);
    }
    printf("\n %d位同学考了最低分%d分, 学号为:",minnum,min);
    for(i=0;i<num;i++)
    {
        if(a[i]==min)
            printf("%d ",i+1);
    }
    int x=0,sum=0;
    for(i=0;i<num;i++)
    {
        x=a[i]-ave;
        sum+=x*x;
    }
    printf("\n4全部同学的标准偏差为:%.4f\n",sqrt((double)(sum)/(num-1)));

    return 0;
}
执行结果:






项目三【当年第几天】

当年第几天中定义一个函数。其參数为年、月、日的值,返回这一天为该年的第几天。

要求在main函数中输入年月日,然后调用这个函数求值,并在main函数中输出结果。

  1. #include<stdio.h>  
  2. int days(int y, int m, int d);  
  3. int main()  
  4. {  
  5.     int year, month, day;  
  6.     printf("输入年 月 日: ");  
  7.     scanf("%d %d %d", &year, &month, &day);  
  8.     printf("这是该年的第 %d 天\n", days(year, month, day));  
  9.     return 0;  
  10. }  
  11.   
  12.   
  13. int days(int y, int m, int d)  
  14. {  
  15.     int dd[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  
  16.     //请利用d数组,10行之内。求出并返回y年m月d日是这一年的第几天  
  17.   
  18.   
  19. }  
代码:
#include <stdio.h>
int days(int y,int m,int d);
int main()
{
    int year,month,day;
    printf("请输入年 月 日:");
    scanf("%d %d %d",&year,&month,&day);
    printf("今天是当年第%d天\n",days(year,month,day));
    return 0;
}
int days(int y,int m,int d)
{
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int sum=d,i;
    for(i=1;i<=(m-1);i++)
        sum=sum+a[i];
    if(m>2&&((y%4==0&&y%100!=0)||y%400==0))
        sum++;
    return sum;
}
执行结果:







项目四【一副扑克牌】

以下的程序,输出了52张扑克牌(如图),请补充完整程序。

  1. #include <stdio.h>  
  2. int main( )  
  3. {  
  4.     char c[4]= {'H','S','D','C'};  
  5.     int v[13]= {1,2,3,4,5,6,7,8,9,10,11,12,13};  
  6.     int i,j;  
  7.     for(i=0; i<4; i++)  
  8.     {  
  9.         for(j=0; j<13; j++)  
  10.         {  
  11.             printf("%c",________);  
  12.             if(v[j]==1)  
  13.                 printf("A");  
  14.             else if(___________)  
  15.                 printf("J");  
  16.             else if(v[j]==12)  
  17.                 ______________;  
  18.             else if(v[j]==13)  
  19.                 printf("K");  
  20.             else  
  21.                 printf("%d",________);  
  22.             printf(" ");  
  23.         }  
  24.         printf("\n");  
  25.     }  
  26.     return 0;  
  27. }  


代码:
#include <stdio.h>
int main()
{
    char c[4]={6,3,5,4};
    int v[13]={1,2,3,4,5,6,7,8,9,10,11,12,13};
    int i,j;
    for(i=0;i<4;i++)
    {
        for(j=0;j<13;j++)
        {
            printf("%c",c[i]);
            if(v[j]==1)
                printf("A");
            else if(v[j]==11)
                printf("J");
            else if(v[j]==12)
                printf("Q");
            else if(v[j]==13)
                printf("K");
            else
                printf("%d",v[j]);
            printf(" ");
        }
        printf("\n");
    }
    return 0;
}
执行结果:



 


项目五【发奖金】

(1)过春节了,村里要庆祝一下。

村长对村里的128个村民说:做一个游戏,让每一个人把出生年+月+日得到一个数。比如:1995年11月8日=1995+11+8=2014。然后把这个数报上来。村里有一笔钱要作为游戏的奖金,数额为M元(在程序中能够用常量固定为一个数)。假设有人报上来的数字与M同样。就把这笔钱发给这些人。假设仅仅 有一个人得奖,奖金都归这个人。如 果有多于一个人得奖,则他们平分这 笔钱。如今让我们来写一段程序算算 都有哪些人得到了奖金?得到多少?请写出这个程序。

(2)有村民提出村长在幸运数字上做手脚。不公平。改动后的规则是:每人写一个1000以内的数字。谁写的数字与平均值最接近,M元的奖金就由谁拿。有多人与平均值差值同样。则均分。比如。參加的村民有5个人。报的数字分别为98、7、50、980、1,平均值为227(平均值也取成整数即可了),与98最接近,编号为0的村民得奖。这个游戏实际上有非常强的政治学背景,一种策略是串通,大家都报一样的数。平分奖金;在每一个人都想争取最大利益的前提下。各人报的数字又对结果都有影响。这里面包括一系列非常有意思的研究课题。

  提示:输入数据后。用一次循环求和,进而求出平均值;再一次循环。求出最小的差值;再一次循环,将差值最小的村民的编号放入幸运数组(由于可能不止一位。所以须要这个数组)。

(1)代码:
#include<stdio.h>
#define M 2014
#define num 128
int main()
{
    int people[num];
    int luckypeople[num];
    int i,luckynum=0;
    for(i=0;i<num;i++)
    {
        printf("第%d位村民请输入数字:",i);
        scanf("%d",&people[i]);
        if(people[i]==M)
        {
            luckypeople[luckynum]=i;
            luckynum++;
        }
    }
    if(luckynum>0)
    {
        printf("\n获奖者编号为:\n");
        for(i=0;i<luckynum;i++)
        {
            printf("%d ",luckypeople[i]);
        }
    }
    else
        printf("\n非常可惜。没有人获奖\n");

    return 0;
}


(2)代码:
#include<stdio.h>
#define N 8
int main()
{
    int peoplenum[N];   //每一个人的报数
    int avenum[N];      //每人报的数与平均数的差值
    int luckypeople[N];  //中奖人的编号
    int i,sum=0,ave,min=1000;
    int luckynum=0,m,money;
    for(i=0;i<N;i++)    // 录入每人的数字
    {
        scanf("%d",&peoplenum[i]);
        sum+=peoplenum[i];  // 求和
    }
    ave=sum/N;  // 求平均数
    for(i=0;i<N;i++)      // 录入每人报的数与平均数的差值
    {
        avenum[i]=ave-peoplenum[i];
        if(avenum[i]<0)    // 绝对值
            avenum[i]=-avenum[i];
        if(avenum[i]<min)    // 求最小的差值min
            min=avenum[i];
    }
    for(i=0;i<N;i++)     // 差值最小即中奖人,并录入其编号
        if(avenum[i]<=min)
        {
            luckypeople[luckynum]=i;
            luckynum++;         // 中奖人共luckymun人
        }
    money=2014/luckynum;       // 奖金平分
    printf("\n平均数:%d, ",ave);
    printf("最小差值:%d\n",min);
    printf("共%d人中奖\n",luckynum);
    for(i=0;i<luckynum;i++)    // 输出中奖人
    {
        m=luckypeople[i];
        printf("幸运者编号:%d 数字为:%d 获得奖金:%d\n",m,peoplenum[m],money);
    }
    return 0;
}

执行结果:





















posted on 2018-01-30 08:24  yjbjingcha  阅读(529)  评论(0编辑  收藏  举报

导航