明解C语言入门篇_第5章_数组

前言

本文为业余学习《明解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;
}
  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值