从零开始学编程---第一步-C语言(二十四)

时间:2014-03-09 00:31    点击:

我们再把上面的程序分解为函数
分别是
输入函数 shuru()
自身排序函数 paixu1()
头字母排序函数 paixu2()
输出函数 shuchu()

回顾一下函数的知识,要做起来还是很简单的
程序如下:
#include <stdio.h>
#include <string.h>
main()
{
       char a[20],b[20],c[20],d[20],e[20];
       char *p[5]={a,b,c,d,e};

       void shuru(char *[]);
       void paixu1(char *[]);
       void paixu2(char *[]);
       void shuchu(char *[]);


       shuru(p);
       paixu1(p);
       paixu2(p);
       shuchu(p);

    
}

void shuru(char *a[5])
{
     puts("请输入5个字符串");  
     for(int i=0;i<5;i++)
       {
           printf("第%d个:",i+1);
           gets(a[i]);
       }
}

void   paixu1(char *a[5])
{
    int x,y,i;
    char t;
     for(i=0;i<5;i++)
           for(x=0;x<strlen(a[i])-1;x++)
               for(y=x+1;y<strlen(a[i]);y++)
               {
                   if(*(a[i]+x)>*(a[i]+y))
                   {
                       t=*(a[i]+x);
                       *(a[i]+x)=*(a[i]+y);
                       *(a[i]+y)=t;

                   }
               }
}

void paixu2(char *a[5])
{
   int on,k=0;
   char *t;
    
     for(int i=0;i<4;i++)
           for(int j=i+1;j<5;j++)
           {
               on=0;   
              while(*a[i]==*a[j])
               {
                   on=1;   
                   a[i]++,a[j]++,k++;   
                   if(*a[i]!=*a[j]) 
                   break;
               }
            
               if(*a[i]>*a[j])     
               {
                   t=a[i];
                   a[i]=a[j];
                   a[j]=t;
               }

               while(on)    
               {
                   a[i]--,a[j]--,k--;   
                   if(k==0)  
                   break;
               }
            

           }
}

void shuchu(char *a[5])
{
      puts("字符串排序之后的结果为:");
      for(int i=0;i<5;i++)
           puts(a[i]);
}


现在继续吧,我们要学到字符串指针了,不过在此之前,我觉得我们有必要认识一下多维数组,主要学的就是二维数组,之前我们用的数组都是一维数组,那么,二维数组是个什么概念?

在数学里,
零维是点,一维是线,二维是平面,三维是立体

我们之前用的一维数组是一条直线的数据,是个向量,我想这应该很好理解
那么二维数组,就是一个平面的数据,平面的数据就会有行有列,就跟一个表格一样
也就是说,二维数组存储的是类似表格的数据
比如说,我们要存储这样一个表格数据
姓名 语文 数学 外语
张     99   98   97
李     60   75   55

这组数据是2行3列(姓名不算一列)
定义二维数组是
int a[2][3]   2是代表2行,3是表示每行3个数据
注意,这个数组不能存储姓名,得另外定义char类型的数组,我们存储的只是那6个整型数据

int a[2][3] 的下标变量是
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
这6个下标变量分别存储的就是如下数据
99 98 97 
60 75 55

仔细看这个二维数组的下标变量,有2行数据
分别是a[0]行,a[1]行
在C语言中,二维数组是按行排列的
也就是先存放a[0]行,再存放a[1]行,每行中的3个元素也是依次存放

一个二维数组可以看做若干个一维数组,例如a[2][3]可以看成2个长度为3的一维数组
这2个一维数组的名称分别为a[0],a[1]

总之,二维数组你要这么理解 a[行][列] 
a[2][3] 这就是2行3列的数组,有多少个元素呢,行乘以列,2*3 就是总共有6个元素
这个数组每一行都有名称的,分别就是a[0]和a[1]
行都是由 数组名[0]起点开始   列也是下标[0]开始,列的名称就是行名加上列的下标
如 a[0][0] 就是第一行第一个数据 a[0][1] 就是第一行第2个数据

