鱼C论坛

 找回密码
 立即注册
查看: 1981|回复: 29

[已解决]快点进来吧 hxd们 急!! 结构体

[复制链接]
发表于 2020-12-17 11:16:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 癞蛤蟆丶ccc 于 2020-12-17 22:29 编辑
#include <stdio.h>
#define N 30
struct Worker
{
    char id[10];
    char name[21];
    char sex;
    int workAge;
    double wage;
};
void input(struct Worker a[], int n) //对结构体进行赋值
{
    for (int i = 0; i < n; i++)
    {
        scanf("%s", a[i].id);
        scanf("%s", a[i].name);
        scanf("%c", &a[i].sex);
        scanf("%d", &a[i].workAge);
        scanf("%lf", &a[i].wage);
    }
}
int main()
{
    struct Worker work[N];
    int n;
    scanf("%d", &n);
    input(work, n);
    return 0;
}
我就想知道 我n输入4的时候 应该对结构体输入4组数 但是我输入两组数就程序结束了
快来吧 大佬们 想不通
输入样例:
4
1001
ZhanOne
M
10
1234.5
1002
ZhanTwo
m
20
4532.16
1003
MaoOne
F
15
3232.32
1004
MaoTwo
f
25
5678.45
最佳答案
2020-12-17 23:07:25
scanf是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式会接收回车字符,在输入第一个scanf时输入字符后按 回车结束,输入缓冲中保存了这个回车符,遇到第二个scanf时,它自动把这个回车符赋给了ch2。而如果第二个scanf的输入格式不是%c时,由于格 式不匹配,这个回车符会被自动忽略,所以只有在连续输入两个%c的格式时才会出现这样的问题!

   解决办法:(二办法任选其一)

   1。清空输入缓冲区

   第一个scanf后加入语句:fflush(stdin); //C语言清空输入缓冲区函数

   2。格式控制中加入空格

   将第二个scanf改为:scanf(" %c",&ch2);//在%号前面加一个空格

scanf格式输入时要求输入格式与格式控制符中的完全一样(如:scanf("abcd%c",&ch);输入时必须输入abcde,ch得到的值为e)空格可以抵消前面输入的回车符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-17 12:33:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-17 13:50:59 | 显示全部楼层
6666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 19:43:39 | 显示全部楼层
来人呐 救命啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 21:23:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-17 22:05:20 | 显示全部楼层
我擦,这么神奇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 22:11:06 | 显示全部楼层

是吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 22:19:24 | 显示全部楼层
能给一下题目要求吗?或者说输入样例有吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 22:27:35 | 显示全部楼层
本帖最后由 癞蛤蟆丶ccc 于 2020-12-17 22:29 编辑
_Charlotte_ 发表于 2020-12-17 22:19
能给一下题目要求吗?或者说输入样例有吗?


4
1001
ZhanOne
M
10
1234.5
1002
ZhanTwo
m
20
4532.16
1003
MaoOne
F
15
3232.32
1004
MaoTwo
f
25
5678.45
这是输入样例
整个代码100多行 我怕你们不想看 我把有问题的地方挑出来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 22:33:05 | 显示全部楼层
完整的题目
(1) 设计并定义职工信息结构体struct Worker类型,每个职工的数据包括工号id(不超过8个字符,char[]型)、姓名name(不超过20个字符,char[]型)、性别sex('M'或'm'表示男性,'F'或'f'表示女性,char型)、工龄workAge(int型)、工资wage(double型)。
(2) 设计实现函数void input(struct Worker a[],int n),其功能是输入n名职工的数据并存储在a数组中,每名职工的数据的输入格式为:第1行输入工号;第2行输入姓名;第3行输入性别、工龄和工资,数据间以空格为间隔。
(3) 设计实现函数void output(struct Worker a[],int n),其功能是输出a数组中存储的n名职工的数据,每名职工的数组占一行,输出格式为:
ID=<工号>,Name=<姓名>,Sex=<性别>,WorkAge=<工龄>,wage=<工资>
其中工资保留2位小数,四舍五入。
(4) 设计实现函数double wageSummary(struct Worker a[],int n),其功能是汇总输出a数组中存储的n名职工的总薪金。
(5) 设计实现函数double averWorkAge(struct Worker a[],int n),其功能是计算a数组中存储的n名职工的平均工龄。
(6) 设计实现函数double averWage(struct Worker a[],int n),其功能是计算a数组中存储的n名职工的平均薪金。
(7) 设计实现函数int maleCount(struct Worker a[],int n),其功能是统计a数组存储的n名职工中男性职工的数量。
(8) 设计实现函数int femaleCount(struct Worker a[],int n),其功能是统计a数组存储的n名职工中女性职工的数量。
(9) 设计实现函数int searchID(struct Worker a[],char id[],int n),其功能是在a数组中查找工号等于id的职工的下标,若找不到则返回-1。
(10) 设计实现函数int searchName(struct Worker a[],char name[],int n),其功能是在a数组中查找姓名等于name的职工的下标,若找不到则返回-1。
(11) 设计实现函数void sortWorkAge(struct Worker a[],int n),其功能是将a数组存储的n名职工按照工龄从小到大的顺序重新存储。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define N 30

