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

来源:互联网 发布:淘宝产品摄影技巧大全 编辑:程序博客网 时间:2024/05/29 15:32
第十六课 数组的引入




项目一 【数组大折腾】

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

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  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 20int 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名,这个程序中通过键盘输入的方式,已经显得无能为力!如何解决?
[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  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函数中输出结果。

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  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张扑克牌(如图),请补充完整程序。

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  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 128int 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 8int 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;}

运行结果:





















0 0