加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

使用数组的程序设计

(2012-05-27 11:32:33)
标签:

杂谈

使用数组的程序设计

 

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.


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有