本人自用,没有电脑的时候方便练题,也欢迎一起探讨!有什么问题可以提出来!!加油ヾ(◍°∇°◍)ノ゙
第一套
第一题
【填空题】源程序文件 blank1.c。程序通过定义学生结构体变量,存储了学生的学号、姓名和三门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参 filename所指文件中最后一个学生的数据,即用新的学生数据覆羞该学生原来的数据,其他学生的数据不变。
#include <stdio.h>
#define N 5
typedef struct student {
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename, STU n)
{ FILE *fp;
/**********found**********/
fp = fopen(filename, "rb+"); // fp = fopen(__1__, "rb+");
/**********found**********/
fseek(fp, -(long)sizeof(STU), SEEK_END); // fseek(__2__, -(long)sizeof(STU), SEEK_END);
/**********found**********/
fwrite(&n, sizeof(STU), 1,fp); // fwrite(&n, sizeof(STU), 1, __3__);
fclose(fp);
}
void main()
{ STU t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88},
{10003,"LiSi", 85, 70, 78}, {10004,"FangFang", 90, 82, 87},
{10005,"ZhangSan", 95, 80, 88}};
STU n={10006,"ZhaoSi", 55, 70, 68}, ss[N];
int i,j; FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n\n");
for (j=0; j<N; j++)
{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
fun("student.dat", n);
printf("\nThe data after modifing :\n\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j=0; j<N; j++)
{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
}
fopen()
描述
C 库函数 FILE *fopen(const char *filename, const char *mode)
使用给定的模式 mode 打开 filename 所指向的文件。
声明
FILE *fopen(const char *filename, const char *mode)
- filename – 这是 C 字符串,包含了要打开的文件名称。
- mode – 这是 C 字符串,包含了文件访问模式,模式如下:
返回值
该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。
fseek()
描述
C 库函数 int fseek(FILE *stream, long int offset, int whence)
设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
声明
int fseek(FILE *stream, long int offset, int whence)
- stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
- offset – 这是相对 whence 的偏移量,以字节为单位。
- whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
返回值
如果成功,则该函数返回零,否则返回非零值。
fwrite()
描述
C 库函数 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
把 ptr 所指向的数组中的数据写入到给定流 stream 中。
声明
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数
- ptr – 这是指向要被写入的元素数组的指针。
- size – 这是要被写入的每个元素的大小,以字节为单位。
- nmemb – 这是元素的个数,每个元素的大小为 size 字节。
- stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
返回值
如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
第二题
【改错题】在此程序中,函数 Creatlink的功能是:创建带头结点的单向链表,并为各结点数据域赋0到m-1的值请改正函数 Creatlink中指定部位的错误,使它能得出正确的结果。
#include <stdio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
struct aa *next;
} NODE;
NODE *Creatlink(int n, int m)
{ NODE *h=NULL, *p, *s;
int i;
/**********found***********/
p=(NODE * )malloc(sizeof(NODE)); // p=(NODE )malloc(sizeof(NODE));
h=p;
p->next=NULL;
for(i=1; i<=n; i++)
{ s=(NODE *)malloc(sizeof(NODE));
s->data=rand()%m; s->next=p->next;
p->next=s; p=p->next;
}
/**********found***********/
return h; // return p;
}
void outlink(NODE *h)
{ NODE *p;
p=h->next;
printf("\n\nTHE LIST :\n\n HEAD ");
while(p)
{ printf("->%d ",p->data);
p=p->next;
}
printf("\n");
}
void main()
{ NODE *head;
head=Creatlink(8,22);
outlink(head);
}
第三题
【编程题】在此程序中,编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。请勿改动main函数和其他函数中的任何内容,仅在函数fn的花括号中填入所编写的若干语句
#include<string.h>
#include<stdio.h>
#define N 80
int fun(char *s)
{
int i,j=0;
for(i=0;s[i]!='\0';i++)
if(s[i]!=' '&&(s[i+1]==' '||s[i+1]=='\0')) /*如果一个字母的下一个字符为空格或者结束标记,则表示一个单词结束*/
j++;
return j; /*返回单词个数*/
}
void main()
{
FILE *wf;
char line[N];
int num=0;
printf("Enter a string:\n ");
gets(line);
num=fun(line);
printf("The number of word is:%d\n\n ",num);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%d",fun("a big car"));
fclose(wf);
/*****************************/
}
第二套
第一题
【填空题】在此程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值规定所有数均为正数),作为函数值返回,并将大于平均值的数放在形参y所指数组中,在主函数中输出例如,有10个正数:46、30、32、40、6、17、45、15、48、26,其平均值为30.500000主函数中输出:46 32 40 45 48。
#include <stdlib.h>
#include <stdio.h>
#define N 10
double fun(double x[],double *y)
{ int i,j; double av;
/**********found**********/
av=0.0; // av=__1__;
/**********found**********/
for(i=0; i<N; i++)
av=av+x[i]/N; // av=av+__2__;
for(i=j=0; i<N; i++)
/**********found**********/
if(x[i]>av) y[j++]= x[i]; // if(x[i]>av) y[__3__]= x[i];
y[j]=-1;
return av;
}
void main()
{ int i; double x[N],y[N];
for(i=0; i<N; i++){ x[i]=rand()%50; printf("%4.0f ",x[i]);}
printf("\n");
printf("\nThe average is: %f\n",fun(x,y));
for(i=0; y[i]>=0; i++) printf("%5.1f ",y[i]);
printf("\n");
}
第二题
【改错题】
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
/*************found**************/
double fun (int m) // fun (int m)
{ double y=0, d;
int i;
/*************found**************/
for(i=100;i<=m;i+=100) // for(i=100,i<=m,i+=100)
{d=(double)i*(double)i;
y+=1.0/d;
}
return(y);
}
void main()
{ int n=2000;
system("CLS");
printf("\nThe result is %1f\n",fun(n));
}
第三题
【编程题】在此程序中,已知学生的记录由学号和学习成绩构成,N名学生的数据己存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(規定只有一个最低分)。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define N 10
typedef struct ss
{ char num[10];
int s;
} STU;
void fun(STU a[], STU *s)
{
int i;
*s=a[0]; /*先认为第1个值最小*/
for(i=0;i<N;i++) /*如果在循环的过程中再发现比第1个值更小的则赋给*s*/
if(s->s>a[i].s)
*s=a[i];
}
void main()
{
FILE *wf;
STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77},
{ "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;
int i;
system("CLS");
printf("*****The original data*****\n");
for(i=0;i<N;i++)
printf("No=%s Mark=%d\n", a[i].num,a[i].s);
fun(a,&m);
printf("*****THE RESULT*****\n");
printf("The lowest :%s, %d\n",m.num,m.s);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%s, %d",m.num,m.s);
fclose(wf);
/*****************************/
}