C语言结构体数组与指针(成绩统计问题)示例
/* added on 2003-05-16
* by hofman
*/
#define INF "%d %s %f %f %f"
#define OUTF "%d %s %f %f %f %f %f"

main()
{
struct score {
int sn;
char name[10];
float maths;
float c;
float en;
float total;
float avg;
};
int len = sizeof(struct score);
int len2 = len*50;
int i;
struct score *p;

/* allocate mem */
p = (struct score *)malloc(len2);
/* input */
for(i=0;i<2;i++)
{
printf("Input sn name maths c en \n");
scanf(INF,&p->sn,p->name,&p->maths,&p->c,&p->en);
p->total=(p->maths)+(p->c)+(p->en);
p->avg=(p->total)/3;
p++;
}
/* rewind p */
p=p-2;
/* output */
for(i=0;i<2;i++)
{
printf(OUTF,p->sn,p->name,p->maths,p->c,p->en,p->total,p->avg);
printf("\n");
p++;
}
}
/*
说明:该程序在linux gcc 以及NT TURBO C下均编译通过
i<2;当然是为了实际验证的方便,使用时改为i<50即可。
*/
------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:Re:C语言结构体数组与指针(成绩统计问题)示例 | 作者:hofman | 军衔:上尉 | 发表时间:05-17 18:05:06
/* added on 2003-05-16
* by hofman
*/
#define INF "%d %s %f %f %f"
#define OUTF "%d %s %f %f %f %f %f"

main()
{
struct score {
int sn;
char name[10];
float maths;
float c;
float en;
float total;
float avg;
};
int i;
struct score *p;
struct score scores306[50];
p = scores306;
/* input */
for(i=0;i<2;i++)
{
printf("Input sn name maths c en \n");
scanf(INF,&p->sn,p->name,&p->maths,&p->c,&p->en);
p->total=(p->maths)+(p->c)+(p->en);
p->avg=(p->total)/3;
p++;
}

p = scores306;
/* p=p-2; also works */
/* output */
for(i=0;i<2;i++)
{
printf(OUTF,p->sn,p->name,p->maths,p->c,p->en,p->total,p->avg);
printf("\n");
p++;
}
}

/* 这个版本与你们的程序基本一致,其实这样更简单,更直观

2个例子无非说明分配内存有几种方法,

前例由程序申请内存(使用了malloc函数),

本例则由编译系统自动分配内存。

注意:申明数据类型 如本例中的struct score 是不
分配内存的。
声明变量 如本例的 scores306[50] 才分配内存。
*/
------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:C语言结构体数组与指针(成绩统计问题)示例之三:使用指针数组 | 作者:hofman | 军衔:上尉 | 发表时间:05-18 11:43:04
/* added on 2003-05-18
* by hofman
*/
#define INF "%d %s %f %f %f"
#define OUTF "%d %s %f %f %f %f %f"

main()
{
struct score {
int sn;
char name[10];
float maths;
float c;
float en;
float total;
float avg;
};
int i;
struct score scores306[50];
/* 定义指针数组 */
struct score *k[50];
struct score *p;
p = scores306;
/* input */
for(i=0;i<50;i++)
{
printf("Input sn name maths c en \n");
scanf(INF,&p->sn,p->name,&p->maths,&p->c,&p->en);
p->total=(p->maths)+(p->c)+(p->en);
p->avg=(p->total)/3;
/* 将指针放入指针数组 */
k = p;
p++;
}
/* output */
for(i=0;i<2;i++)
{
/* 从指针数组中取出指针 */
p = k;
printf(OUTF,p->sn,p->name,p->maths,p->c,p->en,p->total,p->avg);
printf("\n");
}
}
/*
为什么要用指针数组呢?不用不是更简单吗?
看看下面的例子就会明白了
*/
------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:Re:C语言结构体数组与指针(成绩统计问题)示例之四:使用指针数组排序 | 作者:hofman | 军衔:上尉 | 发表时间:05-18 11:56:50
/* added on 2003-05-18
* by hofman
*/
#define INF "%d %s %f %f %f"
#define OUTF "%d %s %f %f %f %f %f"

