前言
本文为业余学习《明解C语言入门篇》的记录,包含代码清单和练习题。
开始学习时间:2022年8月21日
+++++++++++++++++++++++++++++++
第1章 初识C语言
第2章 运算和数据类型
第3章 分支结构程序
第4章 程序的循环控制
第5章 数组
第6章 函数
第7章 基本数据类型
第8章 动手编写各种程序吧
第9章 字符串的基本知识
第10章 指针
第11章 字符串和指针
第12章 结构体
第13章 文件处理
+++++++++++++++++++++++++++++++
第5章、数组
5-1 数组
代码清单 5-1
//输入5名学生的分数并显示出他们的总分和平均分
#include <stdio.h>
int main()
{
int stu1,stu2,stu3,stu4,stu5;
int sum=0;
printf("请输入第一名学生分数:"); scanf("%d",&stu1); sum+=stu1;
printf("请输入第二名学生分数:"); scanf("%d",&stu2); sum+=stu2;
printf("请输入第三名学生分数:"); scanf("%d",&stu3); sum+=stu3;
printf("请输入第四名学生分数:"); scanf("%d",&stu4); sum+=stu4;
printf("请输入第五名学生分数:"); scanf("%d",&stu5); sum+=stu5;
printf("这5名学生的总分是%d,平均分是%.2f。\n",sum,(double)sum/5);
return 0;
}
代码清单 5-2
//依次把1、2、3、4、5赋值给数组的每个元素并显示
#include <stdio.h>
int main()
{
int n[5];
n[0]=1;
n[1]=2;
n[2]=3;
n[3]=4;
n[4]=5;
printf("n[0]=%d\n",n[0]);
printf("n[1]=%d\n",n[1]);
printf("n[2]=%d\n",n[2]);
printf("n[3]=%d\n",n[3]);
printf("n[4]=%d\n",n[4]);
return 0;
}
代码清单 5-3
//依次把1、2、3、4、5赋值给数组的每个元素并显示(使用for语句)
#include <stdio.h>
int main()
{
int n[5];
int i;
for (i=0;i<5;i++)
{
n[i]=i+1;
}
for (i=1;i<=5;i++)
{
printf("n[%d]=%d\n",i,n[i-1]);
}
return 0;
}
代码清单 5-4
//将数组的全部元素赋值为0.0并显示
#include <stdio.h>
int main()
{
double real_num[7];
int i=1;
while (i<=7)
{
real_num[i-1]=0.0;
i++;
}
i=1;
do
{
printf("real_num[%d]=%.1f\n",i,real_num[i-1]);
i++;
} while (i<=7);
return 0;
}
练习 5-1
//从头顺次为数组中的元素赋值0、1、2、3、4并显示
#include <stdio.h>
int main()
{
int n[5];
int i;
for(i=0;i<5;i++)
{
n[i]=i;
}
for(i=0;i<5;i++)
{
printf("n[%d]=%d\n",i,n[i]);
}
return 0;
}
练习 5-2
//从头顺次为数组中的元素赋值5、4、3、2、1并显示
#include <stdio.h>
int main()
{
int n[5];
int i;
for(i=5;i>=1;i--)
{
n[5-i]=i;
}
for(i=0;i<5;i++)
{
printf("n[%d]=%d\n",i,n[i]);
}
return 0;
}
代码清单 5-5
//从头开始依次用1、2、3、4、5对数组各元素进行初始化并显示
#include <stdio.h>
int main()
{
int n[5]={1,2,3,4,5};
int i;
for(i=0;i<5;i++)
{
printf("n[%d]=%d\n",i,n[i]);
}
return 0;
}
代码清单 5-6
//把数组中的全部元素复制到另一个数组中
#include <stdio.h>
int main()
{
int a[5]={17,23,36};
int b[5];
int i;
for(i=0;i<5;i++)
{
b[i]=a[i];
}
puts("a b");
puts("-------");
for(i=1;i<=5;i++)
{
printf("%2d %2d\n",a[i-1],b[i-1]);
}
return 0;
}
练习 5-3
//从头开始依次使用5、4、3、2、1进行初始化并显示
#include <stdio.h>
int main()
{
int n[5]={5,4,3,2,1};
int i;
for(i=0;i<5;i++)
{
printf("n[%d]=%d\n",i,n[i]);
}
return 0;
}
练习 5-4
//将数组a中的元素按照倒序复制到数组b中
#include <stdio.h>
int main()
{
int a[5]={17,23,36},b[5];
int i;
for(i=0;i<5;i++)
{
b[4-i]=a[i];
}
puts("a b");
puts("------");
for(i=0;i<5;i++)
{
printf("%-2d %-2d\n",a[i],b[i]);
}
return 0;
}
代码清单 5-7
//输入数组元素的值并显示
#include <stdio.h>
int main()
{
int n[5];
int i;
for(i=0;i<5;i++)
{
printf("n[%d]:",i);
scanf("%d",&n[i]);
}
for(i=0;i<5;i++)
{
printf("n[%d]=%d\n",i,n[i]);
}
return 0;
}
代码清单 5-8
//对数组的全部元素进行倒序排列
#include <stdio.h>
int main()
{
int n[7];
int i;
for(i=0;i<7;i++)
{
printf("n[%d]:",i);
scanf("%d",&n[i]);
}
for(i=0;i<3;i++)
{
int temp=n[i];
n[i]=n[6-i];
n[6-i]=temp;
}
puts("倒序排列了。");
for(i=0;i<7;i++)
{
printf("n[%d]=%d\n",i,n[i]);
}
return 0;
}
代码清单 5-9
//输入5名学生的分数并显示出他们的总分和平均分
#include <stdio.h>
int main()
{
int score[5];
int sum=0;
int i;
puts("请输入5名学生的分数。");
for(i=0;i<5;i++)
{
printf("第%d名学生:",i+1);
scanf("%d",&score[i]);
sum+=score[i];
}
printf("他们的总分是%d,平均分是%.2f。\n",sum,(double)sum/5);
return 0;
}
代码清单 5-10
//输入学生的分数并显示他们的总分和平均分(用宏定义人数)
#include <stdio.h>
#define NUMBER 5
int main()
{
int score[NUMBER];
int sum=0;
int i;
printf("请输入%d名学生的分数。\n",NUMBER);
for(i=0;i<NUMBER;i++)
{
printf("score[%d]:",i);
scanf("%d",&score[i]);
sum+=score[i];
}
printf("他们的总分是%d,平均分是%.2f。\n",sum,(double)sum/NUMBER);
return 0;
}
代码清单 5-11
//输入学生的分数并显示出其中的最高分和最低分
#include <stdio.h>
#define NUMBER 5
int main()
{
int i;
int max,min;
int score[NUMBER];
printf("请输入%d名学生的分数。\n",NUMBER);
for(i=0;i<NUMBER;i++)
{
printf("第%d名学生分数:",i+1);
scanf("%d",&score[i]);
}
max=min=score[0];
for(i=1;i<NUMBER;i++)
{
if(max<score[i])
{
max=score[i];
}
if(min>score[i])
{
min=score[i];
}
}
printf("最高分%d,最低分%d。\n",max,min);
return 0;
}
练习 5-5
//修改代码清单5-8,改为用对象式宏来定义元素个数。
#include <stdio.h>
#define NUMBER 6
int main()
{
int i;
int n[NUMBER];
printf("请输入%d个整数。\n",NUMBER);
for(i=0;i<NUMBER;i++)
{
printf("n[%d]:",i);
scanf("%d",&n[i]);
}
for(i=0;i<NUMBER/2;i++)
{
int temp=n[i];
n[i]=n[NUMBER-i-1];
n[NUMBER-i-1]=temp;
}
puts("倒序了!");
for(i=0;i<NUMBER;i++)
{
printf("n[%d]=%d\n",i,n[i]);
}
return 0;
}
练习 5-6
/*
假设变量a是double型,变量b是int型,请说明经过下述赋值后a和b的值分别是多少
a=b=1.5
*/
#include <stdio.h>
int main()
{
double a;
int b;
a=b=1.5;
printf("a=%f\n",a);
printf("b=%d\n",b);
return 0;
}
a=1.000000
b=1
代码清单 5-12
//输入学生的分数并显示出分布情况
#include <stdio.h>
#define NUMBER 80
int main()
{
int i,j;
int num;
int score[NUMBER];
int scattergram[11]={0};//分布图,须初始化
printf("请输入学生人数:");
do{
scanf("%d",&num);
if(num<1 || num>NUMBER)
{
printf("请输入1~%d之间的整数:",NUMBER);
}
}while(num<1 || num>NUMBER);
printf("请输入%d人的分数。\n",num);
for(i=0;i<num;i++)
{
printf("%d号:",i+1);
do{
scanf("%d",&score[i]);
if(score[i]<0 || score[i]>100)
{
printf("请输入0~100之间的整数:");
}
}while(score[i]<0 || score[i]>100);
scattergram[score[i]/10]++;//分布图数组其中的数据自增
}
puts("---分布图---");
printf(" 100:");
for(i=0;i<scattergram[10];i++)
{
putchar('*');
}
putchar('\n');
for(i=9;i>=0;i--)
{
printf("%2d-%2d:",i*10,i*10+9);
for(j=0;j<scattergram[i];j++)
{
putchar('*');
}
putchar('\n');
}
return 0;
}
练习 5-7
//读取数组中的数据个数和元素值并显示。显示时,各值之间用逗号和空格分割,并用大括号将所有的值括起来。使用对象式宏声明元素个数
#include <stdio.h>
#define NUMBER 100
int main()
{
int i;
int num;
int n[NUMBER];
printf("要输入几个数据:");
do{
scanf("%d",&num);
if(num<1 || num>NUMBER)
{
printf("请输入1~%d之间的整数:",NUMBER);
}
}while(num<1 || num>NUMBER);
for(i=0;i<num;i++)
{
printf("%d号:",i+1);
scanf("%d",&n[i]);
}
putchar('{');
printf("%d",n[0]);
for(i=1;i<num;i++)
{
printf(", %d",n[i]);
}
printf("}\n");
return 0;
}
练习 5-8
//逆向显示代码清单5-12的分布图
#include <stdio.h>
#define NUMBER 80
int main()
{
int i,j;
int num;
int score[NUMBER];
int scattergram[11]={0};
printf("请输入学生人数:");
do{
scanf("%d",&num);
if(num<1 || num>NUMBER)
{
printf("请输入1~%d之间的整数:",NUMBER);
}
}while(num<1 || num>NUMBER);
printf("请输入%d人的分数。\n",num);
for(i=0;i<num;i++)
{
printf("%d号:",i+1);
do{
scanf("%d",&score[i]);
if(score[i]<0 || score[i]>100)
{
printf("请输入0~100之间的整数:");
}
}while(score[i]<0 || score[i]>100);
scattergram[score[i]/10]++;
}
puts("---分布图---");
for(i=0;i<=9;i++)
{
printf("%2d-%2d:",i*9,i*9+9);
for(j=0;j<scattergram[i];j++)
{
putchar('*');
}
putchar('\n');
}
printf(" 100:");
for(i=0;i<scattergram[10];i++);
{
putchar('*');
}
putchar('\n');
return 0;
}
练习 5-9
//纵向显示练习5-8中得到的分布图
#include <stdio.h>
#define NUMBER 80
int main()
{
int i,j;
int num;
int score[NUMBER];
int scattergram[11]={0};
int max;
int max_x;
printf("请输入学生人数:");
do{
scanf("%d",&num);
if(num<1 || num>NUMBER)
{
printf("请输入1~%d之间的整数:",NUMBER);
}
}while(num<1 || num>NUMBER);
printf("请输入%d人的分数。\n",num);
for(i=0;i<num;i++)
{
printf("%d号:",i+1);
do{
scanf("%d",&score[i]);
if(score[i]<0 || score[i]>100)
{
printf("请输入0~100之间的整数:");
}
}while(score[i]<0 || score[i]>100);
scattergram[score[i]/10]++;
}
max=scattergram[0];
for(i=1;i<11;i++)
{
if(scattergram[i]>max)
{
max=scattergram[i];
}
}
max_x=max;
for(i=0;i<max_x;i++)
{
for(j=0;j<11;j++)
{
if(max>scattergram[j])
{
printf(" ");
}
else
{
printf("* ");
}
}
putchar('\n');
max -= 1;
}
printf("--------------------------------------------\n");
for(i=1;i<=11;i++)
{
printf(" %d ",(i-1)*10);
}
putchar('\n');
return 0;
}
5-2 多维数组
代码清单 5-13
//求4名学生在两次考试中3门课程的部分并显示
#include <stdio.h>
int main()
{
int i,j;
int exam1[4][3]={{91,63,78},{67,72,46},{89,34,53},{32,54,34}};
int exam2[4][3]={{97,67,82},{73,43,46},{97,56,21},{85,46,35}};
int sum[4][3];
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
sum[i][j]=exam1[i][j]+exam2[i][j];
}
}
puts("第一次考试分数");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
printf("%4d",exam1[i][j]);
}
putchar('\n');
}
puts("第二次考试分数");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
printf("%4d",exam2[i][j]);
}
putchar('\n');
}
puts("总分");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
printf("%4d",sum[i][j]);
}
putchar('\n');
}
return 0;
}
练习 5-10
//求4行3列矩阵和3行4列矩阵的乘积。各构成元素的值从键盘输入
#include <stdio.h>
int main()
{
int i,j,k;
int matrix1[4][3],matrix2[3][4];
int product[4][4]={0};
puts("输入矩阵1(4行3列)数据。");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
printf("matrix1[%d][%d]:",i,j);
scanf("%d",&matrix1[i][j]);
}
}
puts("输入矩阵2(3行4列)数据。");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("matrix2[%d][%d]:",i,j);
scanf("%d",&matrix2[i][j]);
}
}
//用公式计算矩阵乘积
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<3;k++)
{
product[i][j] += matrix1[i][k]*matrix2[k][j];
}
}
}
puts("显示矩阵1:");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
printf("%6d",matrix1[i][j]);
}
putchar('\n');
}
puts("显示矩阵2:");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%6d",matrix2[i][j]);
}
putchar('\n');
}
puts("显示乘积矩阵:");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
printf("%6d",product[i][j]);
}
putchar('\n');
}
return 0;
}
练习 5-11
//练习5-11,输入6名学生2门课程(语文、数学)的分数,显示各门课程的总分和平均分,以及各个学生的总分和平均分
#include <stdio.h>
int main()
{
int i,j;
int course[6][2];
int sum[2]={0}; //6名学生2门分数累计
int sum1; //每名学生的2门课程分数总分
puts("请输入6名学生的语文和数学课程分数:");
for(i=0;i<6;i++)
{
for(j=0;j<2;j++)
{
do{
printf("%d.%d:",i+1,j+1);
scanf("%d",&course[i][j]);
}while(course[i][j]<0 || course[i][j]>100); //如果分数小于0分或大于100分,重新输入
sum[j] += course[i][j]; //将每门课程分数累计,并存入数组
}
}
/*显示6名学生的分数,统计各门课程总分,计算平均分*/
puts("\n学生\t语文\t数学\t");
for(i=0;i<6;i++)
{
printf(" %d:",i+1);
for(j=0;j<2;j++)
{
printf("\t%d",course[i][j]);
}
putchar('\n');
}
puts("---------------------");
printf("小计:");
printf("\t%d\t%d\n",sum[0],sum[1]);
printf("平均:");
printf("\t%.1f\t%.1f\n",(double)sum[0]/6,(double)sum[1]/6);
/*计算并显示各个学生的2门课程总分和平均分*/
puts("\n学生\t总分\t平均分");
for(i=0;i<6;i++)
{
sum1=course[i][0]+course[i][1];
printf(" %d:\t%d\t%.1f\n",i+1,sum1,(double)sum1/2);
}
return 0;
}
练习 5-12
//练习5-12,改写代码清单5-13,将两次考试的分数存储在三维数组中
#include <stdio.h>
int main()
{
int i,j,k;
int course[2][4][3]={{{91,63,78},{67,72,46},{89,34,53},{32,54,34}},
{{97,67,82},{73,43,46},{97,56,21},{85,46,35}}};
/*打印两次考试的分数*/
for(i=0;i<2;i++)
{
printf("第%d次考试的分数\n",i+1);
for(j=0;j<4;j++)
{
printf("%d:",j+1);
for(k=0;k<3;k++)
{
printf("%4d",course[i][j][k]);
}
putchar('\n');
}
putchar('\n');
}
/*打印每名学生两次考试的分数之和*/
puts("总分");
for(i=0;i<1;i++)
{
for(j=0;j<4;j++)
{
printf("%d:",j+1);
for(k=0;k<3;k++)
{
printf("%4d",course[i][j][k]+course[i+1][j][k]);
}
putchar('\n');
}
}
return 0;
}
总结
summary
//第5章总结
//主要考验一、二维数组的元素之和,和数组元素的显示
#include <stdio.h>
#define size 5
int main()
{
int i,j;
int sum=0;
int a[size];
int b[size]={1,2,3};
int c[2][3]={
{11,22,33},
{44,55,66}
};
for(i=0;i<size;i++)
{
a[i]=b[i];
}
for(i=0;i<size;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
for(i=0;i<size;i++)
{
printf("b[%d]=%d\n",i,b[i]);
}
for(i=0;i<size;i++)
{
sum += a[i];
}
printf("数组a的所有元素之和=%d\n",sum);
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("c[%d][%d]=%d\n",i,j,c[i][j]);
}
}
return 0;
}