C语言结构体成员
请问下,如果C语言定义一个结构体数组typedef struct {
char *name;
int height;
double weight;
int score;
} Stu;
Stu stu = {
{"tom", 172, 60.5, 85, },
{"mike", 189, 72.5, 65, },
{"takao", 163, 54.5, 38, },
{"sato", 175, 58.5, 98, },
{"sanaka", 174, 60.5, 56, },
};
假设想要实现下面的基础功能,由用户决定单独输出每个数组成员的结构体里的name或height或weight或score
我能想到的是定义枚举
enum choices {n, h, w, s};
提示用户输入对应数字,再利用switch case语句输出对应的结构体成员,这中间会否过于冗杂
如果采用switch case的写法,我发现当输出height或score时,代码很相似,因为类型都是int,这里能否给矛简化{:301_1007:}
代码相似就在外面用函数封装啊 jin991130 发表于 2019-8-26 23:32
代码相似就在外面用函数封装啊
就是不懂怎么写
假设
typedef struct { char *name; int height; double weight; int score;} Stu;然后定义结构体Stu stu = {"tom", 172, 60.5, 85, };如何做到,由用户自主决定输出某个成员name\height\wieght\score如果用switch case语句写,会否太冗杂了其中的height\score,都是int类型,输出相似,就想着能否简单点访问结构体的成员
”用户自主决定输出”实现这一条 用户的输入是什么?
比如靠名字 +height\wieght\score关键字来输入某学生的height\wieght\score
那么写个函数以这两项为输入 检索的数据作为输出
感觉这个实现类似C++的类
我没看出来你目前的结构体,用户想输出某个成员的name怎么办到 本帖最后由 mxwawaawxm 于 2019-8-28 09:54 编辑
Xer0 发表于 2019-8-28 08:32
”用户自主决定输出”实现这一条 用户的输入是什么?
比如靠名字 +height\wieght\score关键字来输入某学 ...
#include <stdio.h>
#include <string.h>
#define NAME_LEN 128
#define NUM 5
typedef struct {
char name;
int height;
int weight;
int score;
} Stu;
void sort_name_point(Stu *point);
void sort_height_point(Stu *stu);
void swap_stu(Stu *stui, Stu *stuj);
enum choices input_choice(void);
void printf_stu(Stu *stu);
enum choices {name=1, height};
int main(int argc, char *argv[])
{
Stu stu;
int i=0;
for (;i<NUM;i++) {
printf("请输入第%d位同学的名字、身高、体重、分数等信息:", i+1);
scanf("%s %d %d %d", stu.name, &stu.height, &stu.weight, &stu.score);
}
printf_stu(stu);
enum choices choice=input_choice();
switch (choice) {
case name:
sort_name_point(stu);
printf("按名字升序排序\n");
printf_stu(stu);
break;
case height:
sort_height_point(stu);
printf("按名字升序排序\n");
printf_stu(stu);
break;
}
return 0;
}
enum choices input_choice(void)
{
int temp;
do {
printf("请输入排序的依据1--name;2--height:");
scanf("%d", &temp);
} while (temp<name || temp>height);
return (enum choices)temp;
}
void sort_name_point(Stu *stu)
{
int i=0,j;
for (;i<NUM-1;i++) {
for (j=i+1;j<NUM;j++) {
if (strcmp(((stu+i))->name, (stu+j)->name)>0) {
swap_stu((stu+i), stu+j);
// Stu temp=*((stu+i));
// *((stu+i))=*(stu+j);
// *(stu+j)=temp;
}
}
}
}
void sort_height_point(Stu *stu)
{
int i=0,j;
for (;i<NUM-1;i++) {
for (j=i+1;j<NUM;j++) {
if (((stu+i))->height>(stu+j)->height) {
swap_stu((stu+i), stu+j);
// Stu temp=*((stu+i));
// *((stu+i))=*(stu+j);
// *(stu+j)=temp;
}
}
}
}
void swap_stu(Stu *stui, Stu *stuj)
{
Stu temp=*stui;
*stui=*stuj;
*stuj=temp;
}
void printf_stu(Stu *stu)
{
int i=0;
for (i=0;i<NUM;i++) {
printf("%-8s %6d %6d %7ld\n", (stu+i)->name, (stu+i)->height, (stu+i)->weight, (stu+i)->score);
}
}
这是目前写的全部代码
就是由用户输入,构成一个结构体数组,里面每个元素都是一个结构体,包含名字、身高、体重、分数等成员
这里的代码。是想让用户输入以什么为排序依据,或者名字或者身高
enum choices choice=input_choice();
switch (choice) {
case name:
sort_name_point(stu);
printf("按名字升序排序\n");
printf_stu(stu);
break;
case height:
sort_height_point(stu);
printf("按名字升序排序\n");
printf_stu(stu);
break;
}
但是我想到 如果让用户选择排序的依据包括体重、分数
那么是不是又要定义几个函数sort_weight_point、sort_score_point,然后在switch case语句里再用case weight、case socre分别判断,感觉有些冗杂
因为身高、体重、分数都是int类型,代码很类似。能否简化
也就是说 你想实现一个通用的排序函数那么把weight、score这些关键字也作为参数传入这个排序函数进行比较就行了
或者再细一点有一个通用的比较大小函数 你的排序函数其他部分都是相同的 只有if中判断大小不同
比如
bool compare(key,i,j) {...}
然后你在排序里if(compare(key,i,j)) swap(i,j)
Xer0 发表于 2019-8-28 10:58
也就是说 你想实现一个通用的排序函数那么把weight、score这些关键字也作为参数传入这个排序函数进行比较 ...
是的,想着有没有简化成通用的排序函数,然后把用户输入的weight、score这些关键字作为参数传入
可是不知道C语言要怎么写 Stu *stu为全局变量
bool compare(key,i,j)
{
if (key==“weight”)return (stu+i)->weight>(stu+j)->weight
if (key==“score”)return (stu+i)->score>(stu+j)->score
if (key==“height”)return (stu+i)->height>(stu+j)->height
return strcmp(((stu+i))->name, (stu+j)->name)>0
} Xer0 发表于 2019-8-29 08:17
Stu *stu为全局变量
bool compare(key,i,j)
谢谢。再写了一个
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define NAME_LEN 128
#define NUM 5
typedef struct {
char name;
int height;
int weight;
int score;
} Stu;
enum choices {name=1, height, weight, score};
void scanf_stu(Stu *stu);
enum choices input_choice(void);
void printf_stu(Stu *stu);
void sort_general(enum choices choice, Stu *stu);
bool compare(enum choices choice,Stu *stu, int i, int j);
void swap_stu(Stu *stui, Stu *stuj);
int main(int argc, char *argv[])
{
Stu stu;
// 要求用户输入结构体数组
scanf_stu(stu);
printf_stu(stu);
// 要求用户输入排序的依据
enum choices choice=input_choice();
// 通用排序函数
sort_general(choice, stu);
switch (choice) {
case name:
printf("按名字升序排序\n");
printf_stu(stu);
break;
case height:
printf("按身高升序排序\n");
printf_stu(stu);
break;
case weight:
printf("按体重升序排序\n");
printf_stu(stu);
break;
case score:
printf("按分数升序排序\n");
printf_stu(stu);
break;
}
return 0;
}
/*要求用户输入结构体数组*/
void scanf_stu(Stu *stu)
{
int i=0;
for (;i<NUM;i++) {
printf("请输入第%d位同学的名字、身高、体重、分数等信息:", i+1);
scanf("%s %d %d %d", &((stu+i)->name), &((stu+i)->height), &((stu+i)->weight), &((stu+i)->score));
}
}
/*要求用户输入排序的依据*/
enum choices input_choice(void)
{
int temp;
do {
printf("请输入排序的依据\n1--name;2--height;3--weight;4--score:");
scanf("%d", &temp);
} while (temp<name || temp>score);
return (enum choices)temp;
}
/*打印结构体数组*/
void printf_stu(Stu *stu)
{
int i=0;
for (i=0;i<NUM;i++) {
printf("%-8s %6d %6d %7ld\n", (stu+i)->name, (stu+i)->height, (stu+i)->weight, (stu+i)->score);
}
}
/*通用排序函数,冒泡排序*/
void sort_general(enum choices choice, Stu *stu)
{
int i=0,j;
for (;i<NUM-1;i++) {
for (j=i+1;j<NUM;j++) {
// 返回数组相邻两个结构体的比较结果
if (compare(choice, stu, i, j)) {
// 交换对应的结构体
swap_stu((stu+i), stu+j);
}
}
}
}
/*返回数组相邻两个结构体的比较结果*/
bool compare(enum choices choice,Stu *stu, int i, int j)
{
int result;
switch(choice) {
case name:
result = strcmp(((stu+i))->name, (stu+j)->name)>0;
break;
case height:
result = (stu+i)->height > (stu+j)->height;
break;
case weight:
result = (stu+i)->weight > (stu+j)->weight;
break;
case score:
result = (stu+i)->score > (stu+j)->score;
break;
}
return result;
}
/*升序排列时,当元素的结构体小于前面,交换对应的结构体*/
void swap_stu(Stu *stui, Stu *stuj)
{
Stu temp=*stui;
*stui=*stuj;
*stuj=temp;
} 抛开结构体不谈,抛开数组不谈.
如何根据用户输入来选择输出.这里判断是必不可少的.想要少,只能写更多代码来封装一下,让当前的代码少一点.
但你的要求已经是细粒度了,没有必要细分,所以,意义何在.
页:
[1]
2