从零开始学编程---第一步-C语言(二十四)
我们再把上面的程序分解为函数
分别是
输入函数 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);
}
最新内容
热点内容
- QQ群
-
微信
- 返回首页
- 返回顶部