动态内存分配
学生结构体写题思路
1.定义宏
2.划分功能模块
3.main()调用实现
4.函数实现
注意:若较简单可 先写函数
n个学生信息(学号 姓名 成绩) 要求按照成绩高低输出 (动态内存分配)
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct
{
long no;
char name[10];
float score;
}STU;
int main()
{
STU* stu; //结构体指针
stu = (STU*)malloc(sizeof(STU) * N);
if (stu == NULL) //判断内存分配是否成功
{
printf("分配空间失败");
return 1;
}
int i, j, k;
for (i = 0; i < N; i++)
{
scanf("%ld%s%f", &stu[i].no, stu[i].name, &stu[i].score);
}
//降序
for (i = 0; i < N - 1; i++)
{
k = i;
for (j = i + 1; j < N; j++)
{
if (stu[k].score < stu[j].score)k = j;
}
if (k != i) { STU t = stu[k]; stu[k] = stu[i]; stu[i] = t; } //交换结构体变量
}
//输出
for (i = 0; i < N; i++)
printf("%ld %s %f\n", stu[i].no, stu[i].name, stu[i].score);
free(stu); //空间释放
return 0;
}
n学生信息,学号 、姓名、2门成绩。要求输出平均成绩最高学生信息(包含 学号 姓名 2门成绩和平均成绩)
1.平均成绩:输入每个学生2门成绩是 累加取平均
2.最高学生信息 —— 用结构体变量接收 返回结构体变量
——
3.最大平均分 :用 变量记录下标
1.结构体
2.学号 姓名 成绩 --- 平均成绩
/*
*
* 1.结构体
* 2.输入 学号 姓名 3门成绩 ----计算平均成绩
* 3.输入 最高平均成绩信息 ----返回结构体 传结构体变量 指针
* 4.最高成绩 用下标法记录
*
*/
#include<stdio.h>
#define N 3
typedef struct s
{
long num;
char name[10];
double score[2];
double avg;
}STU;
void input(STU s[])
{
double avg = 0.0;
for (int i = 0; i < N; i++)
{
scanf("%ld%s", &s[i].num, s[i].name);
scanf("%lf%lf", &s[i].score[0], &s[i].score[1]);
s[i].avg = (s[i].score[0] + s[i].score[1]) / 2.0;
}
}
void max(STU s[], STU* t)
{
int j=0; //记录最大平均分下标
for (int i = 1; i < N; i++)
{
if (s[j].avg < s[i].avg)
j = i;
}
*t = s[j]; //指针传回最大
}
int main()
{
STU s[N]; //定义结构体数组
input(s);
STU m; //接收最大信息对应变量
max(s, &m);
printf("%ld %s %lf %lf %lf\n", m.num, m.name, m.score[0], m.score[1], m.avg);
return 0;
}
n学生信息,学号 、姓名、3门成绩,平均成绩 输出6号学生信息
技巧:
如何容易 求3门平均成绩
#define N 3
typedef struct
{
char stu_num[6];
char name[8];
double score[3];
double avr;
}STU;
void input_avg(STU s[])
{
for (int i = 0; i < N; i++)
{
scanf("%s%s", s[i].stu_num,s[i].name);
double sum = 0.0;
for (int k = 0; k < 3; k++)
{
scanf("%lf", &s[i].score[k]);
sum += s[i].score[k];
}
//平均成绩
s[i].avr = sum / 3.0;
}
}
int main()
{
STU s[N];
input_avg(s);
//6号成绩
printf("%s %s %lf %lf %lf\n", s[1].stu_num, s[2].
name, s[2].score[0], s[2].score[1], s[2].score[2], s[2].avr);
return 0;
}
/*
* 1.图书 N 50 结构体
* 2.函数 输入 并排序
* 3.查询 有输出作者 无 输出无
*
*/
#include<stdio.h>
#include<string.h>
#define N 2
typedef struct
{
char name[10];
char author[10];
int price;
}Book;
void input_sort(Book b[]);
void select(Book b[]);
int main()
{
Book b[N];
//输入并排序
input_sort(b);
//查询
//Book* t;
select(b);
return 0;
}
void input_sort(Book b[])
{
int i, j, k;
for (int i = 0; i < N; i++)
{
printf("%d 书名 作者 价格\n", i + 1);
scanf("%s%s%d", b[i].name, b[i].author, &b[i].price);
}
//排序
for (i = 0; i < N - 1; i++)
{
k = i;
for (j = i + 1; j < N; j++)
{
if (b[k].price < b[j].price)
k = j;
}
if (k != i)
{
Book t = b[i]; b[i] = b[k]; b[k] = t;
}
}
}
void select(Book b[])
{
printf("请输入要查询书名:\n");
char tname[10];
/*gets(tname); 运行不出*/
scanf("%s", tname);
int flag = -1; //记录是否找到
for (int i = 0; i < N; i++)
{
/*&b[i].name错误 字符串首地址*/
if (strcmp(tname, b[i].name) == 0)
{
flag = i;
break;
}
}
if (flag == -1)
{
printf("无此书\n");
}
else
printf("作者:%s\n", b[flag].author);
}
函数学生问题
#include<stdio.h>
#define S 3
#define C 2
void input_Avg(double s[][C], double savg[])
{
double t;
for (int i = 0; i < S; i++)
{
t = 0.0;
for (int j = 0; j < C; j++)
{
scanf("%lf", &s[i][j]);
t += s[i][j];
}
savg[i] = t / C;
}
}
void corse_Avg(double s[][C], double cavg[])
{
double avg; //每门课程均分
for (int i = 0; i < C; i++)
{
avg = 0.0;
for (int j = 0; j < S; j++)
avg += s[i][j];
cavg[i] = avg / S;
}
}
void max(double s[][C])
{
double max = 0,k=0;
int i, j;
for (i = 0; i < S; i++)
{
for (j = 0; j < C; j++)
{
if (max < s[i][j])
{
max = s[i][j]; //记录高课程分数
k = i; //记录最高学生
}
}
}
printf("最高学生%d,分数%lf\n", k + 1, max);
}
int main()
{
double st[S][C];
double avg1[S]; //每个学生平均分
double avg2[C]; //每门均分
input_Avg(st, avg1);
corse_Avg(st, avg2);
printf("//每个学生均分");
for (int i = 0; i < S; i++)
printf("%lf ", avg1[i]);
printf("\n");
printf("//每门课程均分");
for (int i = 0; i < C; i++)
printf("%lf ", avg2[i]);
printf("\n");
max(st); //最高分
}
1.input sort并输出
2.low <60 学生姓名显示出来
3.总avg 输出低于均分记录 返回人数
include<stdio.h>
#define N 3
typedef struct
{
long num;
char name[10];
double score;
}STU;
void input(STU s[]);
void sort(STU s[]);
void low(STU s[]);
int low_avg(STU s[]);
int main()
{
STU s[N];
input(s);
sort(s);
low(s);
int t = low_avg(s);;
printf("低于均分人数:%d\n", t);
return 0;
}
void input(STU s[])
{
int i;
for (i = 0; i < N; i++)
scanf("%ld%d%lf", &s[i].num, s[i].name, &s[i].score);
}
void sort(STU s[])
{
int i, j, k;
for (i = 0; i < N - 1; i++)
{
k = i;
for (j = i + 1; j < N; j++)
{
if (s[k].score < s[j].score)
k = j;
}
if (k != j)
{
STU t = s[k];
s[k] = s[i];
s[i] = t;
}
}
//输出
for (i = 0; i < N; i++)
printf("%ld %s %lf\n", s[i].num, s[i].name, s[i].score);
}
void low(STU s[])
{
for (int i = 0; i < N; i++)
if (s[i].score < 60)
printf("%s\n", s[i].name);
}
int low_avg(STU s[])
{
int count = 0;
double avg = 0.0;
//统计均分
for (int i = 0; i < N; i++)
avg += s[i].score;
printf("//低于均分记录");
for (int i = 0; i < N; i++)
{
if (s[i].score < avg)
{
count++;
printf("%ld %s %lf", s[i].num, s[i].name, s[i].score);
}
}
return count;
}