鱼C论坛

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

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

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

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

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

x
本帖最后由 癞蛤蟆丶ccc 于 2020-12-17 22:29 编辑
  1. #include <stdio.h>
  2. #define N 30
  3. struct Worker
  4. {
  5.     char id[10];
  6.     char name[21];
  7.     char sex;
  8.     int workAge;
  9.     double wage;
  10. };
  11. void input(struct Worker a[], int n) //对结构体进行赋值
  12. {
  13.     for (int i = 0; i < n; i++)
  14.     {
  15.         scanf("%s", a[i].id);
  16.         scanf("%s", a[i].name);
  17.         scanf("%c", &a[i].sex);
  18.         scanf("%d", &a[i].workAge);
  19.         scanf("%lf", &a[i].wage);
  20.     }
  21. }
  22. int main()
  23. {
  24.     struct Worker work[N];
  25.     int n;
  26.     scanf("%d", &n);
  27.     input(work, n);
  28.     return 0;
  29. }
复制代码

我就想知道 我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)空格可以抵消前面输入的回车符。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-17 12:33:16 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-17 13:50:59 | 显示全部楼层
6666666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 19:43:39 | 显示全部楼层
来人呐 救命啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 21:23:34 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-17 22:05:20 | 显示全部楼层
我擦,这么神奇
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 22:19:24 | 显示全部楼层
能给一下题目要求吗?或者说输入样例有吗?
小甲鱼最新课程 -> https://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多行 我怕你们不想看 我把有问题的地方挑出来了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

裁判测试程序样例:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 30

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

  5. int main(void){
  6.     struct Worker work[N];
  7.     int n,t;
  8.     char ch,id[10],name[20];
  9.     scanf("%d",&n);
  10.     input(work,n);
  11.     printf("WageSummary=%.2lf,averWage=%.2lf\n",wageSummary(work,n),averWage(work,n));
  12.     printf("averWorkAge=%.1lf\n",averWorkAge(work,n));
  13.     printf("maleCount=%d,femaleCount=%d\n",maleCount(work,n),femaleCount(work,n));
  14.     while((ch = getchar()) != '\n' && ch != EOF);
  15.     gets(id);
  16.     if((t=searchID(work,id,n))>=0)
  17.         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);
  18.     else printf("ID=%s not found\n",id);
  19.     gets(name);
  20.     if((t=searchName(work,name,n))>=0)
  21.         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);
  22.     else printf("Name=%s not found\n",name);
  23.     sortWorkAge(work,n);
  24.     output(work,n);
  25.     return 0;
  26. }
复制代码

