函数ReadDat( )的功能是实现从文件IN67.DAT中读取一篇英文文章并存入到字符串数组xx中。请编制函数StrOL( ),该函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数WriteDat( )把结果xx输出到文件OUT67.DAT中。
注意:部分源程序已给出。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
[试题程序]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
#include <ctype.h>
char xx[50][80];
int maxline = 0;/* 文章的总行数 * /
int ReadDat(void);
void WriteDat(void);
void StrOL(void)
void main( )
system("CLS");
if (ReadDat ( ))
printf("数据文件IN67.DAT不能打开! /n/007");
return;
StrOL( );
WriteDat( );
int ReadDat(void)
FILE * fp;
int i = 0;
char * p;
if((fp = fopen("IN67.DAT", "r")) = = NULL) return 1;
while( fgets (xx [i], 80, fp) ! = NULL)
p = strchr(xx [i],’/n’);
if(p) *p = 0;
i + +;
maxline = i;
fclose(fp);
return 0;
void WriteDat(void)
FILE * fp;
int i;
system("CLS");
fp = fopen("OUT67.DAT", "w");
for(i = 0; i < maxline; i + +)
printf("% s /n", xx[i]);
fprintf(fp, "% s /n", xx[i]
fclose(fp) ;
void StrOL(void)
{
int i,j,k; /*定义数组下标变量*/
char t[H0],tA[H0]; /*定义数组暂存取得的单词*/
for(i=0;i<maxline;i + +] /*逐行获取字符串数据*/
{
j=k=strlen(xx[i])-i; /*将每行末尾字符的下标保存在j和k中*/
t[0] =tA[0] =’/0’; /*初始化两个字符数组*/
while(A) /*无条件循环,循环体内有结束循环的语句*/
{
while(isalpha(xx[i][j] = =O&&j >=0) /*若以j为下标的字符不是字母并且还在数组xx之内*/
k = - -j;
while(isalpha(xx[i][j])&&j >=0) /*若以j为下标的字符是字母并且还在数组xx之内*/
j - -; /*当退出这个循环时,xx[i][j+A]和xx[i][k]分别是同一个单词的第一个和最后一个字母*/
memcpy(tA,&xx[i][j+A],k-j); /*将该单词保存到字符数组tA中*/
tA[k-j] =’/0’; /*为tA中的单词添加字符串结束标志*/
strcat(t,tA); /*将单词保存到数组t中*/
strcat(t," "); /*单词之间用空格分隔*/
if(j<0) /*如果以j为下标的字符不在数组xx中*/
break; /*则退出外层while循环*/
}
strcpy(xx[i],t); /*按行将处理完的字符串重新保存到数组xx中*/
}
}
编写一个函数findStr( ),该函数统计一个长度为2的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",函数返回值是6。
函数ReadWrite( )的功能是实现从文件in68.dat中读取两个字符串,并调用函数findStr( ),最后把结果输出到文件out68.dat中。
注意:部分源程序已给出。
请勿改动主函数main( )和其他函数中的任何内容,仅在函数findStr( )的花括号中填入你所编写的若干语句。
[试题程序]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void ReadWrite( );
int findStr(char * str,char * substr)
void main( )
char str[81],substr[3];
int n;
system("CLS");
printf("输入原字符串:");
gets(str);
printf("输入子字符串:");
gets(substr);
puts(str);
puts(substr);
n=findStr(str,substr);
printf("n=% d/n",n);
ReadWrite( );
void meadWrite( )
char ch,str[81],substr[3];
int n,len,i=0;
FILE * rf, * wf;
rf=fopen("in68.dat","r");
wf=fopen("out68.dat","w");
while(i<5)
fgets(str,80,rf);
fgets(substr,10,rf);
len=strlen(substr)-i;
ch=substr[len];
if(ch= =’/n’||ch= =0xla)
substr[len]=0;
n=findStr(str,substr);
fprintf(wf,"% d/n",n);
i + +;
fclose(rf);
fclose(wf);
int findStr(char * str,char * substr)
{
int n=0; /*定义计数器变量,统计出现次数*/
char *p, *r; /*定义指针变量来分别指向两个字符串*/
while(* str) /*如果字符串没有结束,则一直循环下去*/
{
p=str; /*指针p指向字符串首地址*/
r=substr; /*指针r指向子字符串首地址*/
while(* r) /*若子字符串没有结束,则循环继续*/
if(* r = = * p) /*如果子字符串的第一个字符等于字符串中的该字符,则继续比较下一个字符*/
{
r+ +;
p+ +;
}
else
break; /*否则退出循环*/
if(* r = =’/0’) /*如果子字符串在字符串中出现了一次*/
n+ +; /*则n加A,进行统计*/
str+ +; /*指向字符串中的下一个字符*/
}
return n; /*返回统计结果n*/
}
在文件IN70.DAT中有200组数据,每组有3个数,每个数均是3位数。函数readDat( )的功能是读取这200组数据并存放到结构数组aa中。请编制函数jsSort( ),其函数的功能是:要求在200组数据中找出条件为每组数据中的第二个数大于第一个数加第三个数之和,其中满足条件的个数作为函数jsSort( )的返回值,同时把满足条件的数据存入结构数组bb中,再对结构数组bb中的数据按照每组数据的第二个数加第三个数之和的大小进行降序排列,排序后的结果仍重新存入结构数组bb中,最后调用函数writeDat( )把结果bb输出到文件OUT70.DAT中。
注意:部分源程序已给出。
请勿改动主函数main( )、读函数readDat( )和写函数writeDat( )的内容。
试题程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
int x1,x2,x3;
Data;
Data aa[200],bb[200];
void readDat( );
void writeDat( );
int jsSort( )
void main( )
int count;
readDat( );
count=jsSort( );/*返回满足条件的个数*/
writeDat(count);
void readDat( )
FILE * in;
int i;
in=fopen("IN70.DAT","r");
for(i=0;i<200;i + +)
fscanf(in,"% d % d % d",&aa[i].x1,&aa[i].x2,&aa[i].x3);
fclose(in);
void writeDat(int count)
FILE * out;
int i;
out=fopen("OUT70.DAT","w");
system("CLS");
for(i=0;i<count;i + +)
printf("% d,% d,% d 第二个数+第三个数=% d/n",bb[i].x1,bb[i].x2,bb[i].x3,bb[i].x2+bb[i].x3);
fprintf(out,"% d,% 5d,% d/n",bb[i].x1,bb[i].x2,bb[i].x3);
fclose(out);
int jsSort()
{
int i,j; /*定义循环控制变量*/
int cnt=0; /*定义计数器变量*/
Data temp; /*定义数据交换时的暂存变量,这里是一个Data类型的结构体变量*/
for(i=0;i<200;i + +)
if(aa[i].x2>aa[i].x1+aa[i].x3) /*如果第二个数大于第一个数加第三个数之和*/
{
bb[cnt]=aa[i]; /*则把该组数据存入结构数组bb中*/
cnt + +; /*同时统计满足条件的数据的个数*/
}
for(i=0;i<cnt-1;i + +) /*对结构数组bb中的数据按照每组数据的第二个数加第三个数之和的大小进行降序排列*/
for(j=i+1;j<cnt;j + +)
if(bb[i].x2+bb[i].x3<bb[j].x2+bb[j].x3
{
temp=bb[i];
bb[i]=bb[j];
bb[j]=temp;
}
teturn cnt; /*返回满足条件的数据的组数*/
}
下列程序的功能是:将一正整数序列K1,K2,…,K9重新排成一个新的序列。新序列中,比K1小的数都在K1的左面(后续的再向左存放),比K1大的数都在K1的右面(后续的再向右存放),从K1向右扫描。要求编写函数jsValue( )实现此功能,最后调用函数writeDat( )把新序列输出到文件out72.dat中。
说明:在程序中已给出了10个序列,每个序列中有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。
注意:部分源程序已给出。
请勿改动主函数main( )和写函数writeDat( )的内容。
试题程序:
#include <stdio.h>
void writeDat( );
void jsValue(int a[10][9])
void main( )
int a[10][9] = 6,8,9,1,2,5,4,7,3,
3,5,8,9,1,2,6,4,7,
8,2,1,9,3,5,4,6,7,
3,5,1,2,9,8,6,7,4,
4,7,8,9,1,2,5,3,6,
4,7,3,5,1,2,6,8,9,
9,1,3,5,8,6,2,4,7,
2,6,1,9,8,3,5,7,4,
5,3,7,9,1,8,2,6,4,
7,1,3,2,5,8,9,4,6,
;
int i,j;
jsValue(a);
for(i=0;i<10;i + +)
for(j=0;j<9;j + +)
printf("% d",a[i][j]);
if(j<=7)printf(",");
printf("/n");
writeDat(a);
void writeDat(int a[10][9])
FILE * fp;
int i,j;
fp=fopen("out72.dat","w");
for(i=0;i<10;i + +)
for(j=0;j<9;j + +)
fprintf(fp,"% d",a[i][j]);
if(j<=7) fprintf(fp,",");
fprintf(fp,"/n");
fclose(fp);
void jsValue(int a[10][9])
{
int i,j,k; /*定义循环控制变量*/
int num,temp; /*定义暂存变量*/
for(i=0;i<10;i + +) /*逐行取数进行处理*/
{
num=a[i][0]; /*暂存每行的第一个元素*/
for(j=0;j<9;j + +) /*取每行的所有元素*/
if(a[i][j]<num) /*若后面的数中有比第1个数据小的数*/
{
temp=a[i][j]; /*则把这个数取出,赋给temp*/
for(k=j;k>0;k - -) /*将这个数据左侧的数依次向右移动*/
a[i][k]=a[i][k-1];
a[i][0]=temp; /*再将这个数放在最左侧*/
}
}
}
在文件in71.dat中有200组数据,每组有3个数,每个数均为3位数。函数readDat( )的功能是读取这200组数据并存放到结构数组aa中。请编制函数jsSort( ),其函数的功能是:要求在200组数据中找出条件为每组数据中的第一个数大于第二个数加第三个数之和,其中满足条件的个数作为函数jsSort( )的返回值,同时把满足条件的数据存入结构数组bb中,再对bb中的数按照每组数据的第一个数加第三个数之和的大小进行升序排列(第一个数加第三个数的和均不相等),排序后的结果仍重新存入结构数组bb中。最后调用函数writeDat( )把结果bb输出到文件out71.dat中。
注意:部分源程序已给出。
请勿改动主函数main( )、读函数readDat( )和写函数writeDat( )的内容。
试题程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
int x1,x2,x3;
Data;
Data aa[200],bb[200];
void readDat( );
void writeDat( );
int jsSort( )
void main( )
int count;
readDat( );
count=jsSort( );
writeDat(count);
void readDat( )
FILE * in;
int i;
in=fopen("IN71.dat","r");
for(i=0;i<200;i + +)
fscanf(in,"% d % d % d",&aa[i].x1,&aa[i].x2,&aa[i].x3);
fclose(in);
void writeDat(int count)
FILE * out;
int i;
system("CLS");
out=fopen("OUT71.dat","w");
for(i=0;i<count;i + +)
printf("% d,% d,% d 第一个数+第三个数=% d/n",bb[i].x1,bb[i].x2,bb[i].x3,bb[i].x1+bb[i].x3);
fprintf(out,"% d,% 5d,% d/n",bb[i].x1,bb[i].x2,bb[i].x3);
fclose(out);
int jsSort()
{
int i,j; /*定义循环控制变量*/
int cnt=0; /*定义计数器变量,并对其初始化*/
Data temp; /*数据交换时的暂存变量,这里是一个Data类型的结构体变量*/
for(i=0;i<200;i + +)
if(aa[i].x1>aa[i].x2+aa[i].x3) /*如果每组数据中的第一个数大于第二个数加第三个数之和*/
{
bb[cnt] =aa[i]; /*把满足条件的数据存入结构体数组bb中*/
cnt + +; /*同时统计满足条件的数据的个数*/
}
for(i=0;i<cnt-1;i + +) /*对数组bb中的数据按照每组数据的第一个数加第三个数之和的大小进行升序排列*/
for(j=i+1;j<cnt;j + +)
if(bb[i].x1+bb[i].x3>bb[j].x1+bb[j].x3
{
temp=bb[i];
bb[i]=bb[j];
bb[j]=temp;
}
teturn cnt; /*返回满足条件的数据的组数*/
}
函数readDat( )的功能是从文件IN75.DAT中读取20行数据并存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort( ),该函数的功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat( )把结果xx输出到文件OUT75.DAT中。
条件:从字符串中间一分为二,左边部分按字符的ASCII值降序排序,排序后,左边部分与右边部分按例子所示进行交换。
如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。
注意:部分源程序已给出。
请勿改动主函数main( )、读函数readDat( )和写函数writeDat( )的内容。
试题程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char xx[20][80];
void readDat( );
void writeDat( );
void jsSort( )
void main( )
readDat( );
jsSort( );
writeDat( );
void readDat( )
FILE * in;
int i=0;
char * p;
in=fopen("in75.dat","r");
while(i<20 && fgets(xx[i],80,in)!=NULL)
p=strchr(xx[i],’/n’);
if(p)*p=0;
i + +;
fclose(in);
void writeDat( )
FILE * out;
int i;
system("CLS");
out=fopen("out74.dat","w");
for(i=0;i<20;i + +)
printf("% s/n",xx[i]);
fprintf(out,"% s/n",xx[i]);
fclose(out);
void jsSort()
{
int i,j,k; /*定义计数器变量*/
int str,half; /*定义存储字符串长度的变量*/
char temp; /*定义数据交换时的暂存变量*/
for(i=0;i<20;i + +) /*逐行对数据进行处理*/
{
str=strlen(xx[i]); /*求字符串的长度*/
half=str/2; /*通过变量half将字符串分为左右两部分*/
for(j=0;j<half-1;j + +) /*用选择法将左边部分按字符的ASCII值降序排序*/
for(k=j+1;k<half;k + +)
if(xx[i][j]<xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
for(j=half-1,k=str-1;j>=0;j - -,k - -) /*将左边部分和右边部分的对应字符交换*/
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
}
}
函数ReadDat( )的功能是实现从文件IN73.DAT中读取一篇英文文章并存入到字符串数组xx中。请编制函数SortCharA( ),该函数的功能是:以行为单位对字符按从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中。最后调用函数WriteDat( )把结果xx输出到文件OUT73.DAT中。
注意:部分源程序已给出。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
请勿改动主函数main( )、读函数ReadDat( )和写函数WriteDat( )的内容。
试题程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char xx[50][80];
int maxline=0;
int ReadDat(void);
void WriteDat(void);
void SortCharA( )
void main( )
system("CLS");
if(ReadDat( ));
printf("数据文件IN73.DAT不能打开! /n/007");
return;
SortCharA( );
WriteDat( );
int ReadDat(void);
FILE * fp;
int i=0;
char * p;
if((fp=fopen("IN73.DAT","r"))==NULL)
return1;
while(fgets(xx[1],80,fp)!=NULL)
p=strchr(xx[i],’/n’);
if(p) * p=0;
i + +;
maxline=i;
fclose(fp);
return 0;
void WriteDat( )
FILE * fp;
int i
system("CLS");
fp=fopen("IN73.DAT","w");
for(i=0,i<maxline;i + +)
printf("% s/n",xx[i]);
fprintf(fp,"% s/n",xx[i]);
fclose(fp);
void SortCharA()
{
int i,j,k; /*定义循环控制变量*/
int str; /*存储字符串的长度*/
char temp; /*数据交换时的暂存变量*/
for(i=0;i<maxline;i + +) /*以行为单位获取字符*/
{
str=strlen(xx[i]); /*求得当前行的字符串长度*/
for(j=0;j<str-1;j + +) /*对字符按从小到大的顺序进行排序*/
for(k=j+1;k<str;k + +)
if(xx[i][j]>xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
}
}
函数readDat( )的功能是从文件in74.dat中读取20行数据存放到字符串数组xx中(每行字符串的长度均小于80)。请编制函数jsSort( ),该函数的功能是:以行为单位对字符串变量的下标为奇数位置上的字符按其ASCII值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat( )把结果xx输出到文件out74.dat中。
注意:部分源程序已给出。
请勿改动主函数main( )、读函数readDat( )和写函数writeDat( )的内容。
试题程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char xx[20][80];
void readDat( );
void writeDat( );
void jsSort( )
void main( )
readDat( );
jsSort( );
writeDat( );
void readDat( )
FILE * in;
int i=0;
char * p;
in=fopen("in74.dat","r");
while(i<20 && fgets(xx[i],80,in)!=NULL)
p=strchr(xx[i],’/n’);
if(p)*p=0;
i + +;
fclose(in);
void writeDat( )
FILE * out;
int i;
out=fopen("out74.dat","w");
system("CLS");
for(i=0;i<20;i + +)
printf("% s/n",xx[i]);
fprintf(out,"% s/n",xx[i]);
fclose(out);
void jsSort()
{
int i,j,k; /*定义循环控制变量*/
int str; /*定义存储字符串长度的变量*/
char temp; /*定义数据交换时的暂存变量*/
for(i=0;i<20;i + +) /*逐行对数据进行处理*/
{
str=strlen(xx[i]); /*求各行字符串的长度*/
for(j=1;j<str-2;j=j+2) /*将下标为奇数的字符按其ASCII值从小到大的顺序进行排序*/
for(k=j+2;k<str;k=k+2)
if(xx[i][j]>xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
}
}
读函数readDat( )的功能是从文件IN76.DAT中读取20行数据并存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort( ),该函数的功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用写函数writeDat( )把结果xx输出到文件OUT76.DAT中。
条件:从字符串中间一分为二,左边部分按字符的ASCII值升序排序,排序后,左边部分与右边部分按例子所示进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。
注意:部分源程序已给出。
请勿改动主函数main( )、读函数readDat( )和写函数writeDat( )的内容。
试题程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char xx[20][80];
void readDat( );
void writeDat( );
void jsSort( )
void main( )
readDat( );
jsSort( );
writeDat( );
void readDat( )
FILE * in;
int i=0;
char * p;
in=fopen("in76.dat","r");
while(i<20 && fgets(xx[i],80,in)!=NULL)
p=strchr(xx[i],’/n’);
if(p)*p=0;
i + +;
fclose(in);
void writeDat( )
FILE * out;
int i;
system("CLS");
out=fopen("out76.dat","w");
for(i=0;i<20;i + +)
printf("% s/n",xx[i]);
fprintf(out,"% s/n",xx[i]);
fclose(out);
void jsSort()
{
int i,j,k; /*定义计数器变量*/
int str,half; /*定义存储字符串长度的变量*/
char temp; /*定义数据交换时的暂存变量*/
for(i=0;i<20;i + +) /*逐行对数据进行处理*/
{
str=strlen(xx[i]); /*求字符串的长度*/
half=str/2; /*确定各行中字符串的中间位置*/
for(j=0;j<half-1;j + +) /*对中间位置以前的字符进行升序排序*/
for(k=j+1;k<half;k + +)
if(xx[i][j]>xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
for(j=half-1,k=str-1;j>=0;j - -,k - -) /*将左边部分与右边部分的对应的字符交换*/
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
}
}
函数readDat( )是从文件in77.dat中读取20行数据并存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort( ),其功能是:以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中。最后调用函数writeDat( )把结果xx输出到文件out77.dat中。
条件:从字符串中间一分为二,左边部分按字符的ASCII值降序排序,右边部分按字符的ASCII值升序排序。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上。
注意:部分源程序已给出。
请勿改动主函数main( )、读函数readDat( )和写函数writeDat( )的内容。
试题程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char xx[20][80];
void readDat( );
void writeDat( );
void jsSort( )
void main( )
readDat( );
jsSort( );
writeDat( );
void readDat( )
FILE * in;
int i=0;
char * p;
in=fopen("in77.dat","r");
while(i<20 && fgets(xx[i],80,in)!=NULL)
p=strchr(xx[i],’/n’);
if(p)
*p=0;
i + +;
fclose(in);
void writeDat( )
FILE * out;
int i;
system("CLS");
out=fopen("out77.dat","w");
for(i=0;i<20;i + +)
printf("% s/n",xx[i]);
fprintf(out,"% s/n",xx[i]);
fclose(out);
void jsSort()
{
int i,j,k; /*定义循环控制变量*/
int str,half; /*定义存储字符串长度的变量*/
char temp; /*定义数据交换时的暂存变量*/
for(i=0;i<20;i + +) /*逐行对数据进行处理*/
{
str=strlen(xx[i]); /*求各行字符串的总长度*/
half=str/2; /*求总长度的一般*/
for(j=0;j<half-1;j + +) /*左边部分按字符的ASCII值降序排序*/
for(k=j+1;k<half;k + +)
if(xx[i][j]<xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
if(str% 2==1) /*如果原字符串长度为奇数,则跳过最中间的字符,使之不参加排序*/
half + +;
for(j=half,j<str-1;j + +) /*右边部分按字符的ASCII值升序排序*/
for(k=j+1,k<str;k + +)
if(xx[i][j]>xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
}
}