C培训作业
20170726
1、结构体,学生信息,按成绩排序。
/* 定义4个学生,完成按成绩升序排序 */
//头文件
#include"stdio.h"
#include"string.h"
//定义结构体类型
typedef struct student{
int id;
char name[10];
float score;
}Stu;//取别名 Stu== struct student,可以用来定义别的变量
//函数原型声明
void input_stu(Stu*,int);
void sort_stu(Stu*,int);
void output_stu(Stu*,int);
/*
@主函数
*/
int main(void)
{
//定义出 结构体类型的数组
Stu stus[4];//定义出 结构体数组
//初始化结构体数组
memset(stus,0,sizeof(Stu)*4); //void *memset(void *s,int c,size_t n)
//总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
//这里的stus 是数组的首地址,所以不用 取地址符&
//这里的sizeof()不能放stus,因为这个是结构体的首地址,相当于指针(4)
input_stu(stus,4);
printf("***排序前***\n");
output_stu(stus,4);
printf("***排序后***\n");
sort_stu(stus,4);
output_stu(stus,4);
return 0;
}
/*
@子函数:输入学生信息
*/
void input_stu(Stu *p,int len)
{
int i=0;
printf("按以下格式输入(学号 姓名 成绩):\n");
for(i=0;i<len;i++)
{
printf("请输入第%d个学生:",i+1);
scanf("%d%s%f",&(p+i)->id,(p+i)->name,&(p+i)->score);
}
}
/*
@子函数: 升序排列
*/
void sort_stu(Stu *p,int len)
{
int i=0,j=0; //用于循环计数
for(i=0;i<len-1;i++)
{
for(j=0;j<len-1-i;j++)
{
if((p+j)->score > (p+j+1)->score)
{
Stu temp=*(p+j);
*(p+j) =*(p+j+1);
*(p+j+1)=temp;
}
}
}
}
/*
@子函数:输出数据
*/
void output_stu(Stu *p,int len)
{
int i=0;
for(i=0;i<len;i++)
{
printf("No:%d 姓名:%s 成绩:%.2f\n",(p+i)->id,(p+i)->name,(p+i)->score);
}
}
运行结果:
[root@localhost Kshine]# gcc test28.c -o test -Wall
[root@localhost Kshine]# ./test
按以下格式输入(学号 姓名 成绩):
请输入第1个学生:201 jiny 99.9
请输入第2个学生:202 liuxf 98.8
请输入第3个学生:203 zhuyw 90.1
请输入第4个学生:223 Kshine 20.3
***排序前***
No:201 姓名:jiny 成绩:99.90
No:202 姓名:liuxf 成绩:98.80
No:203 姓名:zhuyw 成绩:90.10
No:223 姓名:Kshine 成绩:20.30
***排序后***
No:223 姓名:Kshine 成绩:20.30
No:203 姓名:zhuyw 成绩:90.10
No:202 姓名:liuxf 成绩:98.80
No:201 姓名:jiny 成绩:99.90
2、结构体,求4个学生中成绩最高者的学号、姓名和成绩
/* 求4个学生中成绩最高者的学号、姓名和成绩。*/
//头文件
#include"stdio.h"
#include"string.h"
//定义结构体类型
typedef struct student{
int id;
char name[10];
float score;
}Stu;//取别名 Stu== struct student,可以用来定义别的变量
//函数原型声明
void input_stu(Stu*,int);
void find_max_score(Stu*,int);
/*
@主函数
*/
int main(void)
{
//定义出 结构体类型的数组
Stu stus[4];//定义出 结构体数组
//初始化结构体数组
memset(stus,0,sizeof(Stu)*4); //void *memset(void *s,int c,size_t n)
//总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
//这里的stus 是数组的首地址,所以不用 取地址符&
//这里的sizeof()不能放stus,因为这个是结构体的首地址,相当于指针(4)
input_stu(stus,4);
find_max_score(stus,4);
return 0;
}
/*
@子函数:输入学生信息
*/
void input_stu(Stu *p,int len)
{
int i=0;
printf("按以下格式输入(学号 姓名 成绩):\n");
for(i=0;i<len;i++)
{
printf("请输入第%d个学生:",i+1);
scanf("%d%s%f",&(p+i)->id,(p+i)->name,&(p+i)->score);
}
}
/*
@子函数:在结构体数组中,查询成绩最大的数组成员,并输出该学生的信息
*/
void find_max_score(Stu *p,int len)
{
int i=0; //用于循环计数
Stu stu_max=*p;//先默认第一个人的成绩最高;
for(i=1;i<len;i++)
{
if(stu_max.score<(p+i)->score)
{
stu_max=*(p+i);//p[i]
}
}
//输出最大的学生信息
printf("成绩最优秀的学生是:\n");
printf("学号:%d\n",stu_max.id);
printf("姓名:%s\n",stu_max.name);
printf("成绩:%.2f\n",stu_max.score);
}
运行结果:
[root@localhost Kshine]# gcc test28_1.c -o test -Wall
[root@localhost Kshine]# ./test
按以下格式输入(学号 姓名 成绩):
请输入第1个学生:203 zyw 93.1
请输入第2个学生:213 lx 83.2
请输入第3个学生:220 Kshine 79.3
请输入第4个学生:123 zyj 92.7
成绩最优秀的学生是:
学号:203
姓名:zyw
成绩:93.10
3、实现填充并打印结构体信息
/*实现填充并打印结构体信息*/
//头文件
#include"stdio.h"
#include"string.h"
//结构体定义
typedef struct student{
int id;
char name[20];
char gender;
int age;
}Stu;
//函数原型声明
void insert_stu(Stu*);
void output_stu(Stu*);
/*
@主函数
*/
int main(void)
{
Stu stu1;
memset(&stu1,0,sizeof(Stu));//或者sizeof(stu1)
insert_stu(&stu1); //输入
output_stu(&stu1); //输出
return 0;
}
/*
@子函数:输入
*/
void insert_stu(Stu *p)
{
printf("请输入学号:");
scanf("%d",&p->id);
printf("请输入姓名:");
scanf("%s",p->name);
getchar();
printf("请输入性别:");
scanf("%c",&p->gender);
printf("请输入年龄:");
scanf("%d",&p->age);
}
/*
@子函数:输出
*/
void output_stu(Stu *p)
{
printf("您输入的信息是:");
printf("姓名:%s 学号:%d 性别:%c 年龄:%d\n",p->name,p->id,p->gender,p->age);
}
运行结果:
[root@localhost Kshine]# gcc test29.c -o test -Wall
[root@localhost Kshine]# ./test
请输入学号:533223
请输入姓名:Kshine
请输入性别:m
请输入年龄:18
您输入的信息是:姓名:Kshine 学号:533223 性别:m 年龄:18