吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1824|回复: 10
收起左侧

[求助] C语言结构体成员

  [复制链接]
mxwawaawxm 发表于 2019-8-26 23:00
请问下,如果C语言定义一个结构体数组
[C] 纯文本查看 复制代码
typedef struct {
    char *name;
    int height;
    double weight;
    int score;
} Stu;
Stu stu[NUM] = {
    {"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
我能想到的是定义枚举
[C] 纯文本查看 复制代码
enum choices {n, h, w, s};

提示用户输入对应数字,再利用switch case语句输出对应的结构体成员,这中间会否过于冗杂
如果采用switch case的写法,我发现当输出height或score时,代码很相似,因为类型都是int,这里能否给矛简化

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
↑帝↑ + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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关键字来输入某学 ...

[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>

#define NAME_LEN 128
#define NUM 5
typedef struct {
    char name[NAME_LEN];
    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[NUM];
    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);
    }
    
    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);
    }    
}


这是目前写的全部代码
就是由用户输入,构成一个结构体数组,里面每个元素都是一个结构体,包含名字、身高、体重、分数等成员
这里的代码。是想让用户输入以什么为排序依据,或者名字或者身高
[C] 纯文本查看 复制代码
    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)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
mxwawaawxm + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| 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
}

免费评分

参与人数 2吾爱币 +4 热心值 +2 收起 理由
liphily + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
mxwawaawxm + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| mxwawaawxm 发表于 2019-8-29 21:46
Xer0 发表于 2019-8-29 08:17
Stu *stu为全局变量

bool compare(key,i,j)

谢谢。再写了一个
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define NAME_LEN 128
#define NUM 5
typedef struct {
    char name[NAME_LEN];
    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[NUM];
    // 要求用户输入结构体数组
    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吾爱币 +1 热心值 +1 收起 理由
liphily + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

cube 发表于 2019-8-30 11:58
抛开结构体不谈,抛开数组不谈.
如何根据用户输入来选择输出.这里判断是必不可少的.想要少,只能写更多代码来封装一下,让当前的代码少一点.
但你的要求已经是细粒度了,没有必要细分,所以,意义何在.
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 02:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表