C语言程序设计实验报告
实验4 使用数组的程序设计
一、实验目的
(1)掌握一维数组和二维数组的定义、赋值和输入输出方法。
(2)掌握字符数组的使用。
(3)掌握与数组有关的算法。
二、实验内容及步骤
1、检验并打印幻方矩阵
在下面的5*5阶幻方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将这些幻方矩阵中的元素读到一个二维整型数组中,然后检验其是否为幻方矩阵,并将其按如下格式显示到屏幕上。
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
程序代码:
#include<stdio.h>
main()
{
int a[5][5],i,j,sr,sc,st1=0,p=0,st2=0;
printf("请输入一个方阵:\n");
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<5;i++)
{st1=st1+a[i][i];//主对角线的和
st2=st2+a[i][4-i];}//次对角线的和
if(st1==st2)
p++;
for(i=0,sr=0;i<5;i++)
{for(j=0,sc=0;j<5;j++)
{sr=sr+a[i][j];//行的和
if(sr!=st1)break;
sc=sc+a[j][i];//列的和
if(sc!=st1)break;}
}
if(p==1&&i==5)
{printf("这是一个幻方矩阵\n");
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
printf("%d\t",a[i][j]);
printf("\n");
}}
else
printf("这不是一个幻方矩阵\n");
}
运行结果
2、完成以下程序,并进行调试
某班期末考试科目为数学、英语和计算机,有最多不超过30人参加考试,考试后要求:1)计算每个学生的总分和平均分;
2)按总分成绩由高到低排出成绩的名次;
3)打印出名次表,表格内包括学生学号、各科分数、总分和平均分;
4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
【提示】:用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。
程序代码:
#include<stdio.h>
main()
{
double score[5][3],sum[5],aver[5];
int i,j,num[5],t;
printf("请输入每位同学的学号和各科成绩,用Tab键隔开:\n");
printf("学号\t数学\t英语\t计算机\n");
for(i=0;i<5;i++)
{
scanf("%d",&num[i]);
for(j=0;j<3;j++)
scanf("%lf",&score[i][j]);
}
for(i=0;i<5;i++)
{ sum[i]=0;
for(j=0;j<3;j++)
{sum[i]=sum[i]+score[i][j];}
aver[i]=sum[i]/3.0;
}
for(i=0;i<5;i++)
{if (sum[i]<sum[i+1])
{t=sum[i];sum[i]=sum[i+1];sum[i+1]=t;
t=num[i];num[i]=num[i+1];num[i+1]=t;
t=aver[i];aver[i]=aver[i+1];aver[i+1]=t;
for(j=0;j<3;j++)
{t=score[i][j];score[i][j]=score[i+1][j];score[i+1][j]=t;} }
}
printf("名次\t学号\t数学\t英语\t计算机\t总分\t平均分\n");
for(i=0;i<5;i++)
{printf("%d\t%d\t",i+1,num[i]);
for(j=0;j<3;j++)
printf("%.1lf\t",score[i][j]);
printf("%.1lf\t",sum[i]);
printf("%.1lf\n",aver[i]);
}
printf("请输入要查找的同学的学号:");
scanf("%d",&t);
printf("名次\t学号\t数学\t英语\t计算机\t总分\t平均分\n");
for(i=0;i<5;i++)
{
if(t==num[i])
{
printf("%d\t%d\t",i+1,t);
for(j=0;j<3;j++)
printf("%.1lf\t",score[i][j]);
printf("%.1lf\t%.1lf\n",sum[i],aver[i]);
}
}
}
运行结果:
3.编写一个程序,利用字符数组实现两个字符串的比较。
(注意不能使用字符串比较函数strcmp())
程序代码:
#include<stdio.h>
#include<string.h>
main()
{ int i;
char str1[30],str2[30];
gets(str1);
gets(str2);
strlen(str1);
strlen(str2);
for(i=0;str1[i]!='\0'||str1[i]!='\0';i++)
{if(str1[i]!=str2[i])break;
}
if(i!=strlen(str1)&&i!=strlen(str2))
{if(str1[i]>str2[i])
printf("%s大\n",str1);
else
printf("%s大\n",str2);
if(i==strlen(str1))
printf("%s大\n",str2);
if(i==strlen(str2))
printf("%s大\n",str1);}
if(i==strlen(str1)&&i==strlen(str2))
printf("两个字符串相等!\n");
}
运行结果:
三、问题讨论
1、使用%s格式符输入字符串到数组时能否将空格符输入?如果不能该如何使用其它方法解
决?举例说明。
不能。
%s遇见空格就会按结束处理。
应当用puts函数。
例如:
char a[10];
puts(a);
2、数组在“定义”时和“引用”时所带的下标有何区别?
定义的时候是为了指明所定义的数组有几个元素。
例如:int a[5]代表数组a里面包含5个整型的数。
引用的时候下标代表的某个元素。
例如:b[2]指的是b数组的第三个元素。
四、实验心得
1.数组的定义和引用是不同的。
定义时候可以整体赋值。
例如:a[2]={1,2}。
出了定义范围就不可以这样使用。
因为在定义范围之外,a[2]代表的是一个元素。
而不是一个包含有两个元素的数组。
2.定义二维数组的时候,如果在定义时对每个元素都赋值,这个时候数组的第一个下标也就是行下标是可以省略的。
但是列下标不能省略。
3.数组在作为函数形参的时候,可以不用写下标,对于二维数组可以不用写行下标。
因为形参只能接受实参传过来的值。
实参传过来什么它就接受什么。
只需要在定义实参的时候注意就行了。