int a[2][3] 它的6个元素如下
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]

你完全可以看成2个普通数组,每一行就是一个数组
第一个数组名为a[0]
这个一维数组就是a[0][3]   是不是和a[3]一样呢 只不过这里数组名不再是a而是a[0]了
而它的下标a[0][0],是不是也跟a[0]一样呢 ,a[0]和a只不过是不同的数组名罢了,这里你一定要明白

现在我们初始化二维数组,也就是给二维数组直接赋值
首先是分段赋值
int a[2][3]={{99,98,97},{60,75,55}};
大括号里面再加大括号,每一行就是一个大括号,因为每行就相当于一个一维数组

也可连续赋值
int a[2][3]={99,98,97,60,75,55};
这里看似像是一维数组赋值,但它存储的时候是按3个一组来存储的


当然,二维数组也可以像一维数组一样不全部赋值
int a[2][3]={{1},{1}};
这是给每行第一个元素赋值1,其他未赋值的元素自动赋0
所以它是这样存储的
1,0,0
1,0,0

但是如果这样
int a[2][3]={1,1};
它就是这样存储的
1,1,0
0,0,0

和一维数组一样,如果全部元素都赋值,第一维的长度可以省略
int a[2][3]={99,98,97,60,75,55};
可以省略为
int a[][3]={99,98,97,60,75,55};

为什么只能省略第一维的长度,因为每一行就是一个一维数组,这就跟一维数组全部赋值可省略一样的

其实,int a[][3]={99,98,97,60,75,55};
就算省略也知道有多少行,总共6个数据,每行3个,那就是有2行,这个C语言能分析出来的
同样int a[]={1,2,3} ,能分析出长度为3

怎么打印一个二维数组的数据?
用一个循环嵌套就可以了
程序如下
#include <stdio.h>
main()
{
     int a[2][3]={99,98,97,60,75,55};

     for(int i=0;i<2;i++)
     {    
         for(int j=0;j<3;j++)
         printf("%d ",a[i][j]);

         putchar('\n');
     }

}   

每打印一行就用putchar换行
不难吧?

下面我们写一个二维数组的输入输出程序

#include <stdio.h>
main()
{
     int a[3][3],i,j;

     puts("请输入9个数字,每行3个");
     for(i=0;i<3;i++)
     {
         printf("第%d行:",i+1);
         for(j=0;j<3;j++)
         {
             scanf("%d",&a[i][j]);
         }
     }

     for(i=0;i<3;i++)
     {    
         for(j=0;j<3;j++)
         printf("%d ",a[i][j]);

         putchar('\n');
     }

}  

输入1-9,打印
1 2 3
4 5 6
7 8 9

假如,我让它让列输出
1 4 7
2 5 6
3 6 9
该怎么做?

很简单,只需要把
for(i=0;i<3;i++)
     {    
         for(j=0;j<3;j++)
         printf("%d ",a[i][j]);

         putchar('\n');
     }

中的printf("%d ",a[i][j]);改成printf("%d ",a[j][i]);就可以了

下面我们把a[3][3]这个二维数组每一行中的3个数比较大小,把最大的数存储到数组b[3]中
程序如下:
#include <stdio.h>
main()
{
    int i,j,a[3][3],b[3],max;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
        {   printf("请输入第%d行第%d个数:",i+1,j+1);
           scanf("%d",&a[i][j]);
        }

    
     for(i=0;i<3;i++)
     {     max=a[i][0];
         for(j=1;j<3;j++)
         {
             if(max<a[i][j])
             {
                 max=a[i][j];
             }
        

         }
         b[i]=max;
     }

     puts("每行的最大数分别为:");
     for(i=0;i<3;i++)
         printf("%d ",b[i]);

   
}



其中
for(i=0;i<3;i++)
     {     max=a[i][0];
         for(j=1;j<3;j++)
         {
             if(max<a[i][j])
             {
                 max=a[i][j];
             }
        

         }
         b[i]=max;
     }

