100分悬赏!! 请问C语言程式高手一些有关於条件判断的问题!!

各位C语言程式高手们大家好!!我有个关於"C语言"方面的问题想要请教各位。我想请问各位C语言程式高手们,一些有关於条件判断的问题!!我想要写一个有关於学生成绩加减分的程式... 各位C语言程式高手们大家好!!
我有个关於"C语言"方面的问题想要请教各位。

我想请问各位C语言程式高手们,一些有关於条件判断的问题!!
我想要写一个有关於学生成绩加减分的程式。

比方说:
我先从外部读取一笔名为student.txt的档案。
其内容为:
Ryu 1 10
Ken 2 5
Ann 1 15
Bub 2 20
(分别代表:姓名、加减分代码、分数)
(※ 1代表"加分";2代表"扣分")

接下来,系统会要求我输入"姓名"。
再来,输入"加减分代码"。
最后,输入"分数"。

假设,我输入"Bub"、"1"、"50"。
则系统内部就会是"Bub"、"1"、"30"。
又或者,我输入"Ann"、"2"、"5"。
此时,系统内部就会是"Ann"、"2"、"10"。

接下来,系统会列出目前系统内部的所有资料。
比方说,现在是:
Ryu 1 10
Ken 2 5
Ann 2 10
Bub 1 30

最后,系统会要求我输入一个"标准分数"。
然后,列出所有低於"标准分数"的"姓名"、"加减分代码'、"分数"。
比方说,我输入的"标准分数"是30。
则系统就会列出:
Ryu 1 10
Ken 2 5
Ann 2 10

有关於"读取档案"的部份,我已经写好了。
如下:
#include <stdio.h>
#include <stdlib.h>
void fileopen(void);
main(void)
{
fileopen();
system("pause");/*按任意键结束*/
}

void fileopen()
{
FILE *fp;
char filename[100];
char file[100];
printf("请输入档案名称:(必须包含副档名.txt)");
scanf("%s",filename);
fp=fopen(filename, "r");
if(fp!=NULL)
{
printf("档案%s开启中...\n",filename);
while((fgets(file,100,fp))!=NULL)
{
printf("您所输入的档案其内容为:%s\n",file);
}
}
else
{
printf("档案%s开启失败!!\n",filename);
}
}

由於事态紧急,希望各位C语言程式高手们可以帮帮我的忙,帮我解答剩下的部份。
在此感激不尽!! 我给100分噢!!

P.S.必须要有原始程式码并且可以执行,切勿只是纸上谈兵而已,感谢!!
若能够在明天星期一中午12点以前做出来,并且符合我的需求,我可以再加分!! 各位能够帮上我的忙,我绝对不会吝啬给分的。 万事拜托了!!
P.S. 希望尽量以浅显易懂的方式来撰写,Thank You!!
展开
 我来答
dielsalder
2008-01-06 · TA获得超过3854个赞
知道大有可为答主
回答量:1864
采纳率:50%
帮助的人:2720万
展开全部
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _student
{
char name[16];
int sign;
int val;
} Student;

Student* readFile(FILE* pf, size_t* cnt)
{
size_t n = 8, i = 0;
Student* ps = (Student*)malloc(n * sizeof(Student));
*cnt = 0;
if(ps != 0)
{
while(fscanf(pf, "%s %d %d", ps[i].name, &ps[i].sign, &ps[i].val) != -1)
{
if(++i == n)
{
Student* tmp;
n <<= 1;
if((tmp = (Student*)realloc(ps, n * sizeof(Student))) != 0)
ps = tmp;
else
{
free(ps);
ps = 0;
break;
}
}
}
ps = (Student*)realloc(ps, i * sizeof(Student));
*cnt = i;
}
return ps;
}

void realse(Student* ps)
{
free(ps);
}

int lfind(Student* ps, size_t cnt, Student* tofind)
{
int i = 0;
for( ; i < cnt; i++)
if(strcmp(ps[i].name, tofind->name) == 0)
return i;
return -1;
}

void modify(Student* s1, const Student* s2)
{
int val1 = s1->val, val2 = s2->val;
if(s1->sign == 2) val1 = -val1;
if(s2->sign == 2) val2 = -val2;
val1 += val2;
s1->val = abs(val1);
s1->sign = val1 >=0 ? 1 : 2;
}

void display(Student* ps)
{
printf("%s %d %d\n", ps->name, ps->sign, ps->val);
}

void displayAll(Student* ps, size_t cnt)
{
size_t i = 0;
for( ; i < cnt; i++)
display(ps + i);
}

