癞蛤蟆丶ccc 发表于 2020-12-17 11:16:12

快点进来吧 hxd们 急!! 结构体

本帖最后由 癞蛤蟆丶ccc 于 2020-12-17 22:29 编辑

#include <stdio.h>
#define N 30
struct Worker
{
    char id;
    char name;
    char sex;
    int workAge;
    double wage;
};
void input(struct Worker a[], int n) //对结构体进行赋值
{
    for (int i = 0; i < n; i++)
    {
      scanf("%s", a.id);
      scanf("%s", a.name);
      scanf("%c", &a.sex);
      scanf("%d", &a.workAge);
      scanf("%lf", &a.wage);
    }
}
int main()
{
    struct Worker work;
    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

癞蛤蟆丶ccc 发表于 2020-12-17 12:33:16

{:10_266:}

qiaoqiaoqq 发表于 2020-12-17 13:50:59

6666666

癞蛤蟆丶ccc 发表于 2020-12-17 19:43:39

来人呐 救命啊

癞蛤蟆丶ccc 发表于 2020-12-17 21:23:34

{:10_243:}

一世轻尘 发表于 2020-12-17 22:05:20

我擦,这么神奇{:10_256:}

癞蛤蟆丶ccc 发表于 2020-12-17 22:11:06

一世轻尘 发表于 2020-12-17 22:05
我擦,这么神奇

是吧

_Charlotte_ 发表于 2020-12-17 22:19:24

能给一下题目要求吗?或者说输入样例有吗?
{:10_249:}

癞蛤蟆丶ccc 发表于 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多行 我怕你们不想看 我把有问题的地方挑出来了

癞蛤蟆丶ccc 发表于 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;
    int n,t;
    char ch,id,name;
    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.id,work.name,work.sex,work.workAge,work.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.id,work.name,work.sex,work.workAge,work.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;
    char name;
    char sex;
    int workAge;
    double wage;
};
void input(struct Worker a[],int n)
{
    for(int i=0;i<n;i++)
    {
      scanf("%s",a.id);
      scanf("%s",a.name);
      scanf("%c",&a.sex);
      scanf("%d",&a.workAge);
      scanf("%lf",&a.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.id,a.name,a.sex,a.workAge,a.wage);
    }
}
double wageSummary(struct Worker a[],int n)
{
    double sum=0;
    for(int i=0;i<n;i++)
    {
      sum+=a.wage;
    }
    return sum;
}
double averWorkAge(struct Worker a[],int n)
{
    int sum=0;
    for(int i=0;i<n;i++)
    {
      sum+= a.workAge;
    }
    return sum/n;
}
double averWage(struct Worker a[],int n)
{
    double sum=0;
    for(int i=0;i<n;i++)
    {
      sum+=a.wage;
    }
    return sum/n;
}
int maleCount(struct Worker a[],int n)
{
    int count=0;
    for(int i=0;i<n;i++)
    {
      if(a.sex=='M'|| a.sex=='m')
            count++;
    }
    return count;
}
int femaleCount(struct Worker a[],int n)
{
    int count=0;
    for(int i=0;i<n;i++)
    {
      if(a.sex=='F'||a.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.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.name==name)
      {
            flag=i;
            break;
      }
    }
    if(flag==0)
      return -1;
    else
      return flag;
}
void sortWorkAge(struct Worker a[],int n)
{

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

      }
    }
}

int main(void){
    struct Worker work;
    int n,t;
    char ch,id,name;
    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.id,work.name,work.sex,work.workAge,work.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.id,work.name,work.sex,work.workAge,work.wage);
    else printf("Name=%s not found\n",name);
    sortWorkAge(work,n);
    output(work,n);
    return 0;
}

_Charlotte_ 发表于 2020-12-17 22:44:52

本帖最后由 _Charlotte_ 于 2020-12-17 22:49 编辑

输入环节错掉了,当你执行scanf("%s", a.name);时,你会产生一个换行符\n被接下来的scanf("%c", &a.sex);读取,也就是说,当你输入表示性别的词(比如b(表示男孩)或者g(表示女孩))的时候,你实际上是给scanf("%d", &a.workAge);输入了,之后的也错掉了,所以会异常结束;
解决办法:在这两句之间加一个getchar();用来吃掉这个换行符,如图所示

一世轻尘 发表于 2020-12-17 22:50:31

#include <stdio.h>
#define N 30
struct Worker
{
    char id;
    char name;
    char sex;
    int workAge;
    double wage;
};

int main()
{
    struct Worker work;
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
      scanf("%s %s %c %d %lf", work.id,work.name,&work.sex,&work.workAge,&work.wage);
      fflush(stdin);
    }
    return 0;
}改成这样也可以

_Charlotte_ 发表于 2020-12-17 22:54:07

图片貌似看不了,但我说的应该很清楚了,还有什么问题吗?

癞蛤蟆丶ccc 发表于 2020-12-17 22:55:20

_Charlotte_ 发表于 2020-12-17 22:54
图片貌似看不了,但我说的应该很清楚了,还有什么问题吗?

为啥会产生一个\n

_Charlotte_ 发表于 2020-12-17 22:58:20

癞蛤蟆丶ccc 发表于 2020-12-17 22:55
为啥会产生一个\n

按我的理解,你输入完内容后不是要按一次回车么,那个就是\n

癞蛤蟆丶ccc 发表于 2020-12-17 22:58:59

_Charlotte_ 发表于 2020-12-17 22:54
图片貌似看不了,但我说的应该很清楚了,还有什么问题吗?

第一个输入id的时候不产生吗{:10_266:}第一次见这种错误{:10_269:}

一世轻尘 发表于 2020-12-17 23:00:18

https://www.cnblogs.com/GoldCrop/p/11306547.html推荐你去看一下

_Charlotte_ 发表于 2020-12-17 23:00:41

癞蛤蟆丶ccc 发表于 2020-12-17 22:58
第一个输入id的时候不产生吗第一次见这种错误

{:10_277:}你问我我问谁,我就知道错误在这,还有,你有没有其他结构体的题目,我现在也学到C的结构体了,有没有练习题做啊,我找不到题目啊

_Charlotte_ 发表于 2020-12-17 23:01:46

癞蛤蟆丶ccc 发表于 2020-12-17 22:58
第一个输入id的时候不产生吗第一次见这种错误

总之%c用的时候你要注意前面是不是有\n就对了,有就用getchar()吃掉他,就OK了

一世轻尘 发表于 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()将学生的结构从文件中读出,然后访问结构成员变量对学生信息进行解析。
给,之前的学校作业{:10_284:}{:10_284:}
页: [1] 2
查看完整版本: 快点进来吧 hxd们 急!! 结构体