每行的第一个元素赋值给max,然后每行数字比较大小,最大数存储到b[i]里

熟悉了二维数组我们就可以把多个字符串存储到一个二维数组里了
试想一下,如果一个班级要存储50个学生的姓名,那我不得定义50个字符串数组来存储?
有了二维数组,我们就可以把50个名字存储到二维数组里
例如: char name[50][20]
50代表50行,表示50个学生,20表示每行长度为20的字符空间(名字长度为20够了)
这里看成50个长度为20的一维数组就好了
看,这是不是方便很多

下面我们来做个最简单的学生成绩程序,就显示5个学生的成绩
科目为score1,score2,score3,总共3门的成绩
然后求各自的平均分,在求总平均分

我们需要定义两个二维数组
一个二维数组 char name[5][20],存放5个学生的名字
一个二维数组 int score[5][3],存放5个学生的3门成绩
如果只有一门成绩,则就是定义一维数组了

整个程序如下:
#include <stdio.h>
main()
{
    char name[5][20];   //学生名字
    int age[5];   //年龄
    int score[5][3]; //分数
    int s=0,all=0;         //各自总分,全部总分
    int avg[5];       //每个学生的平均分
    int allavg;    //总平均分
    int i,j;


    for(i=0;i<5;i++)
    {
        printf("请输入第%d个学生的名字:",i+1);
        gets(name[i]);

    }

    for(i=0;i<5;i++)
    {
         printf("请输入第%d个学生的年龄:",i+1);
         scanf("%d",&age[i]);
    }
    for(i=0;i<5;i++)
    {
        s=0;
        for(j=0;j<3;j++)
        {
         printf("请输入第%d个学生的score%d:",i+1,j+1);
         scanf("%d",&score[i][j]);
         s=s+score[i][j];
        }
        avg[i]=s/3;
        all=all+s;
       
    }
    allavg=all/5;



    //打印
   printf("姓名\t年龄\tscore1\tscore2\tscore3\t平均分\t\n");
   for(i=0;i<5;i++)
   {
       printf("%s\t",name[i]);
       printf("%d\t",age[i]);
       for(j=0;j<3;j++)
           printf("%d\t",score[i][j]);

       printf("%d\t",avg[i]);

       printf("\n");

   }
   printf("总分为%d,总平均分为%d \n",all,allavg);
}

程序可以简化如下:
#include <stdio.h>
main()
{
    char name[5][20];   //学生名字
    int age[5];   //年龄
    int score[5][3]; //分数
    int s=0,all=0;         //各自总分,全部总分
    int avg[5];       //每个学生的平均分
    int allavg;    //总平均分
    int i,j;


    for(i=0;i<5;i++)
    {
        printf("请输入第%d个学生的名字:",i+1);
        gets(name[i]);
        printf("请输入第%d个学生的年龄:",i+1);
        scanf("%d",&age[i]);
        s=0;
        for(j=0;j<3;j++)
        {
         printf("请输入第%d个学生的score%d:",i+1,j+1);
         scanf("%d",&score[i][j]);
         s=s+score[i][j];
        }
        getchar();     //注意这里要吸收回车,防止gets接收
        avg[i]=s/3;
        all=all+s;

    }
    allavg=all/5;



    //打印
   printf("姓名\t年龄\tscore1\tscore2\tscore3\t平均分\t\n");
   for(i=0;i<5;i++)
   {
       printf("%s\t",name[i]);
       printf("%d\t",age[i]);
       for(j=0;j<3;j++)
           printf("%d\t",score[i][j]);

       printf("%d\t",avg[i]);

       printf("\n");

   }
   printf("总分为%d,总平均分为%d \n",all,allavg);

  

   

   
}



来源:幻想编程//所属分类:站长原创/更新时间:2014-03-09 00:31
顶一下
(7)
100%
踩一下
(0)
0%
上一篇:从零开始学编程---第一步-C语言(二十三)
下一篇:从零开始学编程---第一步-C语言(二十五)
相关内容