1、程序功能:已知一个数据文件a.txt中保存了若干个学生的计算机等级考试成绩,包括学号、姓名和成绩。请编程读出显示文件内容并分类统计各等级人数,最后显示统计结果。
成绩等级规则:大于等于90-A,大于等于80-B,大于等于70-C,大于等于60-D,60以下-E。
301101 张文 95
301102 陈五 85
301103 程明 75
301104 李文 45
301105 张三 65
/*功能:编程显示数据文件a.txt的文件内容,并分类统计各等级人数,最后显示统计结果。*/
/*提示:除在指定位置添加语句之外,请不要改动程序中的其他内容。 */
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp; /* 文件指针 */
int a=0,b=0,c=0,d=0,e=0; /* 等级人数计数器,初值为0 */
long num;
char name[20];
int score;
/* 以读方式打开文件 */
if((fp = fopen("a.txt", "r")) == NULL)
{
printf("Can't Open File!");
exit(0);
}
/*在两条星线间填入代码, 读出显示文件内容并分类统计各等级人数*/
/************************************************************/
while(!feof(fp))
{
/*读出并显示文件当前行的内容*/
if(fscanf(fp,"%ld%s%d",&num,name,&score)==-1) break;
printf("%ld %s %d\n",num,name,score);
/*统计各等级人数*/
if(score>=90)a++;
else if(score>=80)b++;
else if(score>=70)c++;
else if(score>=60)d++;
else e++;
}
/************************************************************/
fclose(fp); /*关闭文件*/
/*输出统计结果*/
printf("\n等级A的人数:%d.",a);
printf("\n等级B的人数:%d.",b);
printf("\n等级C的人数:%d.",c);
printf("\n等级D的人数:%d.",d);
printf("\n等级E的人数:%d.\n",e);
return 0;
}
2、程序功能:已知文件 a.txt 存储若干文本数据,编程统计 a.txt 文件的行数、大写字母个数、小写字母个数、数字字符个数及其他字符的个数。
要求如下:
① 定义 countFile()函数:统计文本文件的行数、大写字母个数、小写字母个数、数字字符个数及其他字符的个数。
② 定义 main()函数:打开 a.txt 文件,调用 countFile()函数统计文本文件的行数、大写字母个数、小写字母个数、数字字符个数及其他字符的个数,输出统计结果。
abcd1234ABCD#$%^
abcd1234ABCD#$%^
abcd1234ABCD#$%^
abcd1234ABCD#$%^
abcd1234ABCD#$%^
/*程序功能:编写函数count_file,统计一个文本文件中的行数、大写字母、小写字母、 */
/* 数字字符及其他字符的个数。在主函数中打开一个文本文件,然后调用该 */
/* 函数返回统计结果,最后输出结果。 */
/*提 示:除在指定位置添加语句之外,请不要改动程序中的其他内容。 */
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int line,letter1,letter2,digit,other; /* 统计变量计数器 */
int count_file(FILE *fp,int *letter1,int *letter2,int *digit,int *other); /*函数声明*/
/*以读方式打开文件*/
if((fp = fopen("a.txt", "r")) == NULL)
{
printf("Can't Open File!");
exit(0);
}
/*调用count_file函数返回分类统计结果*/
line=count_file(fp,&letter1,&letter2,&digit,&other);
fclose(fp); /*关闭文件*/
/*输出统计结果*/
printf("\n文件中的行数:%d.\n",line);
printf("文件中的大写字母个数:%d.\n",letter1);
printf("文件中的小写字母个数:%d.\n",letter2);
printf("文件中的数字个数:%d.\n",digit);
printf("文件中的其他字符个数:%d.\n",other);
return 0;
}
/*功 能:分类统计文本文件:行数、大写字母数、小写字母数、数字个数及其他字符个数。 */
/*参 数:fp—文件指针; letter1、letter2、digit、other—各计数器指针变量 */
/*返回值:返回行数 */
int count_file(FILE *fp,int *letter1,int *letter2,int *digit,int *other)
{
int line;
char ch;
/* 计数器变量初始化为0 */
line=0,*letter1=0,*letter2=0,*digit=0,*other=0;
/* 读取文件并分类统计 */
while(!feof(fp))
{
/* 读取一个字符 */
if((ch=fgetc(fp))==EOF) break;
/*分类统计*/
if(ch=='\n')line++;
else if(ch>='A' && ch<='Z')*letter1=*letter1+1;
else if(ch>='a' && ch<='z')*letter2=*letter2+1;
else if(ch>='0' && ch<='9')*digit=*digit+1;
else *other=*other+1;
}
return line+1; /*返回行数*/
}
3、程序功能:编写一个程序,比较两个文本文件a1.txt和a2.txt的内容是否相同,若相同则输出“YES”,否则输出“NO”,并输出两个文件内容首次不同的行号和字符位置。
abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789(&^%$#><?)0123456789(&^%$#><?)12
abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789(&^%$#><?)0123456789(&^%$#><?)
/*功能:比较两个文本文件的内容是否相同,若相同则输出"YES",否则输出"NO",并输出两个文件内容首次不同的 */
/* 行号和字符位置。 */
/*要求:编写compareFile函数,比较两个文件内容是否相同,相同返回 0;不同返回1,并给出首次不同的行列位置。*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp1,*fp2;
int row=1,col=1,flag; /* flag:标记文件是否相同,相同flag=0,不同flag=1 */
int compareFile(FILE *fp1,FILE *fp2,int *prow,int *pcol); /* 函数声明 */
/* 打开两个文本文件a1和a2 */
if((fp1 = fopen("a1.txt", "r")) == NULL || (fp2 = fopen("a2.txt", "r")) == NULL)
{
printf("Can't Open File!");
exit(0);
}
/* 调用compareFile函数,返回比较结果 */
flag=compareFile(fp1,fp2,&row,&col);
/*输出统计结果:flag=1表示不同,flag=0表示相同*/
if(flag==1)printf("不同,首次出现不同的行号=%d,列号=%d.\n",row,col);
else printf("YES.\n");
/*关闭文件*/
fclose(fp1);
fclose(fp2);
return 0;
}
/*功 能:比较两个文件内容是否相同,相同返回 0;不同返回1,并给出首次不同的行列位置。*/
/*参 数:fp1、fp2—文件指针; prow、pcol—不同行列位置的指针变量 */
/*返回值:返回比较结果 */
int compareFile(FILE *fp1,FILE *fp2,int *prow,int *pcol)
{
char ch1,ch2;
int flag=0; /* 设置比较结果标志变量初值为0 */
/*逐个字符比较两个文件内容,判定是否相同*/
while(!feof(fp1) && !feof(fp2))
{
ch1=fgetc(fp1);
ch2=fgetc(fp2);
if(ch1!=ch2){ flag=1; break; } /*不同: 置flag=1并跳出循环*/
else if(ch1=='\n' && ch2=='\n'){ (*prow)++; (*pcol)=1; continue; } /*相同并结束一行 */
else (*pcol)++; /*相同未结束一行 */
}
return flag; /* 返回比较结果 */
}
4、程序功能:从键盘输入若干个学生数据(包括学号、姓名和成绩)保存到文本文件 a.txt 中(以负数成绩表示输入结束),然后再从该文件中读出并显示。
1 A 100
2 B 90
/*程序功能:从键盘输入若干个学生的计算机等级考试成绩(包括:学号、姓名和成绩)并保存到文本 */
/* 文件a.txt中(以负数表示输入结束),然后再从该文件中读出并显示到屏幕。 */
/*提 示:除在指定位置添加语句之外,请不要改动程序中的其他内容。 */
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp; /* 文件指针fp */
long num;
char name[20];
int score;
/*以写方式打开文件*/
if((fp = fopen("a.txt", "w")) == NULL){
printf("Can't Open File!");
exit(0);
}
/*输入第一个成绩数据*/
printf("输入若干包括学号、姓名和成绩(以负数结束):\n");
scanf("%ld%s%d",&num,name,&score);
/*在两条星线间填入代码, 从键盘继续输入若干成绩并保存到文件中*/
/************************************************************/
while(score>=0)
{
fprintf(fp,"%ld%c%s%c%d%c",num,' ',name,' ',score,'\n');
scanf("%ld%s%d",&num,name,&score);
}
/************************************************************/
fclose(fp); /*关闭文件*/
/*以读方式打开文件*/
if((fp = fopen("a.txt", "r")) == NULL)
{
printf("Can't Open File!");
exit(0);
}
/*输出文件内容*/
printf("输出文件内容如下:\n");
fscanf(fp,"%ld%s%d",&num,name,&score); /*读第一条数据*/
//在两条星线间填入代码, 读出文件内容并显示到屏幕 */
/**********************************************************/
while(!feof(fp))
{
printf("%ld %s %d\n",num,name,score); /*显示一条数据*/
fscanf(fp,"%ld%s%d",&num,name,&score); /*读下一条数据*/
}
/**********************************************************/
fclose(fp); /*关闭文件*/
return 0;
}
5、程序功能:从键盘输入10个英文单词到二维字符数组a并保存到文本文件a.txt中(单词间以空格分隔),然后再从该文件中读出所有单词并显示到屏幕。
/*程序功能:从键盘输入10个英文单词到二维字符数组a并保存到文本文件a.txt中(单词间以空格分隔)*/
/* 然后再从该文件中读出所有单词并显示到屏幕。 */
/*提 示:除在指定位置添加语句之外,请不要改动程序中的其他内容。 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
int main()
{
FILE *fp;
char a[N][80],strout[80];
int i;
/*以写方式打开文件*/
if((fp = fopen("a.txt", "w")) == NULL)
{
printf("Can't Open File!");
exit(0);
}
printf("请输入%d个以空格分隔的单词:\n",N);
/*在两条星线间填入代码, 从键盘输入10个以空格分隔的单词到数组*/
/*并保存到文件中 */
/************************************************************/
for(i=0;i<N;i++)
{
scanf("%s",a[i]);
fputs(a[i],fp);
}
/************************************************************/
fclose(fp); /*关闭文件*/
/*以读方式打开文件*/
if((fp = fopen("a.txt", "r")) == NULL){
printf("Can't Open File!");
exit(0);
}
printf("显示文件中的单词:\n");
/*在两条星线间填入代码, 读出文件内容并显示到屏幕 */
/************************************************************/
i=0;
fgets(strout,strlen(a[i++])+1,fp); /*读第一个单词*/
while(!feof(fp))
{
puts(strout); /*显示一个单词*/
fgets(strout,strlen(a[i++])+1,fp); /*读下一个单词*/
}
/************************************************************/
fclose(fp); /*关闭文件*/
return 0;
}
6、程序功能:从键盘输入若干个学生数据(包括学号、姓名和成绩)保存到二进制文件 a.dat(以负数成绩表示输入结束),然后再从该文件中读出并显示。
/*程序功能:从键盘输入若干个学生数据(包括学号、姓名和成绩)保存到二进制文件 a.dat */
/* (以负数成绩表示输入结束),然后再从该文件中读出并显示。 */
/*提 示:除在指定位置添加语句之外,请不要改动程序中的其他内容。 */
#include <stdio.h>
#include <stdlib.h>
struct Student{ /* 学生结构体 */
long num; /* 学号 */
char name[20]; /* 姓名 */
int score; /* 成绩 */
};
int main()
{
FILE *fp; /* 文件指针 */
struct Student stu; /* 结构变量 */
if((fp=fopen("a.dat","wb"))==NULL){ /* 以写方式打开文件 */
printf("Can't Open File!");
exit(0);
}
printf("输入若干包括学号、姓名和成绩(以负数成绩结束输入):\n");
/* 在两条星线间填入代码,从键盘继续输入若干成绩并保存到文件 */
/**********************************************************************/
scanf("%ld%s%d",&stu.num,stu.name,&stu.score); /* 输入第一条记录 */
while(stu.score>=0){
fwrite(&stu,sizeof(stu),1,fp); /* 写入一条记录 */
scanf("%ld%s%d",&stu.num,stu.name,&stu.score); /* 输入下一条记录 */
}
/**********************************************************************/
fclose(fp); /* 关闭文件 */
if((fp=fopen("a.dat","rb"))==NULL){ /* 以读方式打开文件 */
printf("Can't Open File!");
exit(0);
}
printf("输出文件内容如下:\n");
/* 在两条星线间填入代码,读出文件内容并显示到屏幕 */
/**********************************************************************/
fread(&stu,sizeof(stu),1,fp); /* 读取第一记录 */
while(!feof(fp)){
printf("%ld %s %d\n",stu.num,stu.name,stu.score); /* 输出一条记录 */
fread(&stu,sizeof(stu),1,fp); /* 读取下一记录 */
}
/**********************************************************************/
fclose(fp); /* 关闭文件 */
return 0;
}
7、程序功能:两个非空二进制文件 a1.dat 和 a2.dat,分别保存若干学生数据(包括学号、姓名和成绩),且按成绩升序排列。编写程序,把 a1.dat 和 a2.dat 两个文件归并到 a3.dat 文件,使得 a3.dat 文件中的学生数据也按成绩升序排列。
要求如下:
① 定义 mergeFile()函数:将两个二进制文件归并成一个按成绩升序排列的新文件。
② 定义 main()函数:先打开二进制文件 a1.dat、a2.dat、a3.dat,再调用 mergeFile()函数将 a1.dat、a2.dat 两个文件归并到按成绩升序排列的 a3.dat 文件,最后输出 a3.dat 文件内容。
/*程序功能:两个非空文件a1.dat 和a2.dat中包含若干升序排列的整数,编写一个程序,把a1.dat和 */
/* a2.dat两个文件中的数据合并到a3.dat文件,使得a3.dat中的数据也按升序排列。 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student{ /* 学生结构体 */
long num; /* 学号 */
char name[20]; /* 姓名 */
int score; /* 成绩 */
};
int main()
{
FILE *fp1,*fp2,*fp3;
struct Student stu; /* 结构变量 */
void inputData(); /* 函数声明:输入数据函数 */
void mergeFile(FILE *fp1,FILE *fp2,FILE *fp3); /* 函数声明:归并文件函数 */
void display(); /* 函数声明:显示文件函数 */
inputData(); /* 调用inputData函数,输入学生数据 */
/*以读方式打开a1.dat文件*/
if((fp1=fopen("a1.dat","rb"))==NULL){
printf("Can't Open a1.dat File!");
exit(0);
}
/*以读方式打开a2.dat文件*/
if((fp2=fopen("a2.dat","rb"))==NULL){
printf("Can't Open a1.dat File!");
exit(0);
}
/*以写方式打开a3.dat文件*/
if((fp3=fopen("a3.dat","wb"))==NULL){
printf("Can't Open a3.dat File!");
exit(0);
}
mergeFile(fp1,fp2,fp3); /* 调用mergeFile函数,归并文件 */
display(); /* 调用display函数,显示文件内容 */
return 0;
}
/*功 能:在两个文件中依次输入一批按成绩升序的学生数据。*/
/*参 数:无 */
/*返回值:无 */
void inputData()
{
int i;
char fileName[20],str[2];
FILE *fp;
struct Student stu;
/*输入两个文件内容*/
for(i=1;i<=2;i++){
itoa(i,str,10);
strcpy(fileName,"a");
strcat(strcat(fileName,str),".dat");
if((fp=fopen(fileName,"wb"))==NULL) {
printf("Can't Open File!");
exit(0);
}
printf("在a%d.dat文件中输入一批按成绩升序的学生数据:\n",i);
printf("请依次输入学号、姓名和成绩(以负数成绩结束输入):\n");
scanf("%ld%s%d",&stu.num,stu.name,&stu.score); /* 输入第一条记录 */
while(stu.score>=0){
fwrite(&stu,sizeof(stu),1,fp); /* 写入一条记录 */
scanf("%ld%s%d",&stu.num,stu.name,&stu.score); /* 输入下一条记录 */
}
fclose(fp); /* 关闭文件 */
}
}
/*功 能:依次输出三个文件中的学生数据。*/
/*参 数:无 */
/*返回值:无 */
void display()
{
int i;
char fileName[20],str[2];
FILE *fp;
struct Student stu;
/*输出三个文件内容*/
for(i=1;i<=3;i++){
itoa(i,str,10);
strcpy(fileName,"a");
strcat(strcat(fileName,str),".dat");
if((fp=fopen(fileName,"rb"))==NULL){
printf("Can't Open File!");
exit(0);
}
printf("\na%d.dat文件内容:\n",i);
fread(&stu,sizeof(stu),1,fp); /* 读取第一记录 */
while(!feof(fp)){
printf("%-4ld %-4s %-4d\n",stu.num,stu.name,stu.score); /* 输出一条记录 */
fread(&stu,sizeof(stu),1,fp); /* 读取下一记录 */
}
fclose(fp); /* 关闭文件 */
}
}
/*功 能:按成绩升序归并fp1和fp2两个文件生成fp3文件,使得第fp3文件有序。*/
/*参 数:fp1、fp2、fp3—文件指针 */
/*返回值:无 */
void mergeFile(FILE *fp1,FILE *fp2,FILE *fp3)
{
struct Student stud,stu1,stu2;
/*读取两个文件中第1条数据*/
fread(&stu1,sizeof(stud),1,fp1);
fread(&stu2,sizeof(stud),1,fp2);
/*归并fp1和fp2两个文件中的数据到fp3文件,使fp3文件有序 */
while(!feof(fp1) && !feof(fp2)) /*fp1和fp2都没结束*/
{
if(stu1.score<stu2.score){
fwrite(&stu1,sizeof(stud),1,fp3); /* 写入stu1中记录 */;
fread(&stu1,sizeof(stud),1,fp1); /* 读取fp1下条记录 */
}
else{
fwrite(&stu2,sizeof(stud),1,fp3); /* 写入stu2中记录 */;
fread(&stu2,sizeof(stud),1,fp2); /* 读取fp2下条记录 */
}
}
if(feof(fp1)){
fwrite(&stu2,sizeof(stud),1,fp3); /* 写入stu2中记录 */
fread(&stu2,sizeof(stud),1,fp2); /* 读取fp2下条记录 */
while(!feof(fp2)){
fwrite(&stu2,sizeof(stud),1,fp3); /* 写入stu2中记录 */
fread(&stu2,sizeof(stud),1,fp2); /* 读取fp2下条记录 */
}
}
else{
fwrite(&stu1,sizeof(stud),1,fp3); /* 写入stu2中记录 */
fread(&stu1,sizeof(stud),1,fp1); /* 读取fp1下条记录 */
while(!feof(fp1)){
fwrite(&stu1,sizeof(stud),1,fp3); /* 写入stu2中记录 */
fread(&stu1,sizeof(stud),1,fp1); /* 读取fp1下条记录 */
}
}
/*关闭打开的三个文件*/
fclose(fp1);
fclose(fp2);
fclose(fp3);
}