main()
{
struct score {
int sn;
char name[10];
float maths;
float c;
float en;
float total;
float avg;
};
int i,j,h,n;
float t;
struct score scores306[50];
struct score *k[50];
struct score *p;
p = scores306;
n = 50;
/* for sort 就是排序*/
/* input */
for(i=0;i<50;i++)
{
printf("Input sn name maths c en \n");
scanf(INF,&p->sn,p->name,&p->maths,&p->c,&p->en);
p->total=(p->maths)+(p->c)+(p->en);
p->avg=(p->total)/3;
k = p;
p++;
}
/* sort */

for(i=0;i<n-1;i++)
{
h = i;
for(j=i+1;j<n;j++)
if((k[h]->total)>(k[j]->total))
{
p = k[h];
k[h] = k[j];
k[j] = p;
}
}
/* output */
for(i=0;i<50;i++)
{
p = k;
printf(OUTF,p->sn,p->name,p->maths,p->c,p->en,p->total,p->avg);

/* printf(OUTF,k->sn,k->name,k->maths,k->c,k->en,k->total,k->avg);
这样也可以,更直观,当然前面的写法更简洁 */

printf("\n");
}
}

/*
本程序在排序时,移动的只是结构体的指针,而非庞大的结构体数据本身,

因而其效率要高得多,这就是为什么要用结构体指针数组的原因。
*/
------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:Re:Re:C盈褦陆峁固ナ阶┯刚B成悸ㄍ陈计幨屸)示=之藙拢潞使觾指斋式砖艆胁 | 作者:haohao | 军衔:六级军士 | 发表时间:05-18 16:30:58
#include<string.h>
struct shenghh{
int no;
char name[20];
float maths;
float eng;
float chin;
float sum;
float sumn;
}leader[2];
main(){
struct shenghh*i;
struct shenghh*p;
for(i=leader;i<leader+2;i++)
{
scanf("%d",&i->no);
scanf("%s",&i->name);
scanf("%f",&i->maths);
scanf("%f",&i->eng);
scanf("%f",&i->chin);
i->sum=i->maths+i->eng+i->chin;
i->sumn=i->sum/3;
}
for(p=leader;p<leader+2;p++)
{
printf("%d\n",p->no);
printf("%s\n",p->name);
printf("%f\n",p->maths);
printf("%f\n",p->eng);
printf("%f\n",p->chin);
printf("%f\n",p->sum);
printf("%f\n",p->sumn);
}
}
杩欐槸鎴戝啓鐨勯?氳繃浜嗗ソ鍍忓皯浜嗙偣浠?涔?br>------

回复此文章 |
回复主题:Re:Re:Re:C盈褦陆峁固ナ阶┯刚B成悸ㄍ陈计幨屸)示=之藙拢潞使觾指斋式砖艆胁 | 作者:haohao | 军衔:六级军士 | 发表时间:05-18 16:37:29
#include<string.h>
struct shenghh{
int no;
char name[20];
float maths;
float eng;
float chin;
float sum;
float sumn;
}*leader[2];
main()
{
int i;
int j;
for(i=0;i<2;i++)
{
scanf("%d",&leader->no);
scanf("%s",&leader->name);
scanf("%f",&leader->maths);
scanf("%f",&leader->eng);
scanf("%f",&leader->chin);
leader->sum=leader->maths+leader->eng+leader->chin;
leader->sumn=leader->sum/3;
}
for(j=0;j<2;j++)
{
printf("%d\n",leader[j]->no);
printf("%s\n",leader[j]->name);
printf("%f\n",leader[j]->maths);
printf("%f\n",leader[j]->eng);
printf("%f\n",leader[j]->chin);
printf("%f\n",leader[j]->sum);
printf("%f\n",leader[j]->sumn);
}
}
这也通过了
------

回复此文章 |
回复主题:Re:C镅越峁固迨橛胫刚耄ǔ杉ㄍ臣莆侍猓┦纠模菏褂弥刚胧榕判?nbsp;| 作者:hofman | 军衔:上尉 | 发表时间:05-23 10:31:57
排序方法有多种,如插入排序,选择排序,冒泡排序,快速排序,
堆排序等等,上例使用的是最简单的选择排序。
------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:Re:C语言结构体数组与指针(成绩统计问题)示例之五:将结果保存到文件 | 作者:hofman | 军衔:上尉 | 发表时间:05-26 23:51:58
/* added on 2003-05-26
* by hofman
*/
#include <stdio.h>
#define INF "%d %s %f %f %f"
#define OUTF "%d %s %f %f %f %f %f"

