首页» 卓达学刊» 论坛首页» 论坛精华区» 卓达人· 电脑技术· 学在卓大· 我们的大学城· 红铅笔文学社

1    2   

C语言结构体数组与指针(成绩统计问题)示例

作者: hofman  军衔: 上尉  发表时间: 05-17 01:29:48

/* 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即可。
*/

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] 才分配内存。
*/

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");
}
}
/*
为什么要用指针数组呢?不用不是更简单吗?
看看下面的例子就会明白了
*/

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");
}
}

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

因而其效率要高得多,这就是为什么要用结构体指针数组的原因。
*/

Re:Re:C盈??陆峁固ナ阶┯?指斋拢篓鲁杉篓统录????猓┦?=之??拢潞使??指斋式砖??胁

作者: haohao0  军衔: 六级军士  发表时间: 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);
}
}
杩????????????????杩?浜?濂藉??灏?浜???逛??涔?

Re:Re:Re:C盈??陆峁固ナ阶┯?指斋拢篓鲁杉篓统录????猓┦?=之??拢潞使??指斋式砖?

作者: haohao0  军衔: 六级军士  发表时间: 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语言结构体数组与指针(成绩统计问题)示例之四:使用指针数组排序

作者: hofman  军衔: 上尉  发表时间: 05-23 10:31:57

排序方法有多种,如插入排序,选择排序,冒泡排序,快速排序,
堆排序等等,上例使用的是最简单的选择排序。

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);
}




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++;
}
}




Re:C语言(成绩统计问题)示例之六:将排序结果从文件中读出并显示出来

作者: haohao0  军衔: 六级军士  发表时间: 05-30 19:25:21

在文件中进行读出或写入时有一些非常难看的错误。
者可能是何原因呢?