快点进来吧 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 {:10_266:} 6666666 来人呐 救命啊 {:10_243:} 我擦,这么神奇{:10_256:} 一世轻尘 发表于 2020-12-17 22:05
我擦,这么神奇
是吧 能给一下题目要求吗?或者说输入样例有吗?
{:10_249:} 本帖最后由 癞蛤蟆丶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多行 我怕你们不想看 我把有问题的地方挑出来了 完整的题目
(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:49 编辑
输入环节错掉了,当你执行scanf("%s", a.name);时,你会产生一个换行符\n被接下来的scanf("%c", &a.sex);读取,也就是说,当你输入表示性别的词(比如b(表示男孩)或者g(表示女孩))的时候,你实际上是给scanf("%d", &a.workAge);输入了,之后的也错掉了,所以会异常结束;
解决办法:在这两句之间加一个getchar();用来吃掉这个换行符,如图所示 #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
图片貌似看不了,但我说的应该很清楚了,还有什么问题吗?
为啥会产生一个\n 癞蛤蟆丶ccc 发表于 2020-12-17 22:55
为啥会产生一个\n
按我的理解,你输入完内容后不是要按一次回车么,那个就是\n _Charlotte_ 发表于 2020-12-17 22:54
图片貌似看不了,但我说的应该很清楚了,还有什么问题吗?
第一个输入id的时候不产生吗{:10_266:}第一次见这种错误{:10_269:} https://www.cnblogs.com/GoldCrop/p/11306547.html推荐你去看一下 癞蛤蟆丶ccc 发表于 2020-12-17 22:58
第一个输入id的时候不产生吗第一次见这种错误
{:10_277:}你问我我问谁,我就知道错误在这,还有,你有没有其他结构体的题目,我现在也学到C的结构体了,有没有练习题做啊,我找不到题目啊 癞蛤蟆丶ccc 发表于 2020-12-17 22:58
第一个输入id的时候不产生吗第一次见这种错误
总之%c用的时候你要注意前面是不是有\n就对了,有就用getchar()吃掉他,就OK了 _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