/* 请在这里填写答案 */

int main(void){
    struct Worker work[N];
    int n,t;
    char ch,id[10],name[20];
    scanf("%d",&n);
    input(work,n);
    printf("WageSummary=%.2lf,averWage=%.2lf\n",wageSummary(work,n),averWage(work,n));
    printf("averWorkAge=%.1lf\n",averWorkAge(work,n));
    printf("maleCount=%d,femaleCount=%d\n",maleCount(work,n),femaleCount(work,n));
    while((ch = getchar()) != '\n' && ch != EOF);
    gets(id);
    if((t=searchID(work,id,n))>=0)
        printf("ID=%s,Name=%s,Sex=%c,WorkAge=%d,wage=%.2f\n",work[t].id,work[t].name,work[t].sex,work[t].workAge,work[t].wage);
    else printf("ID=%s not found\n",id);
    gets(name);
    if((t=searchName(work,name,n))>=0)
        printf("ID=%s,Name=%s,Sex=%c,WorkAge=%d,wage=%.2f\n",work[t].id,work[t].name,work[t].sex,work[t].workAge,work[t].wage);
    else printf("Name=%s not found\n",name);
    sortWorkAge(work,n);
    output(work,n);
    return 0;
}
我完整的错误代码
#include <stdio.h>
#include <string.h>
#define N 30
struct Worker
{
    char id[10];
    char name[21];
    char sex;
    int workAge;
    double wage;
};
void input(struct Worker a[],int n)
{
    for(int i=0;i<n;i++)
    {
        scanf("%s",a[i].id);
        scanf("%s",a[i].name);
        scanf("%c",&a[i].sex);
        scanf("%d",&a[i].workAge);
        scanf("%lf",&a[i].wage);
    }
}
void output(struct Worker a[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("ID=%s,Name=%s,Sex=%c,WorkAge=%d,wage=%.2lf",a[i].id,a[i].name,a[i].sex,a[i].workAge,a[i].wage);
    }
}
double wageSummary(struct Worker a[],int n)
{
    double sum=0;
    for(int i=0;i<n;i++)
    {
        sum+=a[i].wage;
    }
    return sum;
}
double averWorkAge(struct Worker a[],int n)
{
    int sum=0;
    for(int i=0;i<n;i++)
    {
        sum+= a[i].workAge;
    }
    return sum/n;
}
double averWage(struct Worker a[],int n)
{
    double sum=0;
    for(int i=0;i<n;i++)
    {
        sum+=a[i].wage;
    }
    return sum/n;
}
int maleCount(struct Worker a[],int n)
{
    int count=0;
    for(int i=0;i<n;i++)
    {
        if(a[i].sex=='M'|| a[i].sex=='m')
            count++;
    }
    return count;
}
int femaleCount(struct Worker a[],int n)
{
    int count=0;
    for(int i=0;i<n;i++)
    {
        if(a[i].sex=='F'||a[i].sex=='f')
            count++;
    }
    return count;
}
int searchID(struct Worker a[],char id[],int n)
{
    int flag=0;
    for(int i=0;i<n;i++)
    {
        if( a[i].id==id)
        {
            flag=i;
            break;
        }
    }
    if(flag==0)
        return -1;
    else
        return flag;
}
int searchName(struct Worker a[],char name[],int n)
{
    int flag=0;
    for(int i=0;i<n;i++)
    {
        if(a[i].name==name)
        {
            flag=i;
            break;
        }
    }
    if(flag==0)
        return -1;
    else
        return flag;
}
void sortWorkAge(struct Worker a[],int n)
{

    a[n+1]=a[0];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n-i;j++)
        {
            if(a[j].workAge>a[j+1].workAge)
            {
                a[n+1]=a[j];
                a[j]=a[j+1];
                a[j+1]=a[n+1];
            }

        }
    }
}