我完整的错误代码
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 30
  4. struct Worker
  5. {
  6.     char id[10];
  7.     char name[21];
  8.     char sex;
  9.     int workAge;
  10.     double wage;
  11. };
  12. void input(struct Worker a[],int n)
  13. {
  14.     for(int i=0;i<n;i++)
  15.     {
  16.         scanf("%s",a[i].id);
  17.         scanf("%s",a[i].name);
  18.         scanf("%c",&a[i].sex);
  19.         scanf("%d",&a[i].workAge);
  20.         scanf("%lf",&a[i].wage);
  21.     }
  22. }
  23. void output(struct Worker a[],int n)
  24. {
  25.     for(int i=0;i<n;i++)
  26.     {
  27.         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);
  28.     }
  29. }
  30. double wageSummary(struct Worker a[],int n)
  31. {
  32.     double sum=0;
  33.     for(int i=0;i<n;i++)
  34.     {
  35.         sum+=a[i].wage;
  36.     }
  37.     return sum;
  38. }
  39. double averWorkAge(struct Worker a[],int n)
  40. {
  41.     int sum=0;
  42.     for(int i=0;i<n;i++)
  43.     {
  44.         sum+= a[i].workAge;
  45.     }
  46.     return sum/n;
  47. }
  48. double averWage(struct Worker a[],int n)
  49. {
  50.     double sum=0;
  51.     for(int i=0;i<n;i++)
  52.     {
  53.         sum+=a[i].wage;
  54.     }
  55.     return sum/n;
  56. }
  57. int maleCount(struct Worker a[],int n)
  58. {
  59.     int count=0;
  60.     for(int i=0;i<n;i++)
  61.     {
  62.         if(a[i].sex=='M'|| a[i].sex=='m')
  63.             count++;
  64.     }
  65.     return count;
  66. }
  67. int femaleCount(struct Worker a[],int n)
  68. {
  69.     int count=0;
  70.     for(int i=0;i<n;i++)
  71.     {
  72.         if(a[i].sex=='F'||a[i].sex=='f')
  73.             count++;
  74.     }
  75.     return count;
  76. }
  77. int searchID(struct Worker a[],char id[],int n)
  78. {
  79.     int flag=0;
  80.     for(int i=0;i<n;i++)
  81.     {
  82.         if( a[i].id==id)
  83.         {
  84.             flag=i;
  85.             break;
  86.         }
  87.     }
  88.     if(flag==0)
  89.         return -1;
  90.     else
  91.         return flag;
  92. }
  93. int searchName(struct Worker a[],char name[],int n)
  94. {
  95.     int flag=0;
  96.     for(int i=0;i<n;i++)
  97.     {
  98.         if(a[i].name==name)
  99.         {
  100.             flag=i;
  101.             break;
  102.         }
  103.     }
  104.     if(flag==0)
  105.         return -1;
  106.     else
  107.         return flag;
  108. }
  109. void sortWorkAge(struct Worker a[],int n)
  110. {

  111.     a[n+1]=a[0];
  112.     for(int i=0;i<n;i++)
  113.     {
  114.         for(int j=0;j<n-i;j++)
  115.         {
  116.             if(a[j].workAge>a[j+1].workAge)
  117.             {
  118.                 a[n+1]=a[j];
  119.                 a[j]=a[j+1];
  120.                 a[j+1]=a[n+1];
  121.             }

  122.         }
  123.     }
  124. }

  125. int main(void){
  126.     struct Worker work[N];
  127.     int n,t;
  128.     char ch,id[10],name[20];
  129.     scanf("%d",&n);
  130.     input(work,n);
  131.     printf("WageSummary=%.2lf,averWage=%.2lf\n",wageSummary(work,n),averWage(work,n));
  132.     printf("averWorkAge=%.1lf\n",averWorkAge(work,n));
  133.     printf("maleCount=%d,femaleCount=%d\n",maleCount(work,n),femaleCount(work,n));
  134.     while((ch = getchar()) != '\n' && ch != EOF);
  135.     gets(id);
  136.     if((t=searchID(work,id,n))>=0)
  137.         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);
  138.     else printf("ID=%s not found\n",id);
  139.     gets(name);
  140.     if((t=searchName(work,name,n))>=0)
  141.         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);
  142.     else printf("Name=%s not found\n",name);
  143.     sortWorkAge(work,n);
  144.     output(work,n);
  145.     return 0;
  146. }
复制代码
小甲鱼最新课程 -> https://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]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  11. int main()
  12. {
  13.     struct Worker work[N];
  14.     int n;
  15.     scanf("%d", &n);
  16.     for (int i = 0; i < n; i++)
  17.     {
  18.         scanf("%s %s %c %d %lf", work[i].id,work[i].name,&work[i].sex,&work[i].workAge,&work[i].wage);
  19.         fflush(stdin);
  20.     }
  21.     return 0;
  22. }
复制代码
改成这样也可以
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

为啥会产生一个\n
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

按我的理解,你输入完内容后不是要按一次回车么,那个就是\n
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

第一个输入id的时候不产生吗  第一次见这种错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 23:00:18 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

总之%c用的时候你要注意前面是不是有\n就对了,有就用getchar()吃掉他,就OK了
小甲鱼最新课程 -> https://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()将学生的结构从文件中读出,然后访问结构成员变量对学生信息进行解析。
给,之前的学校作业
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-8 02:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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