main()
{
struct score {
int sn;
char name[10];
float maths;
float c;
float en;
float total;
float avg;
};
int len = sizeof(struct score);
int len2 = len*50;
int i;
int j;
int h;
struct score *p;
struct score *k[50];
struct score *buf;
FILE *fp;
/* allocate mem */
buf = (struct score *)malloc(len2);
p = buf;
/* input */
for(i=0;i<5;i++)
{
printf("Input sn name maths c en \n");
scanf(INF,&p->sn,p->name,&p->maths,&p->c,&p->en);
p->total=(p->maths)+(p->c)+(p->en);
p->avg=(p->total)/3;
k = p;
p++;
}
/* sort */
for(i=0;i<5;i++)
{
h=i;
for(j=i+1;j<5;j++)
{
if((k[h]->total)<(k[j]->total))
{
p = k[h];
k[h] = k[j];
k[j] = p;
}
}
}
/* output */
for(i=0;i<5;i++)
{
p = k;
printf(OUTF,p->sn,p->name,p->maths,p->c,p->en,p->total,p->avg);
printf("\n");
}
/* save * 这就是新增的部分啦。将结果保存到文件score.dat中*/
fp = fopen("score.dat","wb");
fwrite(buf,sizeof(struct score),5,fp);
fclose(fp);
}




------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:C语言(成绩统计问题)示例之六:将排序结果从文件中读出并显示出来 | 作者:hofman | 军衔:上尉 | 发表时间:05-27 00:01:23
/* added on 2003-05-26
* by hofman
*/
#include <stdio.h>
#define INF "%d %s %f %f %f"
#define OUTF "%d %s %f %f %f %f %f"

main()
{
struct score {
int sn;
char name[10];
float maths;
float c;
float en;
float total;
float avg;
};
int len = sizeof(struct score);
int len2 = len*50;
int i;
struct score *p;
FILE *fp;
/* allocate mem */
p = (struct score *)malloc(len2);

/* read 读入文件score.dat,注意"rw"写,“rb"读,
就是用二进制方式写入,再用二进制方式读出
老谭说得这样,否则会出错。这样作,编译通过了。
不这样是否会出错,我倒没有试过 */

fp = fopen("score.dat","rb");
fread(p,sizeof(struct score),5,fp);
fclose(fp);

/* output */
for(i=0;i<5;i++)
{
printf(OUTF,p->sn,p->name,p->maths,p->c,p->en,p->total,p->avg);
printf("\n");
p++;
}
}




------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:Re:C语言(成绩统计问题)示例之六:将排序结果从文件中读出并显示出来 | 作者:haohao | 军衔:六级军士 | 发表时间:05-30 19:25:21
在文件中进行读出或写入时有一些非常难看的错误。
者可能是何原因呢?
------
我要用我的一生来做一件事,
那就是属于我自己一份的事业;
我要用我的一生来爱一个人,
那就是属于我自己一生的伴侣;
回复主题:Re:文件读写错误 | 作者:hofman | 军衔:上尉 | 发表时间:06-01 12:44:50
首先,你应该把错误写的尽可能的详细。

因为你写得不清楚,所以我只能推测你的错误:
应该rw写,rb读,否则会出现乱码,而这是我的帖子已经说明了的。
我的示例程序都运行通过了,你可以先copy,再修改。
------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:Re:Re:C语言结构体数组与指针(成绩统计问题)示例之五:将结果保存到文件 | 作者:haohao | 军衔:六级军士 | 发表时间:06-07 21:35:40
这个程序有问题:
在文件中有乱码(指整型,浮点);
------
我要用我的一生来做一件事,
那就是属于我自己一份的事业;
我要用我的一生来爱一个人,
那就是属于我自己一生的伴侣;
回复此文章 |
回复主题:Re:Re:C语言文件读写 | 作者:hofman | 军衔:上尉 | 发表时间:06-21 03:19:10
#include <stdio.h>

main(int argc,char *argv[])
{
FILE *in;
FILE *out;
char buf[1024];
int i,j;

if(argc<3)
{
printf("usage : %s <inputfile> <outputfile>",argv[0]);
exit();
}

in = fopen(argv[1],"r");
if(in == NULL)
puts("File open error");
out = fopen(argv[2],"w");
if(out == NULL)
puts("File write error");

while(fgets(buf,65,in) != NULL)
{
for(i=0;i<=50;i++)
{
if(buf == w)
if(buf[i+1] == u)
fputs(buf,out);
}

}
}


------
军都山下,
有一个美丽的苹果园。
苹果园里有什么呢?
好多好多的JavaBeans!!!
回复此文章 |
回复主题:Re:Re:C语言(成绩统计问题)示例之六:将排序结果从文件中读出并显示出来 | 作者:huaner | 军衔:列兵 | 发表时间:09-09 15:24:13
什么错误
写出来看看呀。
------

hofman   2005-11-19 22:00:35 评论:1   阅读:9262   引用:0
@2006-08-01 17:30:04  游客
very good article,thanks .

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

Copyright@2004-2010 powered by YuLog