使用数组的程序设计
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>
void main()
{
int
i,j,flag=0,s1=0,s2=0;
int
a[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}};
for(i=0;i<5;i++)// 判断每行元素之和是否相等
{
int s=0;
for(j=0;j<5;j++)
{
s+=a[i][j];
}
if(s!=65)
{
flag=0;
printf("所求矩阵不是幻方矩阵\n");
break;
}
flag=1;//若每行元素之和都相等,将标志置为1
}
for(j=0;j<5;j++)// 判断每列元素之和是否相等
{
int s=0;
for(i=0;i<5;i++)
{
s+=a[i][j];
}
if(s!=65)
{
flag=0;
printf("所求矩阵不是幻方矩阵\n");
break;
}
flag=1;//若每列元素之和都相等,将标志置为1
}
//判断两条对角线上元素之和是否和每行列元素之和相等
for(i=0;i<5;i++)
{
s1+=a[i++][i++];
}
if(s1!=65)
flag=0;
else
flag=1;
for(i=0;i<5;i++)
{
s2+=a[i][4-i];
}
if(s2!=65)
flag=0;
else
flag=1;
if(flag==1)
{
printf("所求矩阵是幻方矩阵\n");
}
else
{
printf("所求矩阵不是幻方矩阵\n");
}
//输入幻方矩阵
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%-3d",a[i][j]);
}
printf("\n");
}
}
程序运行结果:
所求矩阵是幻方矩阵
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
2、完成以下程序,并进行调试
某班期末考试科目为数学、英语和计算机,有最多不超过30人参加考试,考试后要求:1)计算每个学生的总分和平均分;
2)按总分成绩由高到低排出成绩的名次;
3)打印出名次表,表格内包括学生学号、各科分数、总分和平均分;
4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
程序代码:
#include
<stdio.h>
#include
<stdlib.h>
main()
{
float
score[3][3]={{85.5,78,85},{75.5,65,63},{80,90,83.5}},sum[3]={0.0},aver[3]={0.0},temp;
int num[3]={1,2,3},i,j,t,student_num;
printf("学生成绩(按学号从小到大顺序排列)\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
sum[i]+=score[i][j];
printf("%8.1f",score[i][j]);
}
aver[i]=sum[i]/3.0;
printf("\n");
}
printf("总分和平均分分别为(按学号从小到大顺序排列)\n");
for(i=0;i<3;i++)
{
printf("%3.1f,%3.1f\n",sum[i],aver[i]);
}
//成绩总分降序排序
for(i=0;i<2;i++)
{
for(j=0;j<2-i;j++)
{
if(sum[j]<sum[j+1])//对总分降序排列,在交换总分的同时,交换对应的平均分,学号及各科成绩
{
//交换总分
temp=sum[j];
sum[j]=sum[j+1];
sum[j+1]=temp;
//交换平均分
temp=aver[j];
aver[j]=aver[j+1];
aver[j+1]=temp;
//交换学号
t=num[j];
num[j]=num[j+1];
num[j+1]=t;
//交换各科成绩
for(int m=0;m<3;m++)
{
temp=score[j][m];
score[j][m]=score[j+1][m];
score[j+1][m]=temp;
}
}
}
}
//输出总分排序结果
printf("总分降序排列为\n");
for(i=0;i<3;i++)
{
printf("%3.1f ",sum[i]);
}
printf("\n");
printf("\n");
//打印名称表,表格内包括学生学号、各科分数、总分和平均分
printf("名次表\n");
for(i=0;i<3;i++)
{
printf("成绩排名:%d\n",i+1);
printf("学号:%-5d",num[i]);
printf("各科成绩分别为:");
for(j=0;j<3;j++)
{
printf("%3.1f ",score[i][j]);
}
printf("\n");
printf("总分为:%3.1f\n",sum[i]);
printf("平均分为:%3.1f",aver[i]);
printf("\n");
}
//顺序查找学生信息
printf("请输入要查找的学生的学号:");
scanf("%d",&student_num);
printf("您查找的学号为:%d\n",student_num);
for(i=0;i<3;i++)
{
if(student_num==num[i])
{
printf("学号:%d
成绩排名:%d
各科分数分别为:%3.1f,%3.1f,%3.1f\n",num[i],i+1,score[i][0],score[i][1],score[i][2]);
exit(0);
}
}
printf("您输入的学号不存在!\n");
}
运行结果:
学生成绩(按学号从小到大顺序排列)
85.5
78.0
85.0
75.5
65.0
63.0
80.0
90.0
83.5
总分和平均分分别为(按学号从小到大顺序排列)
248.5,82.8
203.5,67.8
253.5,84.5
总分降序排列为
253.5 248.5 203.5
名次表
成绩排名:1
学号:3
各科成绩分别为:80.0 90.0
83.5
总分为:253.5
平均分为:84.5
成绩排名:2
学号:1
各科成绩分别为:85.5 78.0
85.0
总分为:248.5
平均分为:82.8
成绩排名:3
学号:2
各科成绩分别为:75.5 65.0
63.0
总分为:203.5
平均分为:67.8
请输入要查找的学生的学号:3
您查找的学号为:3
学号:3
成绩排名:1 各科分数分别为:80.0,90.0,83.5
3.编写一个程序,利用字符数组实现两个字符串的比较。(注意不能使用字符串比较函数strcmp())
程序代码:
#include<stdio.h>
int
str_compare(char[],char[]);//函数声明语句
main()
{
char str1[80],str2[80];
printf("请输入两个字符串:\n");
gets(str1);
gets(str2);
printf("您输入的字符串分别是:\n");
puts(str1);
puts(str2);
if((str_compare(str1,str2))>0)
printf("%s大于%s\n",str1,str2);
else if((str_compare(str1,str2))==0)
printf("%s等于%s\n",str1,str2);
else
printf("%s小于%s\n",str1,str2);
}
int str_compare(char str1[],char
str2[])
{
int i=0,j=0,result=0;//置result起始值为0
while(str1[i]||str2[j])//当两个字符有一个不为空时,循环继续
{
if(str1[i]>str2[j])
{
result=1;
break;
}
else if(str1[i]<str2[j])
{
result=-1;
break;
}
else
{
i++;
j++;
continue;
}
}
return result;
}
程序运行结果:
1.
请输入两个字符串:
abcdefg
abcdefg
您输入的字符串分别是:
abcdefg
abcdefg
abcdefg等于abcdefg
2.
请输入两个字符串:
a324uio324nsdmdfs
dfasds
as3lk dkfsjl
您输入的字符串分别是:
a324uio324nsdmdfs
dfasds
as3lk dkfsjl
a324uio324nsdmdfs
dfasds小于as3lk dkfsjl
3.
请输入两个字符串:
abc
abcde
您输入的字符串分别是:
abc
abcde
abc小于abcde
三、问题讨论
1、使用%s格式符输入字符串到数组时能否将空格符输入?如果不能该如何使用其它方法解决?举例说明。
不能。
使用gets(数组名)实现带有空格的字符串的输入。
#include<stdio.h>
main()
{
char str1[80],str2[80];
printf("请输入两个字符串:\n");
scanf("%s",str1);//
gets(str2);
printf("您输入的两个字符串分别为:\n");
printf("%s\n",str1);
puts(str2);
}
程序运行结果:
请输入两个字符串:
Good Morning! Everbody.
您输入的两个字符串分别为:
Good
Morning!
Everbody.
输入Good后输入了空格,用%s格式输入函数,遇到空格字符数组str1结束字符串的输入,空格被下一个字符数组str2接收。
若将scanf("%s",str1)语句改为gets(str2),则程序运行结果如下:
请输入两个字符串:
Good Morning! Everbody.
Thank you.
您输入的两个字符串分别为:
Good Morning! Everbody.
Thank you.
加载中,请稍候......