案例引入
Description
有N个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入N个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)
Input Format
学生数量N占一行每个学生的学号、姓名、三科成绩占一行,空格分开。
Output Format
各门课的平均成绩 最高分的学生的数据(包括学号、姓名、3门课成绩)
输入数据 1
2
1 blue 90 80 70
b clan 80 70 60
输出数据 1
85 75 65
1 blue 90 80 70
#include <stdio.h>
//思路1、结构体数组+字符串数组
struct data{
char stu[100];//字符串数组是为了存字符串
char name[100];
int a;
int b;
int c;
};
int main()
{
int n;
scanf("%d",&n);
struct data p[n]; //结构体数组是为了存n个学生
int i;
for( i=0 ; i<n ; i++ )
{
scanf("%s %s %d %d %d", &p[i].stu ,&p[i].name,&p[i].a,&p[i].b,&p[i].c);
}
int sum1 =0 ;
int sum2 = 0;
int sum3 =0 ;
for( i=0 ; i<n ; i++ )
{
sum1 += p[i].a;
sum2 += p[i].b;
sum3 += p[i].c;
}
printf("%.f %.f %.f\n" ,(double) sum1/n ,(double) sum2/n,(double) sum3/n);
int j;
int max[3]={0} ;
for (i=0 ; i<n ; i++ )
{
if( max[0] < p[i].a ){
max[0] = p[i].a;
}
if( max[1] < p[i].b ){
max[1]= p[i].b;
}
if( max[2]< p[i].c ){
max[2]= p[i].c;
}
}
int numberx=0;
for( i =0 ;i<3; i++)
{
if( numberx <max[i])
{
numberx= max[i];
}
}
for( i=0 ;i<n ; i++)
{
if( numberx == p[i].a ){
printf("%s %s %d %d %d\n", p[i].stu ,p[i].name,p[i].a,p[i].b,p[i].c);
}
if( numberx == p[i].b ){
printf("%s %s %d %d %d\n", p[i].stu ,p[i].name,p[i].a,p[i].b,p[i].c);
}
if( numberx == p[i].c ){
printf("%s %s %d %d %d\n", p[i].stu ,p[i].name,p[i].a,p[i].b,p[i].c);
}
}
return 0;
}
1、int 输入
#include <stdio.h>
struct data {
int year;
int month ;
int day;
};
int main()
{
struct data today[5];
for(int i=0 ; i<5 ;i++)
{
scanf("%d%d%d",&today[i].year,&today[i].month,&today[i].day );
}
for(int i=0 ; i<5 ;i++ )
{
printf("%d-%d-%d\n",today[i].year,today[i].month,today[i].day );
}
}
2、字符输入
#include <stdio.h>
struct data {
char year;
char month ;
char day;
};
int main()
{
struct data today[2];
for(int i=0 ; i<2 ;i++)
{
scanf("%c%c%c",&today[i].year,&today[i].month,&today[i].day ); //还读空格和转行符注意
}
for(int i=0 ; i<2 ;i++ )
{
printf("%c-%c-%c\n",today[i].year,today[i].month,today[i].day );
}
}
abccdf
a-b-c
c-d-f
3、字符串输入
#include <stdio.h>
struct data {
char year[100];
char month[100] ;
char day[100];
};
int main()
{
struct data today[2];
for(int i=0 ; i<2 ;i++)
{
scanf("%s %s %s",&today[i].year,&today[i].month,&today[i].day );
}
for(int i=0 ; i<2 ;i++ )
{
printf("%s-%s-%s\n",today[i].year,today[i].month,today[i].day );
}
}
asa jio ji
oko oon os
asa-jio-ji
oko-oon-os
4、结构体,二维数组区别
#include <stdio.h>
#include <string.h>
int main(){
// char a[2][6] = { "hello", "world" } ; //能存n个最大长度为m-1 的字符串
char a[2][6]; //m-1是因为\0占一个是字符
for(int i=0 ;i<2; i++)
{
for( int j=0 ;j<6;j++ )
{
scanf("%c", &a[i][j]);
}
}
for(int i=0 ;i<2; i++)
{
for( int j=0 ;j<6;j++ )
{
printf("%c",a[i][j]);
}
}
return 0;
}
hello world
hello world
实质就是,数组的数组,结构体数组+字符串数组,
同二维数组,float = a[5] [12]; 表示,主数组有5个元素a[5][12],每个元素是内含12个元素的数组 a[5][12]
不过,不同的是,
1、二维数组存的,两个数组全是一个类型,
int a[2] [3];就只能存数字,
char a[2] [5] ;就只能存字符,指的是,存字符的数组
2、结构体数组+字符数组
其实和二维数组实质一样,只是,输入会变简单,并且重要的是,重要的是,重要的事情说三遍:
1、二维数组输入时一定要知道,要输入副字符数组的大小,即要知道输入字符串的大小,这个就很难了,
用sizeof都不行,因为输入时,后面会自动补位,从而导致错误,
二维数组存进去的是 字符 char[] = { 'h', 'e', 'l', 'l', 'o' };
2、反之亦然,结构体数组,输入输出变简单,不用遍历字符数组,字符串大小也不用知道
结构体数组存进去的是 字符串 char = "hello";