计算机等级考试最新上机考试南开一百题版(完整解析版)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南开一百题2012版(完整解析版)
1、下列程序的功能是:将大于整数m且紧靠m的k个素数存入数组xx。

请编写函数num(int m,int k,int xx[])实现函数的要求,最后调用函数readwriteDAT()把结果输出到文件out.dat中。

例如:若输入17,5,则应输出:19,23,29,31,37。

#include <conio.h>
#include <stdio.h>
void readwriteDAT() ;
int isP(int m)
{ int i ;
for(i = 2 ; i < m ; i++)
if(m % i == 0) return 0 ; return 1 ;
}
1:void num(int m,int k,int xx[])
{int data=m+1;
int half,n=0,I;
while(1)
{half=data/2;
for(I=2;I<=half;I++)
if(data%I==0)break;
if(I>half)
{xx[n]=data;n++;}
if(n>=k)break;
data++;
} }
或者:
void num(int m,int k,int xx[]) {int i,j,s=0;
for(i=m+1;k>0;i++)
{for(j=2;j<i;j++)
if(i%j==0) break; /*注:素数为只能被自己和1整除的数.如果i%j等于0,说明i 不是素数,跳出本层循环*/
if(i==j)
{xx[s++]=i;k--;}
} }
void num(int m, int k, int xx[]) { int i=0;
for(m=m+1;k>0;m++)
if(isP(m))
{ xx[i++]=m;
k--; } } main()
{ int m, n, xx[1000] ;
clrscr() ;
printf("\nPlease enter two
integers:") ;
scanf("%d,%d", &m, &n ) ;
num(m, n, xx) ;
for(m = 0 ; m < n ; m++)
printf("%d ", xx[m]) ;
printf("\n") ;
readwriteDA T() ;
}
void readwriteDAT()
{ int m, n, xx[1000], i ;
FILE *rf, *wf ;
rf = fopen("in.dat", "r") ;
wf = fopen("out.dat", "w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d %d", &m,
&n) ;
num(m, n, xx) ;
for(m = 0 ; m < n ; m++)
fprintf(wf, "%d ", xx[m]) ;
fprintf(wf, "\n") ;
}
fclose(rf) ;
fclose(wf) ;
}
2、已知数据文件IN.DAT中
存有200个四位数, 并已调
用读函数readDat()把这些数
存入数组a中,请考生编制一
函数jsVal(),其功能是: 如果
四位数各位上的数字均是0
或2或4或6或8, 则统计出
满足此条件的个数cnt, 并把
这些四位数按从大到小的顺
序存入数组b中。

最后main()
函数调用写函数writeDat( )
把结果cnt以及数组b中符合
条件的四位数输出到
OUT.DAT文件中。