int main(void)
{
char fname[20];
FILE* pf;
Student* ps;
size_t cnt;
printf("请输入文件名(*.txt)\t");
scanf("%s", fname);
pf = fopen(fname, "r");
if(pf == 0)
printf("文件打开失败\n");
else
{
ps = readFile(pf, &cnt);
fclose(pf);
if(ps != 0)
{
Student tmp;
int i, score, choice;
while(1)
{
printf("请输入姓名 加减分代码 分数\n");
scanf("%s %d %d", tmp.name, &tmp.sign, &tmp.val);
i = lfind(ps, cnt, &tmp);
if(i == -1)
printf("没有找到%s,请重新输入\n", tmp.name);
else
{
modify(ps + i, &tmp);
printf("是否继续?1.是 2.否\n");
scanf("%d", &choice);
if(choice != 1)
break;
}
}
displayAll(ps, cnt);
printf("请输入标准分数\n");
scanf("%d", &score);
for(i = 0; i < cnt; i++)
{
if(ps[i].sign == 2 || (ps[i].sign == 1 && ps[i].val < score))
display(ps + i);
}
realse(ps);
}
else
{
printf("内存不足\n");
}
}
return 0;
}

运行结果

请输入文件名(*.txt) 1.txt
请输入姓名 加减分代码 分数
Bub 1 50
是否继续?1.是 2.否
1
请输入姓名 加减分代码 分数
Ann 2 5
是否继续?1.是 2.否
2
Ryu 1 10
Ken 2 5
Ann 1 10
Bub 1 30
请输入标准分数
30
Ryu 1 10
Ken 2 5
Ann 1 10
聂友铎暖暖
2019-12-07 · TA获得超过3762个赞
知道大有可为答主
回答量:3158
采纳率:29%
帮助的人:166万
展开全部
#include
<stdio.h>
#include
<string.h>
#include
<stdlib.h>
typedef
struct
_student
{
char
name[16];
int
sign;
int
val;
}
Student;
Student*
readFile(FILE*
pf,
size_t*
cnt)
{
size_t
n
=
8,
i
=
0;
Student*
ps
=
(Student*)malloc(n
*
sizeof(Student));
*cnt
=
0;
if(ps
!=
0)
{
while(fscanf(pf,
"%s
%d
%d",
ps[i].name,
&ps[i].sign,
&ps[i].val)
!=
-1)
{
if(++i
==
n)
{
Student*
tmp;
n
<<=
1;
if((tmp
=
(Student*)realloc(ps,
n
*
sizeof(Student)))
!=
0)
ps
=
tmp;
else
{
free(ps);
ps
=
0;
break;
}
}
}
ps
=
(Student*)realloc(ps,
i
*
sizeof(Student));
*cnt
=
i;
}
return
ps;
}
void
realse(Student*
ps)
{
free(ps);
}
int
lfind(Student*
ps,
size_t
cnt,
Student*
tofind)
{
int
i
=
0;
for(
;
i
<
cnt;
i++)
if(strcmp(ps[i].name,
tofind->name)
==
0)
return
i;
return
-1;
}
void
modify(Student*
s1,
const
Student*
s2)
{
int
val1
=
s1->val,
val2
=
s2->val;
if(s1->sign
==
2)
val1
=
-val1;
if(s2->sign
==
2)
val2
=
-val2;
val1
+=
val2;
s1->val
=
abs(val1);
s1->sign
=
val1
>=0
?
1
:
2;
}
void
display(Student*
ps)
{
printf("%s
%d
%d\n",
ps->name,
ps->sign,
ps->val);
}
void
displayAll(Student*
ps,
size_t
cnt)
{
size_t
i
=
0;
for(
;
i
<
cnt;
i++)
display(ps
+
i);
}
int
main(void)
{
char
fname[20];
FILE*
pf;
Student*
ps;
size_t
cnt;
printf("请输入文件名(*.txt)\t");
scanf("%s",
fname);
pf
=
fopen(fname,
"r");
if(pf
==
0)
printf("文件打失败\n");
else
{
ps
=
readFile(pf,
&cnt);
fclose(pf);
if(ps
!=
0)
{
Student
tmp;
int
i,
score,
choice;
while(1)
{
printf("请输入姓名
加减代码
数\n");
scanf("%s
%d
%d",
tmp.name,
&tmp.sign,
&tmp.val);
i
=
lfind(ps,
cnt,
&tmp);
if(i
==
-1)
printf("没找%s,请重新输入\n",
tmp.name);
else
{
modify(ps
+
i,
&tmp);
printf("否继续?1.
2.否\n");
scanf("%d",
&choice);
if(choice
!=
1)
break;
}
}
displayAll(ps,
cnt);
printf("请输入标准数\n");
scanf("%d",
&score);
for(i
=
0;
i
<
cnt;
i++)
{
if(ps[i].sign
==
2
||
(ps[i].sign
==
1
&&
ps[i].val
<
score))
display(ps
+
i);
}
realse(ps);
}
else
{
printf("内存足\n");
}
}
return
0;
}
运行结
请输入文件名(*.txt)
1.txt
请输入姓名
加减代码

Bub
1
50
否继续?1.
2.否
1
请输入姓名
加减代码

Ann
2
5
否继续?1.
2.否
2
Ryu
1
10
Ken
2
5
Ann
1
10
Bub
1
30
请输入标准数
30
Ryu
1
10
Ken
2
5
Ann
1
10
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dugucloud
2008-01-06 · TA获得超过822个赞
知道小有建树答主
回答量:194
采纳率:0%
帮助的人:167万
展开全部
这个程序本身就没错,恐怕是你一时没想通而已。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式