int main(void){
    struct Worker work[N];
    int n,t;
    char ch,id[10],name[20];
    scanf("%d",&n);
    input(work,n);
    printf("WageSummary=%.2lf,averWage=%.2lf\n",wageSummary(work,n),averWage(work,n));
    printf("averWorkAge=%.1lf\n",averWorkAge(work,n));
    printf("maleCount=%d,femaleCount=%d\n",maleCount(work,n),femaleCount(work,n));
    while((ch = getchar()) != '\n' && ch != EOF);
    gets(id);
    if((t=searchID(work,id,n))>=0)
        printf("ID=%s,Name=%s,Sex=%c,WorkAge=%d,wage=%.2f\n",work[t].id,work[t].name,work[t].sex,work[t].workAge,work[t].wage);
    else printf("ID=%s not found\n",id);
    gets(name);
    if((t=searchName(work,name,n))>=0)
        printf("ID=%s,Name=%s,Sex=%c,WorkAge=%d,wage=%.2f\n",work[t].id,work[t].name,work[t].sex,work[t].workAge,work[t].wage);
    else printf("Name=%s not found\n",name);
    sortWorkAge(work,n);
    output(work,n);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 22:44:52 | 显示全部楼层
本帖最后由 _Charlotte_ 于 2020-12-17 22:49 编辑

QQ图片20201217224831.png QQ图片20201217224641.png 输入环节错掉了,当你执行scanf("%s", a[i].name);时,你会产生一个换行符\n被接下来的scanf("%c", &a[i].sex);读取,也就是说,当你输入表示性别的词(比如b(表示男孩)或者g(表示女孩))的时候,你实际上是给scanf("%d", &a.workAge);输入了,之后的也错掉了,所以会异常结束;
解决办法:在这两句之间加一个getchar();用来吃掉这个换行符,如图所示
[/i][/i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 22:50:31 | 显示全部楼层
#include <stdio.h>
#define N 30
struct Worker
{
    char id[10];
    char name[21];
    char sex;
    int workAge;
    double wage;
};

int main()
{
    struct Worker work[N];
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%s %s %c %d %lf", work[i].id,work[i].name,&work[i].sex,&work[i].workAge,&work[i].wage);
        fflush(stdin); 
    }
    return 0;
}
改成这样也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 22:54:07 | 显示全部楼层
图片貌似看不了,但我说的应该很清楚了,还有什么问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 22:55:20 | 显示全部楼层
_Charlotte_ 发表于 2020-12-17 22:54
图片貌似看不了,但我说的应该很清楚了,还有什么问题吗?

为啥会产生一个\n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 22:58:20 | 显示全部楼层

按我的理解,你输入完内容后不是要按一次回车么,那个就是\n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 22:58:59 | 显示全部楼层
_Charlotte_ 发表于 2020-12-17 22:54
图片貌似看不了,但我说的应该很清楚了,还有什么问题吗?

第一个输入id的时候不产生吗  第一次见这种错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 23:00:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 23:00:41 | 显示全部楼层
癞蛤蟆丶ccc 发表于 2020-12-17 22:58
第一个输入id的时候不产生吗  第一次见这种错误

你问我我问谁,我就知道错误在这,还有,你有没有其他结构体的题目,我现在也学到C的结构体了,有没有练习题做啊,我找不到题目啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 23:01:46 | 显示全部楼层
癞蛤蟆丶ccc 发表于 2020-12-17 22:58
第一个输入id的时候不产生吗  第一次见这种错误

总之%c用的时候你要注意前面是不是有\n就对了,有就用getchar()吃掉他,就OK了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 23:06:08 | 显示全部楼层
_Charlotte_ 发表于 2020-12-17 23:00
你问我我问谁,我就知道错误在这,还有,你有没有其他结构体的题目,我现在也学到C的结构体了 ...

2.6 实验12 结构与链表、贪心法求解0/1背包问题
2.6.1 实验目的
掌握结构类型、结构指针与链表的相关操作。
2.6.2 实验任务与要求
1、给定n种物品,基于结构体与结构数组,利用贪心法解决0/1背包问题。
贪心策略:优先选择单位重量价值最大的物品装入背包;
定义每件物品的结构:
struct GOOD
{
    int No;      ///物品编号
float weight;  //物品重量
    foat value;   //物品价值
    float pw;    //物品单位重量的价值; pw=value/weight;
}
//提示:
函数原型:void greedy(struct GOOD goods[], int n); // goods[]为n种物品的结构数组;
将n种物品的结构数组goods[]按照物品结构中的pw进行降序排列;
从数组goods[]的第一个元素开始,顺序尝试将数组元素对应的物品装入背包,并依次输出装入背包的物品的相关信息;
当尝试到将某个元素对应的物品装入背包后,背包中物品的总重量大于背包容量,则装包方案即为该元素之前的数组元素对应的所有物品;
最后输出装入背包中物品的总重量与总价值;
测试用例:
背包容量C=150,7种物品,其重量W=(10,40,30,50,35,40,30),价值V=(35,30,6,50,40,10,25)  (W与V均为浮点数)
贪心法得到的解:装入物品1,5,4,7,背包重量125,最大价值150;
比较:利用枚举法得到的最优解:装入物品1,2,4,5,背包重量135,最大价值155;

2、链表的基本操作
定义结构体:
struct data {
   int n;   
   struct data *next;
}

函数实现:
(1)给定一组无序整数,按给定数据的顺序建立一个单向链表;返回链表的头指针;
(2)将链表中的结点按数据进行排序,构成一个按数据升序排列的有序单向链表;返回有序链表的头指针。
(3)链表的遍历:按升序输出链表中的所有数据;
函数原型:void output(data *head); //从头指针head开始依次输出链表中的所有数据;
(4)编写链表结点的插入函数。
函数原型:data* insert(data *head, int N); //在以head为头指针的升序排列的链表中,将整数N插入到链表的合适位置,使插入后的链表仍为升序排列;返回链表的头指针;
(5)实现链表结点的删除函数:在链表中删除一个结点;
函数原型:data* remove(data *head, int N); //在以head为头指针的升序排列的链表中,删除整数N对应的结点,返回链表的头指针;
3、(Bonus,选做)利用链表实现多项式的加减运算。
定义结构体:
struct item {
   int a;
int n;   
   struct data *next;
}
每个结果体表示一个多项式的一项,成员a表示该项的系数,成员n表示该项的幂次。
将一个多项式利用链表表示,然后定义两个多项式,实现多项式的加减运算,结果也采用链表表示。
3.1 实验14 学生成绩管理系统
3.1.1 实验目的
实现一个学生成绩管理系统,以训练学生对C语言的结构类型定义、结构变量的声明方法,文件的打开、读写、关闭等操作,以及C语言综合知识的使用能力。
3.1.2 实验任务与要求
利用C语言的结构类型与文件操作,实现一个学生成绩管理系统。
要求:
(1)每个学生的记录包括:学号、姓名、数学成绩、英语成绩、计算导论与程序设计成绩;
(2)功能:菜单提示:成绩录入、修改、添加、删除、查询统计、退出等功能。
如按学号、姓名、各科成绩查询(包括成绩段查询),按分数段统计人数等
(3)每个同学记录可以用结构struct类型实现,录入修改后保存到文件中,以后从文件中读取学生信息并进行相应的操作。

提示:
1、关于菜单
可以使用多级菜单,即程序开始执行,系统进入主菜单供用户选择,用户根据菜单选择一个功能后,可根据需要进入下一级菜单。
选择一个操作后,应该回到本级菜单供用户选择,用户选择返回上级菜单后可返回上级菜单
只有主菜单中可以根据用户的选择退出程序;
2、关于对学生结构的写入与读取
对于学生的信息以结构为单位写入到文件,读取时也是以结构为单位。
输入学生信息时,可以将每个学生的信息存储到一个结构中,然后使用fwrite()将学生的结构写入文件中。
读取文件中的学生信息时,使用fread()将学生的结构从文件中读出,然后访问结构成员变量对学生信息进行解析。
给,之前的学校作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-6 20:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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