程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n: 0,2 Data Structure Operating System Computer Graphics Software Engineering C语言40学时
#include "stdio.h" void main( ) {int i,m,n; FILE *fp; char *buf[4]={"Data Structure","Operating System“,"Conmputer Graphics","Software Engineering"}; if((fp=fopen("file10","w"))==NULL) {printf("Can't open %s\n","myfile"); return;} else {printf("please enter m,n:\n"); scanf("%d,%d",&m,&n); for(i=m;i<=n;i++) {fputs(buf[i],fp); /*输出到文件中*/ putc('\n',fp); puts(buf[i]);} /*输出到屏幕上*/ fclose(fp);}}
查找指定的文本文件中的某个单词出现的行号及该行的内容。 要求:通过命令行输入文件名和查找的单词。 假设:源程序名为:wj6.c 第二题: 查找指定的文本文件中的某个单词出现的行号及该行的内容。 要求:通过命令行输入文件名和查找的单词。 假设:源程序名为:wj6.c 建立一个文本文件:abc.txt 子字符为:abc 命令行: wj6 abc.txt abc 可执行文件名 文本文件 子字符 C语言40学时
int str_index(char substr[ ],char str[ ] ) {int i,j,k; 文件中某字符 串首地址 #include "stdio.h“ 2-1 #include"stdlib.h" int str_index(char substr[ ],char str[ ] ) {int i,j,k; for(i=0;str[i];i++) for(j=i,k=0;str[ j ]==substr[k];j++,k++) 不成立返回 i循环 if(!substr[k+1]) 不成立返回 j 循环 return(i); 条件成立找到匹配字符串 return(-1); } void main( int argc,char *argv[ ]) {char buff[80]; FILE *fp; int lcnt; 子字符 substr[k+1] ==‘\0’ C语言40学时
{ printf("Usage:findword filename word\n"); return;} if(argc<3) 2-2 { printf("Usage:findword filename word\n"); return;} if((fp=fopen(argv[1],"r"))==NULL) {printf("不能打开%s文件\n",argv[1]); lcnt=1; while(fgets(buff,80,fp)!=NULL) {if(str_index(argv[2],buff)!=-1) printf(“%3d: %s”,lcnt,buff); 条件成立输出 lcnt++;} 条件成立与否都执行.(行号) fclose(fp);} C语言40学时
abc.txt文件中的内容: rrabcwwabc abc wjk ggabc ee576 ffgwk 运行结果:1: rrabcwwabc
第一行字符:rrabcwwabc 比较: a a abc r r abc
已知磁盘上的test1-2.c文件中以文本形式存放有10名学生的记录,每条记录由学号和一门课程成绩组成。用函数调用方式编写程序,要求实现: 第三题: 已知磁盘上的test1-2.c文件中以文本形式存放有10名学生的记录,每条记录由学号和一门课程成绩组成。用函数调用方式编写程序,要求实现: 1.在main函数中读入10名学生记录,存入结构数组s,调用fun函数,把平均成绩和分数最低的学生记录输出到屏幕上。 C语言40学时
2.被调函数fun求出10名学生的平均成绩并统计分数最低的学生记录,fun的参数是数组s的首地址和数组h的首地址,fun的返回值是分数最低的学生人数。 一个学生记录放在如下结构中: struct student {char num[10]; int s; } C语言40学时
#include"stdio.h“ 4-1 #include"stdlib.h" #define N 10 struct student {char num[10]; int s; }; float average; 全局变量 int fun(struct student *a,struct student *b) {int i,n=0,min; /*函数求最低成绩和平均成绩*/ float sum=0; min=a[0].s;
for(i=1;i<N;i++) 4-2 {if(min>a[i].s) min=a[i].s; sum+=a[i].s;} average=sum/N; for(i=0;i<N;i++) if(min==a[i].s) { b[n]=a[i]; n++; } return n;} 最低分 不止一人 C语言40学时
struct student s[N],h[N]; int i,n; FILE *fp; main( ) 4-3 { struct student s[N],h[N]; int i,n; FILE *fp; if((fp=fopen("test1-2.txt","r"))==NULL) printf("file open eorrs!\n"); exit(0); } C语言40学时
fscanf(fp,"%s%d",s[i].num,&s[i].s); fclose(fp); n=fun(s,h); for(i=0;i<N;i++) 4-4 fscanf(fp,"%s%d",s[i].num,&s[i].s); fclose(fp); n=fun(s,h); printf("The average score is :%5.2f\n",average); printf("The %d lowest score:\n",n); for(i=0;i<n;i++) printf("%s %4d\n",h[i].num,h[i].s); } C语言40学时
第四题: 磁盘上有一数据文件test2-2.dat,文件中的数据依次由:准考证号、笔试成绩、上机成绩三项组成,中间由空格分开。编程统计及格(笔试成绩和上机成绩均大于等于60分的为及格)的考生人数,以及及格率(即及格考生在总人数中占的百分比),并将及格率输出到屏幕上的同时写入文件test2-2.out中。 Type test2-2.dat 60 70 50 30 90 60 …… C语言40学时
if((in=fopen("test2-2.dat","r"))==NULL) {printf("file open error!\n"); #include "stdio.h“ 3-1 #include "stdlib.h" void main( ) {FILE *in,*out; char c1[20]; int cj1,cj2; int n=0,m=0; if((in=fopen("test2-2.dat","r"))==NULL) {printf("file open error!\n"); exit(0); } C语言40学时
out=fopen("test2-2.out","w"); 3-2 while(!feof(in)) {fscanf(in,"%s%d%d",c1,&cj1,&cj2); if(cj1>=60&&cj2>=60) { printf("%s %4d %4d\n",c1,cj1,cj2); fprintf(out,"%s %4d %4d\n",c1,cj1,cj2); n++; /*都及格人数*/ } m++; /*总人数*/ C语言40学时
printf("The total:%d\n",m); printf("The pass number:%d\n",n); fclose(in); 3-3 printf("The total:%d\n",m); printf("The pass number:%d\n",n); printf("The pass rate:%.2f%%",(float)n/m*100); fprintf(out,"The total:%d\n",m); fprintf(out,"The pass number:%d\n",n); fprintf(out,"The rate:%.2f%%",(float)n/m*100); fclose(out); } C语言40学时
第五题 计算并输出M以内最大的10个素数之和。 void main( ) 2-1 { int M; printf("Enter M:\n"); scanf("%d\n",fun(M)); } C语言40学时
while(M>=2 && n<10) { yes=1; for(j=2;j<=M/2;j++) if(M%j==0) int fun(int M) 2-2 { int sum=0,n=0,j,yes; while(M>=2 && n<10) { yes=1; for(j=2;j<=M/2;j++) if(M%j==0) {yes=0; break;} if(yes) {sum+=M; n++;} M--;} return sum;} C语言40学时
第六题: 指向字符数组的指针,将字符串变为大写并反序输出。 #include "stdio.h" void main( ) {char str[ ]="abcdefg"; char *p=str; while(*p!='\0') p++; printf("反序显示字符串为:"); while(p>str) {p--; if('a'<=*p&&*p<='z') *p=*p-32; printf("%c",*p);}} C语言40学时
第七题: #include "stdio.h" #include "string.h" void main( ) 将已按升序排好的两个字符串a和b中的字符按升序归并到字符串c中。即字符串c为: Abcdefghijklmnpq 2-1 程序: #include "stdio.h" #include "string.h" void main( ) {char a[ ]="acegikm"; char b[ ]="bdfhjlnpq"; char c[80],*p; int i=0,j=0,k=0; C语言40学时
while(a[i]!='\0'&&b[j]!='\0') 2-2 {if(a[i]<b[j]) c[k]=a[i++]; else c[k]=b[ j++]; k++; } if(a[i]=='\0') p=b+j; else p=a+i; strcat(c,p); 粘接 puts(c); C语言40学时