mxwawaawxm 发表于 2019-8-26 23:00

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

代码相似就在外面用函数封装啊

mxwawaawxm 发表于 2019-8-27 20:30

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类型,输出相似,就想着能否简单点访问结构体的成员

Xer0 发表于 2019-8-28 08:32

”用户自主决定输出”实现这一条 用户的输入是什么?
比如靠名字 +height\wieght\score关键字来输入某学生的height\wieght\score
那么写个函数以这两项为输入 检索的数据作为输出

感觉这个实现类似C++的类

我没看出来你目前的结构体,用户想输出某个成员的name怎么办到

mxwawaawxm 发表于 2019-8-28 09:53

本帖最后由 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类型,代码很类似。能否简化

Xer0 发表于 2019-8-28 10:58

也就是说 你想实现一个通用的排序函数那么把weight、score这些关键字也作为参数传入这个排序函数进行比较就行了
或者再细一点有一个通用的比较大小函数 你的排序函数其他部分都是相同的 只有if中判断大小不同
比如
bool compare(key,i,j) {...}
然后你在排序里if(compare(key,i,j)) swap(i,j)

mxwawaawxm 发表于 2019-8-28 19:50

Xer0 发表于 2019-8-28 10:58
也就是说 你想实现一个通用的排序函数那么把weight、score这些关键字也作为参数传入这个排序函数进行比较 ...

是的,想着有没有简化成通用的排序函数,然后把用户输入的weight、score这些关键字作为参数传入
可是不知道C语言要怎么写

Xer0 发表于 2019-8-29 08:17

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
}

mxwawaawxm 发表于 2019-8-29 21:46

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;
}

cube 发表于 2019-8-30 11:58

抛开结构体不谈,抛开数组不谈.
如何根据用户输入来选择输出.这里判断是必不可少的.想要少,只能写更多代码来封装一下,让当前的代码少一点.
但你的要求已经是细粒度了,没有必要细分,所以,意义何在.
页: [1] 2
查看完整版本: C语言结构体成员