#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
2:void jsVal() /*标准答案
*/
{int bb[4];
int I,j,k,flag;
for (I=0;I<200;I++)
{bb[0]=a[I]/1000;
bb[1]=a[I]%1000/100;
bb[2]=a[I]%100/10;
bb[3]=a[I]%10;
for (j=0;j<4;j++)
{if (bb[j]%2==0)
flag=1;
else
{flag=0;break;}
}
if (flag==1)
{ b[cnt]=a[I];
cnt++;} }
for(I=0;I<cnt-1;I++)
for(j=I+1;j<cnt;j++)
if (b[I]<b[j])
{k=b[I];b[I]=b[j];b[j]=k;}
}
void readDat()
{ int i ;
FILE *fp ;
fp = fopen("in.dat", "r") ;
for(i = 0 ; i < MAX ; i++)
fscanf(fp, "%d", &a[i]) ;
fclose(fp) ;
}
void main()
{ int i ;
readDat() ;
jsVal() ;
printf("满足条件的数
=%d\n", cnt) ;
for(i = 0 ; i < cnt ; i++)
printf("%d ", b[i]) ;
printf("\n") ;
writeDat() ;
}
writeDat()
{ FILE *fp ;
int i ;
fp = fopen("out.dat", "w") ;
fprintf(fp, "%d\n", cnt) ;
for(i = 0 ; i < cnt ; i++)
fprintf(fp, "%d\n", b[i]) ;
fclose(fp) ; }
3:函数READDA T()实现
从文件IN.DAT中读取一篇
英文文章存入到字符串数组
XX中;请编制函数STROR(),
其函数功能是:以行为单位把
字符串中的所有小写字母O
左边的字符串内容移到该串
的右边存放,然后并把小写字
母O删除,余下的字符串内容
移到已处理字符串的左边存
放.最后把已处理的字符串仍按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文件OUT.DAT中.
例如:原文:You can create an index on any field. you have the correct record.
结果: n any field.Yu can create an index rd.yu have the crrect rec
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。

试题程序:
# include"stdio.h"
# include"string.h"
# include"conio.h"
char xx[50][80];
int maxline=0; /*文件的总行数*/
int ReadDat(void);
void WriteDat(void);
3:void StrOR(void)
{int I,j,k,index,strl;
char ch;
for(I=0;I<maxline;I++) {strl=strlen(xx[I]);
index=strl;
for(j=0;j<strl;j++)
if(xx[I][j]=='o')
{for(k=j;k<strl-1;k++)
xx[I][k]=xx[I][k+1];
xx[I][strl-1]= ' ';
index=j;}
for(j=strl-1;j>=index;j--) {ch=xx[I][strl-1];
for(k=strl-1;k>0;k--)
xx[I][k]=xx[I][k-1];
xx[I][0]=ch;} } }
或者:
void StrOR(void)
{ int i;
char a[80],*p;
for(i=0;i<maxline;i++)
{ p=strchr(xx[i],'o');
while(p)
{ memset(a,0,80); memcpy(a,xx[i],p-xx[i]);
strcpy(xx[i],p+1);
strcat(xx[i],a);
p=strchr(xx[i],'o'); } } } void main()
{clrscr();
if(ReadDat())
{printf("数据文件IN.DAT不能打开!\n\007"); return;}
StrOR();
WriteDat();
}
int ReadDat(void)
{FILE *fp;int i=0;char *p;
if((fp=fopen("in.dat","r"))==N ULL) return 1;
while(fgets(xx[i],80,fp)!=NUL L)
{p=strchr(xx[i],'\n');
if(p) *p=0;
i++;
}
maxline=i;
fclose(fp);
return 0;
}
void WriteDat(void)
{FILE *fp; int i;
fp=fopen("OUT.DAT","w");
for(i=0;i<maxline;i++)
{printf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
4:函数ReadDat( )实现从文
件IN.DA T中读取一篇英文
文章存入到字符串数组xx中;
请编制函数StrOL( ), 其函数
的功能是: 以行为单位对行
中以空格或标点符号为分隔
的所有单词进行倒排,同时
去除标点符号,之后把已处
理的字符串(应不含标点符号)
仍按行重新存入字符串数组
xx中。

最后main()函数调用
函数WriteDat()把结果xx输
出到文件OUT6.DA T中。

例如: 原文: You He Me
I am a
student.
结果: Me He You
student a
am I
原始数据文件存放的格
式是: 每行的宽度均小于80
个字符, 含标点符号和空格。

试题程序:
# include"stdio.h"
# include"string.h"
# include"conio.h"
# include"ctype.h"
char xx[50][80];
int maxline=0;
int ReadDat(void);
void WriteDat(void);
4:void StrOL(void) /*标准答

{int I,j,k,strl,l;char c;
for(I=0;I<maxline;I++)
for(j=0;j<strlen(xx[I]);j++)
{c=xx[I][j];
if
((c>='A'&&c<='Z')||(c>='a'&&
c<='z')||c==' ') ;
else xx[I][j]=' '; }
for(l=0;l<maxline;l++)
{char ch[80]={0}; char
pp[80]={0};
strl=strlen(xx[l]);
I=strl-1; k=1;
while(1)
{while
(((xx[l][I]>='a'&&xx[l][I]<='z'
)||(xx[l][I]>='A'&&xx[l][I]<='z
'))&&I>=0)
{for(j=k;j>=0;j--)
pp[j+1]=pp[j]; pp[0]=xx[l][I];
k++;I--; }
strcat(ch,pp);strcpy(pp,
"""");k=1;
if(I==-1)break;
while((xx[l][I]<'A'||xx[l][I]>'z'
)&&I>=0)
{for(j=k;j>=0;j--)
pp[j+1]=pp[j];
pp[0]=xx[l][I]; k++;
I--;}
strcat(ch,pp); strcpy(pp,"""");
k=0;
if(I==-1)break;}
strcpy(xx[l],ch);
}}
或者:
void StrOL(void)
{ int i,j,k,m,n,ll;
char yy[80];
for(i=0; i < maxline; i++)
{ ll=strlen(xx[i]); k=n=0;
for(j=ll-1; j>=0; j--)
{ if(isalpha(xx[i][j]))
k++;
else
{ for(m=1; m<=k;
m++)
yy[n++]=xx[i][j+m];
k=0; }
if(xx[i][j]==' ') yy[n++]='
';
}
for(m=1; m<=k; m++)
yy[n++]=xx[i][j+m];
yy[n]=0;
strcpy(xx[i],yy);
}
}
void main()
{clrscr();
if(ReadDat())
{printf("数据文件IN.DAT不
能打开!\n\007");
return;}
StrOR();
WriteDat();
}
int ReadDat(void)
{FILE *fp;int i=0;char *p;
if((fp=fopen("in.dat","r"))==N ULL) return 1;
while(fgets(xx[i],80,fp)!=NUL L)
{p=strchr(xx[i],'\n');
if(p) *p=0;
i++;
}
maxline=i;
fclose(fp);
return 0;
}
void WriteDat(void)
{FILE *fp;
int i;
fp=fopen("out.dat","w");
for(i=0;i<maxline;i++) {printf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
5:在文件in.dat中有200个正整数,且每个数均在1000至9999之间。

函数ReadDat()读取这200个数存放到数组aa中。

请编制函数jsSort(),其函数的功能是:要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数依次存入数组b中,如果后三位的数值相等,则按原先的数值进行降序排列。

最后调用函数WriteDat()把结果bb输出到文件out.dat中。

例:处理前6012 5099 9012 7025 8088
处理后9012 6012 7025 8088 5099
注意:部分源程序已给出。

#include<stdio.h>
#include<string.h>
#include<conio.h>
int aa[200],bb[10];
5:void jsSort() /*标准答案*/ {int I,j,data;
for(I=0;I<199;I++)
for(j=I+1;j<200;j++)
{if(aa[I]%1000>aa[j]%1000) {data=aa[I];aa[I]=aa[j];aa[j]=d ata;}
else
if(aa[I]%1000==aa[j]%1000)
if(aa[I]<aa[j]) {data=aa[I];aa[I]=aa[j];aa[j]=d ata;}
}
for(I=0;I<10;I++)
bb[I]=aa[I];
}
void main()
{readDat();
jsSort();
writeDat();
}
readDat()
{FILE *in;
int i; in=fopen("in.dat","r");
for(i=0;i<200;i++)
fscanf(in,"%d,",&aa[i]);
fclose(in);
}
writeDat()
{FILE *out;
int i;
clrscr();
out=fopen("out.dat","w");
for(i=0; i<10; i++){
printf("i=%d,%d\n",i+1,bb[i]);
fprintf(out,"%d\n",bb[i]);
}
fclose(out);
}
6:在文件in.dat中有200个
正整数,且每个数均在1000
至9999之间。

函数ReadDat()
读取这200个数存放到数组
aa中。

请编制函数jsSort(),
其函数的功能是:要求按每
个数的后三位的大小进行降
序排列,然后取出满足此条
件的前10个数依次存入数组
b中,如果后三位的数值相
等,则按原先的数值进行升
序排列。

最后调用函数
WriteDat()把结果bb输出到
文件out.dat中。

例:处理前9012 5099 6012
7025 8088
处理后5099 8088 7025
6012 9012
注意:部分源程序已给
出。

#include<stdio.h>
#include<string.h>
#include<conio.h>
int aa[200],bb[10];
6:void jsSort() /*标准答案*/
{int I,j,data;
for(I=0;I<199;I++)
for(j=I+1;j<200;j++)
{if(aa[I]%1000<aa[j]%1000)
{data=aa[I];aa[I]=aa[j];aa[j]=d
ata;}
else
if(aa[I]%1000==aa[j]%1000)
if(aa[I]>aa[j])
{data=aa[I];aa[I]=aa[j];aa[j]=d
ata;}
}
for(I=0;I<10;I++)
bb[I]=aa[I];
}
void main()
{
readDat();
jsSort();
writeDat();
}
readDat()
{
FILE *in;
int i;
in=fopen("in.dat","r");
for(i=0; i<200; i++)
fscanf(in,"%d,",&aa[i]);
fclose(in);
}
writeDat()
{
FILE *out;
int i;
clrscr();
out=fopen("out.dat","w");
for(i=0; i<10; i++){
printf("i=%d,%d\n",i+1,bb[i]);
fprintf(out,"%d\n",bb[i]);
}
fclose(out);
}
7:已知在文件IN.DA T中存
有100个产品销售记录,每
个产品销售记录由产品代码
dm(字符型4位),产品名称
mc(字符型10位),单价dj(整
型),数量sl(整型),金额je(长
整型)四部分组成。

其中:金
额=单价*数量计算得出。


数ReadDat()是读取这100个
销售记录并存入结构数组
sell中。

请编制函数SortDat(),
其功能要求:按产品代码从
大到小进行排列,若产品代
码相同,则按金额从大到小
进行排列,最终排列结果仍
存入结构数组sell中,最后调
用函数WriteDat()把结果输出
到文件OUT10.DAT中。

#include<stdio.h>
#include<mem.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 100
typedef struct{
char dm[5]; /*产品代码*/ char mc[11]; /*产品名称*/ int dj; /*单价*/
int sl; /*数量*/ long je; /*金额*/
}PRO;
PRO sell[MAX];
void ReadDat();
void WriteDat();
7:void SortDat() /*标准答案*/
{int I,j;
PRO xy;
for(I=0;I<99;I++)
for(j=I+1;j<100;j++)
if(strcmp(sell[I].dm,sell[j].dm) <0)
{xy=sell[I];sell[I]=sell[j];sell[j ]=xy;}
else
if(strcmp(sell[I].dm,sell[j].dm) ==0)
if(sell[I].je<sell[j].je)
{xy=sell[I];sell[I]=sell[j]; sell[j]=xy;}
}
void main()
{ memset(sell,0,sizeof(sell)); ReadDat();
SortDat();
WriteDat(); }
void ReadDat()
{FILE *fp;
char str[80],ch[11];
int i;
fp=fopen("IN.DAT","r");
for(i=0;i<100;i++){
fgets(str,80,fp);
memcpy(sell[i].dm,str,4); memcpy(sell[i].mc,str+4,10); memcpy(ch,str+14,4);ch[4]=0; sell[i].dj=atoi(ch);
memcpy(ch,str+18,5);ch[5]=0; sell[i].sl=atoi(ch);
sell[i].je=(long)sell[i].dj*sell[i ].sl;}
fclose(fp);}
void WriteDat(void)
{FILE *fp;
int i;
fp=fopen("OUT10.DAT","w") ;
for(i=0;i<100;i++){
fprintf(fp,"%s %s %4d %5d % 101d\n",
sell[i].dm,sell[i].mc,sell[i].dj,s ell[i].sl,sell[i].je);}
fclose(fp);}
8:函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS1.DAT 中。

替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或大于130,则该字符不变,否则将f(p)所对应的字符进行替代。

注意:部分源程序已给出。

原始数据文件存放的格式是:每行的宽度均小于80个字符。

请勿改动主函数main()、
读数据函数ReadDat()和输出
数据函数WriteDat()的内容。

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<ctype.h>
unsigned char xx[50][80];
int maxline=0; /*文章的总
行数*/
int ReadDat(void);
void WriteDat(void);
8:void encryptChar()
{int I;
char *pf;
for(I=0;I<maxline;I++)
{pf=xx[I];
while(*pf!=0)
{if(*pf*11%256>130||*pf*11
%256<=32);
else
*pf=*pf*11%256;
pf++; }
}
}
或者:
void encryptChar()
{ int i,j;
char *p;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
{ p=(xx[i][j]*11)%256;
if(p<=32||p>130)
;
else xx[i][j]=p; }
}
9:函数ReadDat( )实现从文
件IN.DA T中读取一篇英文
文章存入到字符串数组xx中;
请编制函数SortCharD( ), 其
函数的功能是: 以行为单位
对字符按从大到小的顺序进
行排序, 排序后的结果仍按
行重新存入字符串数组xx
中。

最后main()函数调用函数
WriteDat()把结果xx输出到
文件OUT2.DA T中。

例: 原文: dAe,BfC.
CCbbAA
结果: fedCBA.,
bbCCAA
原始数据文件存放的格
式是: 每行的宽度均小于80
个字符, 含标点符号和空格。

#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80] ;
int maxline =0; /*文章的总
行数*/
int ReadDat(void) ;
void WriteDat(void) ;
void SortCharD(void)
{int I,j,k,strl;
char ch;
for(I=0;I<maxline;I++)
{strl=strlen(xx[I]);
for(j=0;j<strl-1;j++)
for(k=j+1;k<strl;k++)
if(xx[I][j]<xx[I][k])
{ch=xx[I][j];
xx[I][j]=xx[I][k];
xx[I][k]=ch;}
}
}
void main()
{
clrscr() ;
if(ReadDat()) {
printf("数据文件IN.DAT
不能打开!\n\007") ;
return ;
}
SortCharD() ;
WriteDat() ;
}
int ReadDat(void)
{
FILE *fp ;
int i = 0 ;
char *p ;
if((fp = fopen("IN.DA T",
"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 ;
clrscr() ;
fp = fopen("OUT2.DA T", "w") ;
for(i = 0 ; i < maxline ; i++) {
printf("%s\n", xx[i]) ;
fprintf(fp, "%s\n", xx[i]) ; }
fclose(fp) ;
}
9:void SortCharD(void) /*标准答案*/
{int I,j,k,strl;
char ch;
for(I=0;I<maxline;I++) {strl=strlen(xx[I]);
for(j=0;j<strl-1;j++)
for(k=j+1;k<strl;k++)
if(xx[I][j]<xx[I][k])
{ch=xx[I][j];
xx[I][j]=xx[I][k];
xx[I][k]=ch;}
}}
10:请编制函数ConvertCharA(), 其函数的功能是: 以行为单位把字符串中的所有小写字母改写成该字母的下一个字母, 如果是字母z, 则改写成字母a,大写字母和其它字符保持不变。

把已处理的字符串仍按行重新存入字符串数组xx 中。

最后main()函数调用函数WriteDat()把结果xx输出到文件OUT3.DAT中。

例: 原文: Adb.Bcdza
abck.LLhj
结果: Aec.Bdeab
bcdl.LLik
原始数据文件存放的格式是: 每行的宽度均小于80个字符, 含标点符号和空格。

#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80] ;
int maxline = 0 ; /*文章的总行数*/
int ReadDat(void) ;
void WriteDat(void) ;
10:void ConvertCharA(void) /*标准答案*/
{int I,j,str;
for(I=0;I<maxline;I++)
{str =strlen(xx[I]);
for(j=0;j<str;j++)
if(xx[I][j]=='z')xx[I][j]='a'; else
if(xx[I][j]>='a'&&xx[I][j]<='y') xx[I][j]+=1; } }
void main()
{ clrscr() ;
if(ReadDat()) {
printf("数据文件IN.DAT 不能打开!\n\007") ;
return ;
}
ConvertCharA();
WriteDat() ;
}
int ReadDat(void)
{ FILE *fp ; int i = 0 ; char *p ;
if((fp = fopen("IN.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 ;
clrscr() ;
fp = fopen("OUT3.DA T",
"w") ;
for(i = 0 ; i < maxline ; i++)
{
printf("%s\n", xx[i]) ;
fprintf(fp, "%s\n", xx[i]) ;
}
fclose(fp) ;
}
11:下列程序的功能是:把s
字符串中的所有字母改写成
该字母的下一个字符,字母z
改写成字母a。

要求大写字母
仍为大写字母,小写字母仍
为小写字母,其他字符不做
改变。

请编写函数chg(char *s)
实现程序的要求,最后调用
函数readwriteDat()把结果输
出到文件out.dat中。

例如:s字符串中原有的
内容为:Mn.123Zxy,则调用
该函数后,结果为
No.123Ayz。

#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#define N 81
void readwriteDAT();
void chg(char*s)
{
}
main( )
{
char a[N];
clrscr();
printf("Enter a string : ");
gets(a);
printf("The original string is :
"); puts(a);
chg(a);
printf("The string after
modified : ");
puts (a);
readwriteDA T() ;
}
void readwriteDAT()
{
int i ;
char a[N] ;
FILE *rf, *wf ;
rf = fopen("in.dat", "r") ;
wf = fopen("out.dat", "w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%s", a) ;
chg(a) ;
fprintf(wf, "%s\n", a) ;
}
fclose(rf) ;
fclose(wf) ;}
12:已知在文件IN.DA T中存
有100个产品销售记录,每
个产品销售记录由产品代码
dm(字符型4位),产品名称
mc(字符型10位),单价dj(整
型),数量sl(整型),金额je(长
整型)四部分组成。

其中:金
额=单价*数量计算得出。


数ReadDat()是读取这100个
销售记录并存入结构数组
sell中。

请编制函数SortDat(),
其功能要求:按产品名称从
小到大进行排列, 若产品名
称相同, 则按金额从小到大
进行排列.最终排列结果仍存
入结构数组sell中,最后调用
函数WriteDat()把结果输出到
文件OUT5.DA T中。

#include<stdio.h>
#include<mem.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 100
typedef struct{
char dm[5]; /*产品代
码*/
char mc[11]; /*产品名称*/
int dj; /*单价*/
int sl; /*数量*/
long je; /*金额*/
}PRO;
PRO sell[MAX];
void ReadDat();
void WriteDat();
void SortDat()
{
}
void main()
{ memset(sell,0,sizeof(sell)); ReadDat();
SortDat();
WriteDat(); }
void ReadDat()
{FILE *fp;
char str[80],ch[11];
int i;
fp=fopen("IN.DAT","r");
for(i=0;i<100;i++){
fgets(str,80,fp);
memcpy(sell[i].dm,str,4); memcpy(sell[i].mc,str+4,10); memcpy(ch,str+14,4);ch[4]=0; sell[i].dj=atoi(ch);
memcpy(ch,str+18,5);ch[5]=0; sell[i].sl=atoi(ch);
sell[i].je=(long)sell[i].dj*sell[i ].sl;}
fclose(fp);}
void WriteDat(void)
{FILE *fp;
int i;
fp=fopen("OUT5.DA T","w"); for(i=0;i<100;i++){
fprintf(fp,"%s %s %4d %5d % 101d\n",
sell[i].dm,sell[i].mc,sell[i].dj,s ell[i].sl,sell[i].je);}
fclose(fp);}
13:已知在文件IN.DA T中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。

其中:金额=单价*数量计算得出。

函数ReadDat()是读取这100个销售记录并存入结构数组sell中。

请编制函数SortDat(),其功能要求:按产品代码从小到大进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT6.DAT中。

#include<stdio.h>
#include<mem.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 100
typedef struct{
char dm[5]; /*产品代码*/
char mc[11]; /*产品名称*/ int dj; /*单价*/
int sl; /*数量*/
long je; /*金额*/
}PRO;
PRO sell[MAX];
void ReadDat();
void WriteDat();
void SortDat()
{
}
void main()
{ memset(sell,0,sizeof(sell)); ReadDat();
SortDat(); WriteDat(); }
void ReadDat()
{FILE *fp;
char str[80],ch[11];
int i;
fp=fopen("IN.DAT","r");
for(i=0;i<100;i++){
fgets(str,80,fp);
memcpy(sell[i].dm,str,4);
memcpy(sell[i].mc,str+4,10);
memcpy(ch,str+14,4);ch[4]=0;
sell[i].dj=atoi(ch);
memcpy(ch,str+18,5);ch[5]=0;
sell[i].sl=atoi(ch);
sell[i].je=(long)sell[i].dj*sell[i
].sl;}
fclose(fp);}
void WriteDat(void)
{FILE *fp;
int i;
fp=fopen("OUT6.DA T","w");
for(i=0;i<100;i++){
fprintf(fp,"%s %s %4d %5d %
101d\n",sell[i].dm,sell[i].mc,se
ll[i].dj,sell[i].sl,sell[i].je);}
fclose(fp);}
14:已知数据文件IN.DAT中
存有200个四位数, 并已调
用读函数readDat()把这些数
存入数组a中,请考生编制一
函数jsVal(),其功能是: 依次
从数组a中取出一个四位数,
如果该数连续大于该四位数
以后的5个数且该数是奇数,
则统计出满足此条件的个数
cnt, 并把这些四位数按从小
到大的顺序存入数组b中。

并要计算满足上述条件的四
位数的个数cnt。

最后main()
函数调用写函数writeDat( )
把结果cnt以及数组b中符合
条件的四位数输出到
OUT.DAT文件中。

#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
void jsVal()
{
}
void readDat()
{ int i ;
FILE *fp ;
fp = fopen("in.dat", "r") ;
for(i = 0 ; i < MAX ; i++)
fscanf(fp, "%d", &a[i]) ;
fclose(fp) ;
}
void main()
{ int i ;
readDat() ;
jsVal() ;
printf("满足条件的数
=%d\n", cnt) ;
for(i = 0 ; i < cnt ; i++)
printf("%d ", b[i]) ;
printf("\n") ;
writeDat() ;
}
writeDat()
{ FILE *fp ;
int i ;
fp = fopen("out.dat", "w") ;
fprintf(fp, "%d\n", cnt) ;
for(i = 0 ; i < cnt ; i++)
fprintf(fp, "%d\n", b[i]) ;
fclose(fp) ;}
15:已知数据文件IN.DAT中
存有200个四位数, 并已调
用读函数readDat()把这些数
存入数组a中,请考生编制一
函数jsVal(),其功能是:若一个
四位数的千位数字上的值小
于等于百位数字上的值,百
位数字上的值小于等于十位
数字上的值,十位数字上的
值小于等于个位数字上的
值,并且此四位数是偶数,
则统计出满足此条件的个数
cnt, 并把这些四位数按从大
到小的顺序存入数组b中。

最后main()函数调用写函数
writeDat( )把结果cnt以及数
组b中符合条件的四位数输
出到OUT.DA T文件中。

#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0;
void jsVal()
{
}
void readDat()
{ int i ;
FILE *fp ;
fp = fopen("in.dat", "r") ;
for(i = 0 ; i < MAX ; i++)
fscanf(fp, "%d", &a[i]) ;
fclose(fp) ;
}
void main()
{ int i ;
readDat() ;
jsVal() ;
printf("满足条件的数=%d\n", cnt) ;
for(i = 0 ; i < cnt ; i++) printf("%d ", b[i]) ;
printf("\n") ;
writeDat() ;
}
writeDat()
{ FILE *fp ;
int i ;
fp = fopen("out.dat", "w") ; fprintf(fp, "%d\n", cnt) ;
for(i = 0 ; i < cnt ; i++) fprintf(fp, "%d\n", b[i]) ; fclose(fp) ;
}
16:函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx 中,请编制函数StrCharJR(),其函数的功能是:以行为单位把字符串中所有字符的ASCII值右移4位,然后把右移后的字符ASCII值再加上原字符的ASCII值,得到新的字符仍存入原字符串对应的位置上。

最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT8.DAT中。

原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。

#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80] ;
int maxline = 0 ; /*文章的总行数*/
int ReadDat(void) ;
void WriteDat(void) ;
void StrCharJR(void)
{
}
void main()
{ clrscr() ;
if(ReadDat()) {
printf("数据文件IN.DAT 不能打开!\n\007") ;
return ;
}
StrCharJR() ;
WriteDat() ;
}
int ReadDat(void)
{ FILE *fp ;
int i = 0 ;
char *p ;
if((fp = fopen("IN.DA T", "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 ;
clrscr() ;
fp = fopen("OUT8.DA T",
"w") ;
for(i = 0 ; i < maxline ; i++) {
printf("%s\n", xx[i]) ;
fprintf(fp, "%s\n", xx[i]) ;
}
fclose(fp) ;
}
17:函数READDA T()实现
从文件IN.DAT中读取一篇
英文文章存入到字符串数组
XX中;请编制函数CHA(),其
函数功能是:以行为单位把字
符串中的第一个字符的
ASCII值加第二个字符的
ASCII值,得到第一个新字
符,第二个字符的ASCII值
加第三个字符的ASCII值,
得到第二个新字符,依此类
推一直处理到最后第二个字
符,最后一个字符的ASCII
值加原第一个字符的ASCII
值,得到最后一个新的字符,
得到的新字符分别存放在原
字符串对应的位置上。

最后
把已处理的字符串逆转后按
行重新存入字符串数组XX
中,最后调用函数
WRITEDA T()把结果XX输出
到文件OUT9.DA T中.
#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80] ;
int maxline = 0 ; /*文章的总
行数*/
int ReadDat(void) ;
void WriteDat(void) ;
void ChA(void)
{
}
void main()
{
clrscr() ;
if(ReadDat()) {
printf("数据文件IN.DAT
不能打开!\n\007") ;
return ;
}
ChA() ;
WriteDat() ;
}
int ReadDat(void)
{
FILE *fp ;
int i = 0 ;
char *p ;
if((fp = fopen("IN.DA T", "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 ;
clrscr() ;
fp = fopen("OUT9.DAT",
"w") ;
for(i = 0 ; i < maxline ; i++) {
printf("%s\n", xx[i]) ;
fprintf(fp, "%s\n", xx[i]) ;
}
fclose(fp) ;
}
18:函数ReadDat()实现从文
件ENG.IN中读取一篇英文
文章,存入到字符串数组xx
中;请编制函数
encryptChar(),按给定的替代
关系对数组xx中的所有字符
进行替代,仍存入数组xx的
对应的位置上,最后调用函
数WriteDat()把结果xx输出
到文件PS10.DAT中。

替代关系:f(p)=p*11
mod 256 (p是数组中某一个
字符的ASCII值,f(p)是计算
后新字符的ASCII值),如果
原字符的ASCII值是偶数或
计算后f(p)值小于等于32,
则该字符不变,否则将f(p)
所对应的字符进行替代。

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<ctype.h> unsigned char xx[50][80];
int maxline=0; /*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void encryptChar()
{
}
void main()
{
clrscr();
if(ReadDat()){
printf("数据文件ENG.IN不能打开!\n\007");
return;
}
encryptChar();
WriteDat();
}
int ReadDat(void)
{
FILE *fp;
int i=0;
unsigned char *p;
if((fp=fopen("eng.in","r"))== NULL) return 1;
while(fgets(xx[i],80,fp)!=NUL L){
p=strchr(xx[i],'\n');
if(p)*p=0;
i++;
}
maxline=i;
fclose(fp);
return 0;
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("ps10.dat","w");
for(i=0;i<maxline;i++){
printf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);}
19:编写一个函数findstr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。

例如:假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",函数返回值为6。

函数readwriteDat()的功能是实现从文件in.dat中读取两个字符穿4,并调用函数findstr(),最后把结果输出到文件out.dat中。

#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 81
int findStr(char *str,char *substr)
{ int n;
char *p , *r;
n=0;
while ( *str )
{ p=str;
r=substr;
while(*r)
if(*r==*p) {r++; p++; }
else break;
if(*r=='\0')
n++;
str++; }
return n;
}
main()
{
char str[81],substr[3];
int n;
clrscr();
printf("Enter a string : ");
gets(str);
printf("Enter a substring: ");
gets(substr);
puts(str);puts(substr);
n=findStr(str,substr);
printf("n=%d\n",n);
ReadWrite();
}
ReadWrite()
{char str[81],substr[3],ch;
int n,len,i=0;
FILE *rf, *wf ;
rf = fopen("in.dat", "r") ;
wf = fopen("out.dat", "w") ;
while(i<5)
{fgets(str,80,rf);
fgets(substr,10,rf);
len=strlen(substr)-1;
ch=substr[len];
if(ch=='\n'||ch==0x1a)
substr[len]=0;
n=findStr(str,substr);
fprintf(wf,"%d\n",n);
i++;
}
fclose(rf) ;
fclose(wf) ;}
20:编写函数jsvalue,它的
功能是:求Fibonacci数列中
大于t的最小的一个数,结果
由函数返回。

其中Fibonacci
数列F(n)的定义为:
F(0)=0,F(1)=1
F(n)=F(n-1)+F(n-2)
最后调用函数writeDat()读取
10个数据t,分别得出结果且
把结果输出到文件out.dat
中。

例如:当t=1000时,函数
值为:1597。

#include <stdio.h>
int jsvalue(int t)
{
}
main()
{int n;
n=1000;
printf("n=%d,f=%d\n",n,jsvalu
e(n));
writeDat();}
writeDat()
{FILE *in,*out;
int i,n,s;
in=fopen("in.dat","r");
out=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(in,"%d",&n);
s=jsvalue(n);
printf("%d\n",s);
fprintf(out,"%d\n",s);}
fclose(in);
fclose(out);}
21:下列程序的功能是:利
用发下所示的简单迭代方法
求方程:cos(x)-x=0的一个实
根。

xn+1=cos(xn)
迭代步骤如下:
(1)取X1初值为0.0;
(2)X0=X1,把X1的值赋
给X0;
(3)X1=COS(X0),求出一
个新的X1;
(4)若X0-X1绝对值小
0.000001,执行步骤(5),否则执
行步骤(2);
(5)所求X1就是方程
cos(X)-X=0的一个实根,作为
函数值返回。

请编写函数countvalue()实
现程序的要求,最后调用函
数WRITEDA T()把结果输
出到文件OUT17.DA T中。

#include <conio.h>
#include <math.h>
#include <stdio.h>
float countvalue()
{
}
main()
{clrscr();
printf("实根
=%f\n",countvalue());
printf("%f\n",cos(countvalue()
)-countvalue());
writeDat();}
writeDat()。

相关文档
最新文档