三级c语言上机真题汇编
请编写一个函数jsValue(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入数组xx传回。
最后调用函数writeDat()读取10组数据,分别得出结果且把结果输出到文件out.dat中。
部分源程序存在文件prog1.c中。
例如:若输入17 5 则应输出:19,23,29,31,37。
请勿改动主函数main()和写函数writeDat()的内容。
#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;
}
void num(int m,int k,int xx[])
{ int s=0;
for(m=m+1;k>0;m++)
if(isP(m)) { xx[s++]=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");
readwriteDat();
}
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);
}
id 14题(无isP()函数)
#include <stdio.h>
void jsValue(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;
if(i==j) { xx[s++]=i; k--;}
}
}
main()
{
int m,n,zz[100];
printf("/n请输入两个整数:");
scanf("%d%d",&m,&n);
jsValue(m,n,zz);
for(m=0;m<n;m++)printf("%d ",zz[m]);
printf("/n");
writeDat();
}
writeDat()
{
int m,n,zz[100],i;
FILE *in,*out;
in=fopen("in.dat","r");
out=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(in,"%d%d",&m,&n);
jsValue(m,n,zz);
for(m=0;m<n;m++)fprintf(out,"%d ",zz[m]);
fprintf(out,"/n");
}
fclose(in);
fclose(out);
}
另一解法:
void num(int m,int k,int xx[])
{
int n=0,data=m+1;
while(n<k){
if(isP(data)) xx[n++]=data;
data++;}
}
****************************************
★题目2(上机题库id 143 整数排序题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:如果四位数各位上的数字均是0或2或4或6或8,则统计出满足此条件的个数cnt,并把这些四位数按从大到小的顺序存入数组b中。最后main( )函数调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal()
{ int i,j,qw,bw,sw,gw;
for(i=0;i<MAX;i++)
{ qw=a[i]/1000; bw=a[i]/100%10;
sw=a[i]%100/10; gw=a[i]%10;
if(qw&&qw%2==0&&bw%2==0&&sw%2==0&&gw%2==0) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) { qw=b[i]; b[i]=b[j]; b[j]=qw;}
}
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(上机题库id 133题;上机题库id 59、99字符串位置倒置题)
函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中;请编制函数StrOR( ),其函数的功能是:以行为单位依次把字符串中所有小写字母o左边的字符串内容移到该串的右边存放,然后把小写字母o删除,余下的字符串内容移到已处理字符串的左边存放,之后把已处理的字符串仍按行重新存入字符串数组xx中。最后main()函数调用函数WriteDat()把结果xx输出到文件OUT5.DAT中。
例如:原文:n any field.Yu can create an index
you have the correct record.
结果:n any field. Yu can create an index
rd. yu have the crrect rec
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
注意:部分源程序存放在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80] ;
int maxline = 0 ; /* 文章的总行数 */
int ReadDat(void) ;
void WriteDat(void) ;
void StrOR(void)
{int i,righto,j,s,k;
char tem[80];
for(i=0;i<maxline;i++) /*倒序循环*/
for(j=strlen(xx[i])-1;j>=0;j--)
{ k=0;
memset(tem,0,80); /*初始化字符串数组tem*/
if(xx[i][j]=='o') /*如果当前字符为'o',进入以下语句*/
{righto=j; /*则将此字符中位置j的值赋给righto*/
for(s=righto+1;s<strlen(xx[i]);s++)
tem[k++]=xx[i][s]; /*从righto的下一跳开始将其后所有的字符都存入到tem中*/
for(s=0;s<righto;s++) /*从当前行首部开始到出现字符'o'的位置(righoto)之前开始循环*/
if(xx[i][s]!='o') tem[k++]=xx[i][s]; /*将不是字符'o'的字符全存入到tem中*/
strcpy(xx[i],tem); /*将当前已处理的字符重新存入当前行xx*/
}
else continue;
}
}
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")) == 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("OUT5.DAT", "w") ;
for(i = 0 ; i < maxline ; i++) {
printf("%s/n", xx[i]) ;
fprintf(fp, "%s/n", xx[i]) ;
}
fclose(fp) ;
}
解法二:
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 StrOR(void)
{ int i,j; char yy[80],*p;
for(i=0; i<maxline;i++)
for(j=0; j<strlen(xx[i]); j++)
if(xx[i][j]=='o')
{ p=&xx[i][j+1];
strcpy(yy,p); /*将指针p所指向的字符串拷贝到字符串yy中去*/
strncat(yy,xx[i],j); /*将字符串xx[i]中前j个字符连接到yy中*/
strcpy(xx[i],yy); /*将字符串yy重新拷贝到字符串xx[i]中去*/
j=0; /* 开始下一次的扫描。*/
}
}
相关库函数解释:
char *strncat(char *dest, const char *src, size_t maxlen)
功能:将字符串src中前maxlen个字符连接到dest中
相关头文件:string.h
char *strcpy(char *dest, const char *src)
功能:将字符串src拷贝到字符串dest中去
相关头文件:string.h
****************************************
★☆题目4(id 24题 上机题库id 9 字符串单词倒置题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrOL(),其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT6.DAT中。
例如:原文:You He Me
I am a student.
结果:Me He You
student a am I
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#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);
/*在及上机题库版模拟系统中都通过测试(输入文件句末有标点的在输出文件中句前有空格*/
void StrOL(void)
{ int i,j,k,s,m,strl;
char str[80];
for(i=0;i<maxline;i++)
{ strl=strlen(xx[i]);
memset(str,0,80); /*初始化这字符串数组str*/
s=k=0;
for(j=strl-1;j>=0;j--) /*从当前字符串尾部开始向前倒序循环,实现题意要求的倒排*/
{ if(isalpha(xx[i][j])) k++; /*如果当前字符是字母a~z或A~Z,则k加一*/
else { for(m=1;m<=k;m++) /*否则将长度为k的单词顺序存入到字符串数组str中,s值加1*/
str[s++]=xx[i][j+m];
k=0; /*将k值清0,以方便下一个单词的长度计数*/
}
if(!isalpha(xx[i][j])) str[s++]=' '; /*如果当前字符不是字母a~z或A~Z,则以空格代之存入到字符串数组str中,s值加一*/
}
for(m=1;m<=k;m++) /*此时的k值为当前字符串中第一个单词的长度,但在上一个for循环中没能存入到字符串数组str中,所以在这里将其存入到str中*/
str[s++]=xx[i][j+m];
str[s]='/0'; /*在当前行尾加0以标记此行的结束*/
strcpy(xx[i],str); /*将倒排好的当前字符串重新存回到当前行xx中*/
}
}
void main()
{
clrscr();
if(ReadDat()){
printf("数据文件IN.DAT不能打开!/n/007");
return;
}
StrOL();
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("OUT6.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 ;
char word[21], yy[80], zz[80], *p ;
for(i = 0 ; i < maxline ; i++) {
p = xx[i] ;
j = 0 ;
memset(word, 0, 21) ;
memset(yy, 0, 80) ;
while(*p) {
if(isalpha(*p)) {
word[j++] = *p++ ;
if(*p) continue ;
}
strcpy(zz, yy) ;
sprintf(yy, "%s %s", word, zz) ;
j = 0 ;
memset(word, 0, 21) ;
while(*p && (!isalpha(*p))) p++ ;
}
strcpy(xx[i], yy) ;
}
}
另一解法():
/*在及上机题库版模拟系统中都通过测试(输入文件句末有标点的在输出文件中句前有空格*/
void StrOL(void)
{ int i,j,m;
char str[80];
for(i=0;i<maxline;i++)
{ m=strlen(xx[i]);
memset(str,0,80);
for(j=m-1;j>=0;j--)
if(!isalpha(xx[i][j]))
{ strcat(str,xx[i]+j+1);
strcat(str," ");
xx[i][j]='/0';
}
strcat(str,xx[i]);
strcpy(xx[i],str);
}
}
实际上机考试时上面几种解法都可以采用。
****************************************
★☆题目5(id 8整数排序题)
在文件in.dat中有200个正整数,且每个数均在1000至9999之间。函数ReadDat()读取这200个数存放到数组aa中。请编制函数jsSort(),其函数的功能是:要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数依次存入数组bb中,如果后三位的数值相等,则按原先的数值进行降序排列。最后调用函数WriteDat()把结果bb输出到文件out.dat中。
例:处理前 6012 5099 9012 7025 8088
处理后 9012 6012 7025 8088 5099
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
int aa[200],bb[10];
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||aa[i]%1000==aa[j]%1000&&aa[i]<aa[j])
{data=aa[i];aa[i]=aa[j];aa[j]=data;}
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(" %d",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
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include<stdio.h>
#include<string.h>
#include<conio.h>
int aa[200],bb[10];
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||aa[i]%1000==aa[j]%1000&&aa[i]>aa[j])
{data=aa[i];aa[i]=aa[j];aa[j]=data;}
for(i=0;i<10;i++)
bb[i]=aa[i];
}
void main()
{
readDat();
jsSort();
writeDat();
system("pause");
}
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(id 15结构体操作题))
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT6.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#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()
{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||strcmp(sell[i].dm,sell[j].dm)==0&&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("OUT6.DAT","w");
for(i=0;i<100;i++){
printf("%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
}
*****************************************************************************************
★☆题目8(id 83 字符替换题)
函数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)所对应的字符进行替代。部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于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);
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*11%256<=32||xx[i][j]*11%256>130) continue;
else xx[i][j]=xx[i][j]*11%256;
}
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)!=NULL){
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("ps1.dat","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
}
fclose(fp);
}
解法二:
void encryptChar()
{ int i,j,k;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
{ k= xx[i][j]*11%256;
if(k<=32||k>130) continue;
else xx[i][j]=k;
}
}
解法三:
void encryptChar()
{ int i,j;
unsigned char ch;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
{ ch=xx[i][j]*11%256;
if(ch<=32||ch>130) continue;
else xx[i][j]=ch;
}
}
解法四:
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) continue;
else xx[i][j]=p;
}
}
解法五:
void encryptChar()
{ int i;
char *pf;
for(i=0;i<maxline;i++)
{ pf=xx[i];
while(*pf!=0)
if(*pf*11%256<=32||*pf*11%256>130) pf++;
else *pf++=*pf*11%256;
}
}
*****************************************************************************************
★☆题目9(id 28;id 124;上机题库id 16 字符串排序题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数SortCharD(),其函数的功能是:以行为单位对字符按从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT2.DAT中。
例:原文:dAe,BfC.
CCbbAA
结果:fedCBA.
bbCCAA
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#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.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;
fp=fopen("OUT2.DAT","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
}
fclose(fp);
}
*****************************************************************************************
题目10(id 68 替换字符题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数ConvertCharA(),其函数的功能是:以行为单位把字符串中的所有小写字母改写成该字母的下一个字母,如果是字母z,则改写成字母a。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT1.DAT中。
例:原文:Adb.Bcdza
abck.LLhj
结果:Aec.Bdeab
bcdl.LLik
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void ConvertCharA(void)
{ int i,j;
for(i=0;i<maxline;i++)
{ for(j=0;j<strlen(xx[i]);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("OUT1.DAT","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
}
fclose(fp);
}
*****************************************************************************************
☆题目11(id 93 字符串字母移位题)
程序prog1.c的功能是:把 s 字符串中的所有字母改写成该字母的下一个字母,字母z改写成字母a。要求大写字母仍为大写字母,小写字母仍为小写字母,其它字符不做改变。
请考生编写函数chg(char *s)实现程序要求,最后调用函数readwriteDAT( )把结果输出到文件bc1.out中。
例如:s 字符串中原有的内容为:Mn.123Zxy,则调用该函数后,结果为:No.123Ayz。
注意:部分源程序存在文件prog1.c文件中。
请勿改动主函数main( )和输出数据函数readwriteDAT()的内容。
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#define N 81
void readwriteDAT();
void chg(char *s)
{while(*s)
if(*s=='z'||*s=='Z') {*s-=25; s++;}
else if(*s>='a'&&*s<='y') {*s+=1;s++;}
else if(*s>='A'&&*s<='Y') {*s+=1;s++;}
else 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);
readwriteDAT() ;
}
void readwriteDAT()
{
int i ;
char a[N] ;
FILE *rf, *wf ;
rf = fopen("bc1.in", "r") ;
wf = fopen("bc1.out", "w") ;
for(i = 0 ; i < 50 ; i++) {
fscanf(rf, "%s", a) ;
chg(a) ;
fprintf(wf, "%s/n", a) ;
}
fclose(rf) ;
fclose(wf) ;
}
*****************************************************************************************
★题目12(id 78结构体运算题题)
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:
按产品名称从小到大进行排列,若产品名称相等,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT5.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#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()
{int i,j;
PRO xy;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(strcmp(sell[i].mc,sell[j].mc)>0||strcmp(sell[i].mc,sell[j].mc)==0&&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()
{
FILE *fp;
int i;
fp=fopen("OUT5.DAT","w");
for(i=0;i<100;i++){
printf("%s %s %4d %5d %5d/n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
}
****************************************
题目13(id 81结构体运算题)
id 81题按金额从小到大进行排列
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能
要求:按产品代码从小到大进行排列,若产品代码相等,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT9.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#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()
{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||strcmp(sell[i].dm,sell[j].dm)==0&&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()
{
FILE *fp;
int i;
fp=fopen("OUT9.DAT","w");
for(i=0;i<100;i++){
printf("%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
}
*****************************************************************************************
☆题目14(id 151 整数统计排序题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:依次从数组a中取出一个四位数,如果该四位数连续大于该四位数以后的五个数且该数是奇数(该四位数以后不满五个数,则不统计),则统计出满足此条件的个数cnt并把这些四位数按从小到大的顺序存入数组b中,最后调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal()
{int i,j,flag;
for(i=0;i<MAX-5;i++)
{for(j=i+1;j<=i+5;j++)
if(a[i]>a[j]&&a[i]%2) flag=1;
else {flag=0;break;}
if(flag==1) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j]) {flag=b[i];b[i]=b[j];b[j]=flag;}
}
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(id 150 整数各位数字运算排序题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:若一个四位数的千位数字上的值小于等于百位数字上的值,百位数字上的值小于等于十位数字上的值,以及十位数字上的值小于等于个位数字上的值,并且原四位数是偶数,则统计出满足此条件的个数cnt并把这些四位数按从小到大的顺序存入数组b中,最后调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt=0;
void jsVal()
{int i,j;
int qw,bw,sw,gw;
for (i=0;i<MAX;i++)
{qw=a[i]/1000; bw=a[i]%1000/100;
sw=a[i]%100/10; gw=a[i]%10;
if((qw<=bw)&&(bw<=sw)&&(sw<=gw)&&(a[i]%2==0)) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if (b[i]>b[j]) {qw=b[i];b[i]=b[j];b[j]=qw;}
}
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(id 23 字符替换题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrCharJR(),其函数的功能是:以行为单位把字符串中所有字符的ASCII值右移4位,然后把右移后的字符ASCII值再加上原字符的ASCII值,得到新的字符仍存入原字符串对应的位置上。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT8.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void StrCharJR()
{int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
xx[i][j]+=(xx[i][j]>>4);
}
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.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("OUT8.DAT","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
}
fclose(fp);
}
*****************************************************************************************
☆题目17 (亲朋字符替换题)
函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请编制函数CHA(),其函数功能是:以行为单位把字符串中的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个亲朋字符,第二个字符的ASCII值加第三个字符的ASCII值,得到第二个新字符,依此类推一直处理到最后第二个字符,最后一个字符的ASCII值加原第一个字符的ASCII值,得到最后一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后把已处理的字符串逆转后按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文件OUT9.DAT中.原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格.
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#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)
{ int i,j;
char ch;
for(i=0;i<maxline;i++)
{ ch=xx[i][0];
for(j=0;j<strlen(xx[i])-1;j++)
xx[i][j]+=xx[i][j+1];
xx[i][strlen(xx[i])-1]+=ch;
strrev(xx[i]);
}
}
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.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("OUT9.DAT", "w") ;
for(i = 0 ; i < maxline ; i++) {
printf("%s/n", xx[i]) ;
fprintf(fp, "%s/n", xx[i]) ;
}
fclose(fp) ;
}
*****************************************************************************************
☆题目18(id 1 题)
函数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)所对应的字符进行替代。
部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于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);
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*11%256<=32||xx[i][j]%2==0) continue;
else xx[i][j]=xx[i][j]*11%256;
}
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)!=NULL){
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);
}
此题还有许多解法,方法可看题8
****************************************题目19(id 144 单词个数统计题)
编写一个函数findStr(char *str,char *substr),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如,假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",函数返回值是6。
函数ReadWrite()实现从文件in.dat中读取两个字符串,并调用函数findStr(),最后把结果输出到文件out.dat中。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main()和其它函数中的任何内容,仅在函数findStr()的花括号中填入你编写的若干语句。
#include <stdio.h>
#include <string.h>
#include <conio.h>
int findStr(char *str,char *substr)
{ int n=0;
char *p , *r;
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("输入原字符串:") ;
gets(str) ;
printf("输入子字符串:") ;
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 < 25) {
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) ;
}
解法二:
int findStr(char *str,char *substr)
{ int i,j,len1,len2,cnt=0,flag;
len1=strlen(str);
len2=strlen(substr);
for(i=0;i<len1;i++)
{ for(j=0;j<len2;j++)
if(str[i+j]==substr[j]) flag=1;
else {flag=0;break;}
if(flag==1) cnt++;
}
return cnt;
}
解法三:
int findStr(char *str,char *substr)
{ int i,cnt=0;
for(i=0;i<strlen(str);i++)
if(str[i]==*substr&&str[i+1]==*(substr+1)) cnt++;
return cnt;
}
解法四:
int findStr(char *str,char *substr)
{int cnt=0;
while(*str)
if(*str==*substr&&*(str+1)==*(substr+1)) { cnt++; str++;}
else str++;
return cnt;
}
****************************************题目20(id 80 Fibonacci数列题)
编写函数jsValue,它的功能是:求Fibonacci数列中大于t的最小的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为:
F(0)=0,F(1)=1
F(n)=F(n-1)+F(n-2)
最后调用函数writeDat()读取50个数据t,分别得出结果且把结果输出到文件out.dat中。
例如:当t=1000时,函数值为:1597。
部分源程序存在文件prog1.c中。
请勿改动主函数main()和写函数writeDat()的内容。
#include <stdio.h>
int jsValue(int t)
{ int f0=0,f1=1,fn;
fn=f0+f1;
while(fn<=t)
{ f0=f1;
f1=fn;
fn=f0+f1;
}
return fn;
}
main()
{
int n;
n=1000;
printf("n=%d,f=%d/n",n,jsValue(n));
writeDat();
}
writeDat()
{
FILE *in,*out;
int i,n,s;
in=fopen("in.dat","r");
out=fopen("out.dat","w");
for(i=0;i<50;i++){
fscanf(in,"%d",&n);
s=jsValue(n);
printf("%d/n",s);
fprintf(out,"%d/n",s);
}
fclose(in);
fclose(out);
}
****************************************
题目21(id 53 迭代方法求方程题)
下列程序prog1.c的功能是:利用以下所示的简单迭代方法求方程: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()实现程序的要求,最后调用函数writeDat()把结果输出到文件OUT17.DAT中。
部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include <conio.h>
#include <math.h>
#include <stdio.h>
float countValue()
{ double x0,x1;
x1=0.0;
do{ x0=x1;
x1=cos(x0);
}while(fabs(x0-x1)>=0.000001);
return x1;
}
main()
{
clrscr();
printf("实根=%f/n",countValue());
printf("%f/n",cos(countValue())-countValue());
writeDat();
}
writeDat()
{
FILE *wf;
wf=fopen("OUT17.DAT","w");
fprintf(wf,"%f/n",countValue());
fclose(wf);
}
****************************************
★题目22(id 39 平方根问题)
请编写函数countValue(),它的功能是:求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方根s,并作为函数值返回,最后结果s输出到文件out.dat中。
例如若n为1000时,函数值应为:s=153.909064。
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输入输出数据函数progReadWrite()的内容。
#include <conio.h>
#include <math.h>
#include <stdio.h>
double countValue(int n)
{ int i;
double s=0.0;
for(i=1;i<n;i++)
if(i%21==0) s+=i;
return sqrt(s);
}
main()
{
clrscr();
printf("自然数之和的平方根=%f/n",countValue(1000));
progReadWrite();
}
progReadWrite()
{
FILE *fp,*wf;
int i,n;
float s;
fp=fopen("in.dat","r");
if(fp==NULL){
printf("数据文件in.dat不存在!");
return;
}
wf=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(fp,"%d/n",&n);
s=countValue(n);
fprintf(wf,"%f/n",s);
}
fclose(fp);
fclose(wf);
}
****************************************
★题目23 (实数运算题)
已知在文件in.dat中存有N个(个数<200)实数,函数readdat()读取这N个实数并存入数组xx中。请编制函数calvalue(),其功能要求:
1、求出这N个实数的平均值aver;
2、分别求出这N个实数的整数部分之和sumint以及小数部分之和sumdec,最后调用函数writedat()把所求的结果输出到文件out.dat中。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。
#include <stdio.h>
#include <conio.h>
#define MAXNUM 200
float xx[MAXNUM] ;
int N= 0 ; /* 文件IN.DAT中共有多少个实数 */
double aver=0.0;/*平均值*/
double sumint=0.0;/*整数部分之和*/
double sumdec=0.0;/*小数部分之和*/
int ReadDat(void) ;
void WriteDat(void) ;
void CalValue(void)
{int i;
for (i=0;i<N;i++)
{sumint+=(long)xx[i];
sumdec+=xx[i]-(long)xx[i];
aver+=xx[i];
}
aver/=N;
}
void main()
{ int i ;
clrscr() ;
for(i = 0 ; i < MAXNUM ; i++) xx[i] = 0 ;
if(ReadDat()) {
printf("数据文件IN.DAT不能打开!/007/n") ;
return ;
}
Calvalue() ;
printf("文件IN.DAT中共有实数=%d个/n", N) ;
printf("平均值=%.2lf/n", aver) ;
printf("整数部分之和=%.2lf/n", sumint) ;
printf("小数部分之和=%.2lf/n", sumdec) ;
WriteDat() ;
system("pause");
}
int ReadDat(void)
{
FILE *fp ;
int i = 0 ;
if((fp = fopen("in.dat", "r")) == NULL) return 1 ;
while(!feof(fp)) {
fscanf(fp, "%d,", &xx[i++]) ;
}
fclose(fp) ;
return 0 ;
}
void WriteDat(void)
{
FILE *fp ;
fp = fopen("OUT.DAT", "w") ;
fprintf(fp, "%.2lf/n%.2lf/n%.2lf/n", aver,sumint,sumdec) ;
fclose(fp) ;
}
****************************************
☆题目24(id 16 完全平方数问题)
下列程序prog1.c的功能是:在三位整数(100至999)中寻找符合条件的整数并依次从小到大存入数组中;它既是完全平方数,又是两位数字相同,例如144、676等。
请编制函数实现此功能,满足该条件的整数的个数通过所编制的函数返回。
最后调用函数writeDat()把结果输出到文件out.dat中。
请勿改动主函数main()和写函数writeDat()的内容。
#include <stdio.h>
int jsValue(int bb[])
{int i,j,k=0;
int hun,ten,data;
for(i=100;i<=999;i++)
{j=10;
while(j*j<=i)
{if(i==j*j)
{ hun=i/100; data=i%100/10; ten=i%10;
if(hun==ten||hun==data||ten==data) bb[k++]=i;
}
j++;
}
}
return k;
}
main()
{
int b[20],num;
num=jsValue(b);
writeDat(num,b);
}
writeDat(int num,int b[])
{
FILE *out;
int i;
out=fopen("out.dat","w");
printf("%d/n",num);
fprintf(out,"%d/n",num);
for(i=0;i<num;i++){printf("%d/n",b[i]);fprintf(out,"%d/n",b[i]);}
fclose(out);
}
另一解法:
int jsValue(int bb[])
{int i,j,cnt=0,bw,sw,gw;
for(i=100;i<=999;i++)
{ bw=i/100; sw=i%100/10; gw=i%10;
for(j=10;j*j<=i;j++)
if(i==j*j&&(bw==sw||sw==gw||gw==bw)) bb[cnt++]=i;
}
return cnt;
}
****************************************
★☆题目25 (回文数问题)
下列程序的功能是:寻找并输出11至999之间的数m,它满足m,m2和m3均为回文数。所谓回文数是指其各位数字左右对称的整数,例如121,676,94249等。满足上述条件的数如m=11,m2=121,m3=1331皆为回文数。请编制函数int svalue(long m)实现此功能,如果是回文数,则函数返回1,反之则返回0。最后把结果输出到文件out.dat中。
注意:部分源程序已给出。
请勿改动主函数main()的内容。
#include <stdio.h>
int jsValue(long n)
{int i,strl,half;
char xy[20];
ltoa(n,xy,10); /*注意这里不能使用itoa()函数,因为n是long 型的*/
strl=strlen(xy);
half=strl/2;
for(i=0;i<half;i++)
if(xy[i]!=xy[--strl]) break;
if(i>=half) return 1;
else return 0;
}
main()
{long m;
FILE *out;
out=fopen("out.dat","w");
for(m=11;m<1000;m++)
{ if(jsValue(m)&&jsValue(m*m)&&jsValue(m*m*m))
{ printf("m=%4ld,m*m=%6ld,m*m*m=%8ld /n",m,m*m,m*m*m);
fprintf(out,"m=%4ld,m*m=%6ld,m*m*m=%8ld /n",m,m*m,m*m*m);
}
}
fclose(out);
system("pause");
}
或者下面的解法:
int jsValue(long n)
{long int s=0,k;
k=n;
while(k)
{ s=s*10+k%10;
k/=10;
}
if(s==n) return 1;
if(s!=n) return 0;
}
输出结果为:
m= 11,m*m= 121,m*m*m= 1331
m= 101,m*m= 10201,m*m*m= 1030301
m= 111,m*m= 12321,m*m*m= 1367631
****************************************
★题目26(id 37 整数统计运算题)
已知在文件IN.DAT中存有若干个(个数<200)四位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组xx中。请编制函数CalValue(),其功能要求:1、求出这文件中共有多少个正整数totNum;2、求这些数右移1位后,产生的新数是偶数的数的个数totCnt,以及满足此条件的这些数(右移前的值)的算术平均值totPjz,最后调用函数writeDat()把所求的结果输出到文件OUT.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include <stdio.h>
#include <conio.h>
#define MAXNUM 200
int xx[MAXNUM];
int totNum=0; /*文件IN.DAT中共有多少个正整数*/
int totCnt=0; /*符合条件的正整数的个数*/
double totPjz=0.0; /*平均值*/
int ReadDat(void);
void writeDat(void);
void CalValue(void)
{int i,data;
for(i=0;i<MAXNUM;i++)
if(xx[i]>0)
{ totNum++;
data=xx[i]>>1;
if(data%2==0){totCnt++;totPjz+=xx[i];}
}
if(totCnt==0) totPjz=0;
else totPjz/=totCnt;
}
void main()
{
int i;
clrscr();
for(i=0;i<MAXNUM;i++)xx[i]=0;
if(ReadDat()){
printf("数据文件IN.DAT不能打开!/007/n");
return;
}
CalValue();
printf("文件IN.DAT中共有正整数=%d个/n",totNum);
printf("符合条件的正整数的个数=%d个/n",totCnt);
printf("平均值=%.2f/n",totPjz);
writeDat();
}
int ReadDat(void)
{
FILE *fp;
int i=0;
if((fp=fopen("IN.DAT","r"))==NULL) return 1;
while(!feof(fp)){
fscanf(fp,"%d,",&xx[i++]);
}
fclose(fp);
return 0;
}
void writeDat(void)
{
FILE *fp;
fp=fopen("OUT.DAT","w");
fprintf(fp,"%d/n%d/n%6.2f/n",totNum,totCnt,totPjz);
fclose(fp);
}
****************************************
★题目27(id 57 整数各位数字运算题)
已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把结果输出到out.dat文件。
例如:9123,9-1-2-3>0,则该数满足条件存入数组b中,且个数cnt=cnt+1。
9812,9-8-1-2>0,则该数不满足条件忽略。
部分源程序存在文件prog1.c中。
程序中已定义数组:a[300],b[300],已定义变量:cnt
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include <stdio.h>
int a[300],b[300],cnt=0;
jsValue()
{ int i,j,qw,bw,sw,gw;
for(i=0;i<300;i++)
{ qw=a[i]/1000; bw=a[i]/100%10;
sw=a[i]%100/10; gw=a[i]%10;
if(qw-bw-sw-gw>0) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if( b[i]>b[j]) { qw=b[i]; b[i]=b[j]; b[j]=qw;}
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf("cnt=%d/n",cnt);
for(i=0;i<cnt;i++) printf("b[%d]=%d/n",i,b[i]);
}
readDat()
{
FILE *fp;
int i;
fp=fopen("in.dat","r");
for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]);
fclose(fp);
}
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);
}
****************************************
★题目28(id 138整数各位打散组合运算题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab-cd>=0且ab-cd<=10且两个数均是奇数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal()
{int i,j,thou,hun,ten,data,ab,cd;
for(i=0;i<200;i++)
{thou=a[i]/1000; hun=a[i]%1000/100;
ten=a[i]%100/10; data=a[i]%10;
ab=10*thou+ten; cd=10*data+hun;
if((ab-cd)>=0&&(ab-cd)<=10&&ab%2==1&&cd%2==1&&ab>=10&&cd>=10)
b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) {thou=b[i]; b[i]=b[j];b[j]=thou;}
}
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) ;
}
****************************************
★题目29(id 139整数各位打散组合运算题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab-cd>=10且ab-cd<=20且两个数均是偶数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。
最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal()
{ int i,j,qw,bw,sw,gw,ab,cd;
for(i=0;i<MAX;i++)
{ qw=a[i]/1000; bw=a[i]/100%10;
sw=a[i]%100/10; gw=a[i]%10;
ab=qw*10+sw; cd=gw*10+bw;
if(ab-cd>=10&&ab-cd<=20&&ab%2==0&&cd%2==0&&qw!=0&&gw!=0)
b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) {qw=b[i];b[i]=b[j];b[j]=qw;}
}
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) ;
}
*****************************************************************************************
题目30(id 152 整数统计排序题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:依次从数组a中取出一个四位数,如果该四位数连续小于该四位数以后的五个数且该数是偶数(该四位数以后不满五个数,则不统计),则统计出满足此条件的个数cnt并把这些四位数按从小到大的顺序存入数组b中,最后调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal()
{int i,j,flag;
for(i=0;i<MAX-5;i++)
{for(j=i+1;j<=i+5;j++)
if(a[i]<a[j]&&a[i]%2==0) flag=1;
else { flag=0; break;}
if(flag==1) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j]) {flag=b[i];b[i]=b[j];b[j]=flag;}
}
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) ;
}
★题目31(id 17 结构体运算题)
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按金额从大到小进行排列,若金额相同,则按产品代码从大到小进行排列, 最终排列结果仍存入结构数组sell中,最后调用函数WriteDat() 把结果输出到文件OUT4.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#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()
{int i,j;
PRO xy;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(sell[i].je<sell[j].je||sell[i].je==sell[j].je&&strcmp(sell[i].dm,sell[j].dm)<0)
{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<MAX;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("OUT4.DAT","w");
for(i=0;i<MAX;i++){
printf("%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
}
****************************************
☆题目32(id 79 结构体运算题)
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相等,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中
,最后调用函数WriteDat()把结果输出到文件OUT7.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#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()
{int i,j;
PRO xy;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(strcmp(sell[i].mc,sell[j].mc)<0||strcmp(sell[i].mc,sell[j].mc)==0&&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()
{
FILE *fp;
int i;
fp=fopen("OUT7.DAT","w");
for(i=0;i<100;i++){
printf("%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
}
*****************************************************************************************
★题目33(id 61 方差运算题)
请编制函数ReadDat()实现从文件IN.DAT中读取1000个十进制整数到数组xx中;请编制函数Compute()分别计算出xx中偶数的个数even,奇数的平均值ave1,偶数的平均值ave2以及方差totfc的值,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。
计算方差的公式如下:
N 2
totfc=1/N∑(xx[i]-ave2)
i=1
设N为偶数的个数,xx[i]为偶数,ave2为偶数的平均值。
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开。(每个数均大于0且小于等于2000)
部分源程序存在文件prog1.c中。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
int xx[MAX],odd=0,even=0;
double ave1=0.0,ave2=0.0,totfc=0.0;
void WriteDat(void);
int ReadDat(void)
{int i;
FILE *fp;
if((fp=fopen("IN.DAT","r"))==NULL) return 1;
/*********编制函数ReadDat()的部分************/
for(i=0;i<MAX;i++)
{ fscanf(fp,"%d,",&xx[i]);
if((i+1)%10==0)
fscanf(fp,"/n"); }
/*******************************************/
fclose(fp);
return 0;
}
void Compute(void)
{ int i,yy[MAX];
for(i=0;i<MAX;i++)
yy[i]=0;
for(i=0;i<MAX;i++)
if(xx[i]%2==0) { yy[even++]=xx[i]; ave2+=xx[i];}
else { odd++; ave1+=xx[i];}
if(odd==0) ave1=0;
else ave1/=odd;
if(even==0) ave2=0;
else ave2/=even;
for(i=0;i<even;i++)
totfc+=(yy[i]-ave2)*(yy[i]-ave2)/even;
}
void main()
{
int i;
for(i=0;i<MAX;i++)xx[i]=0;
if(ReadDat()){
printf("数据文件IN.DAT不能打开!/007/n");
return;
}
Compute();
printf("OVEN=%d/nAVE1=%f/nAVER2=%f/nTOTFC=%f/n",even,ave1,ave2,totfc);
WriteDat();
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("OUT.DAT","w");
fprintf(fp,"%d/n%f/n%f/n%f/n",even,ave1,ave2,totfc);
fclose(fp);
}
*****************************************************************************************
★☆题目34(id 73,102 素数题)
id 102 题提供了求素数isPrime()函数
程序prog1.c的功能是:选出100以上1000之内所有个位数字与十位数字之和被10除所得余数恰是百位数字的素数(如293)。计算并输出上述这些素数的个数cnt以及这些素数值的和sum。 请考生编写函数countValue( )实现程序要求,最后调用函数writeDAT()把结果cnt和sum输出到文件bc10.out中。
注意:部分源程序存放在文件prog1.c中。
请勿改动主函数main( )和输出数据函数writeDAT()的内容。
#include <stdio.h>
int cnt, sum ;
void countValue()
{ int i,j,bw,sw,gw;
for(i=100;i<1000;i++)
{ bw=i/100; sw=i%100/10; gw=i%10;
for(j=2;j<i;j++)
if(i%j==0) break;
if((i==j) &&(gw+sw)%10==bw) { cnt++; sum+=i;}
}
}
void main()
{
cnt=sum=0;
countValue() ;
printf("素数的个数=%d/n", cnt) ;
printf("满足条件素数值的和=%d", sum) ;
writeDAT() ;
}
writeDAT()
{
FILE *fp ;
fp = fopen("bc10.out", "w") ;
fprintf(fp, "%d/n%d/n", cnt, sum) ;
fclose(fp) ;
}
输出结果为:
素数的个数=15
满足条件素数值的和=6825
********************************************************************************************
★☆题目35(id 20 级数运算题)
某级数的前两项A1=1,A2=1,以后各项具有如下关系:
An=An-2+2An-1(注:n-2与n-1为下标)
下列程序prog1.c的功能是:要求依次对于整数M=100,1000和10000求出对应的n值,使其满足:Sn<M且Sn+1>=M,这里Sn=A1+A2+...+An,并依次把n值存入数组单元b[0],b[1]和b[2]中,请编制jsValue()函数来实现此功能, 最后调用函数writeDat()把数组b[]中的值输出到out.dat文件中。
请勿改动主函数main()和写函数writeDat()的内容。
#include <stdio.h>
int b[3];
jsValue()
{int a1=1,a2=1,a12,sn,k=2;
sn=a1+a2;
while(1)
{a12=a1+2*a2;
if(sn<100&&sn+a12>=100) b[0]=k;
if(sn<1000&&sn+a12>=1000) b[1]=k;
if(sn<10000&&sn+a12>=10000) {b[2]=k;break;}
sn=sn+a12;
a1=a2;a2=a12;
k++;
}
}
main()
{
jsValue();
printf("M=100,n=%d/nM=1000,n=%d/nM=10000,n=%d/n",b[0],b[1],b[2]);
writeDat();
}
writeDat()
{
FILE *fp;
fp=fopen("out.dat","w");
printf("%d/n%d/n%d/n",b[0],b[1],b[2]);
fprintf(fp,"%d/n%d/n%d/n",b[0],b[1],b[2]);
fclose(fp);
}
运行结果为:
M=100,n=6
M=1000,n=9
M=10000,n=11
★☆题目36(id 5 字符替换题) 函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件pS6.DAT中。
替代关系:f(p)=p*11 mod 256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或f(p)对应的字符是数字0至9,则该字符不变,否则将f(p)所对应的字符进行替代。 部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于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);
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++) if(xx[i][j]*11%256<=32||xx[i][j]*11%256>='0'&&xx[i][j]*11%256<='9') continue;
else xx[i][j]=xx[i][j]*11%256;
}
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)!=NULL){
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("ps6.dat","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
} fclose(fp);
}
或另一解法:
void encryptChar() {
int i,j,val;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++) {
val=xx[i][j]*11%256;
if(val<=32||val>='0'&&val<='9') continue;
else xx[i][j]=val;
}
}
此题还有许多解法,方法可看题8 *****************************************************************************************
☆题目37(id 89 字符替换题)
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS7.DAT中。
替代关系:f(p)=p*11 mod 256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符是大写字母或计算后f(p)值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。
部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于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);
void encryptChar() {
int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*11%256<=32||xx[i][j]>='A'&&xx[i][j]<='Z') continue;
else xx[i][j]=xx[i][j]*11%256; }
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)!=NULL){
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("ps7.dat","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
} fclose(fp); } 此题还有许多解法,方法可看题8 ***************************************************************************************** ★题目38(id 81 结构体运算题) 已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从小到大进行排列,若产品代码相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT6.DAT中。部分源程序存在文件prog1.c中。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #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() {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||strcmp(sell[i].dm,sell[j].dm)==0&&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("OUT6.DAT","w"); for(i=0;i<100;i++){ printf("%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); } fclose(fp); } ***************************************************************************************** ★☆题目39(id 63 选票问题) 现有一个10个人100行的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推 :内容均为字符0和1,1表示此人被选中,0表示此人未被选中,全选或不选均为无效的选票。给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CountRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中。把结果yy输出到文件OUT.DAT中。部分源程序存在文件prog1.c中。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include <stdio.h> char xx[100][11]; int yy[10]; int ReadDat(void); void WriteDat(void); void CountRs(void) { int i,j,count; for(i=0;i<100;i++) { count=0; for(j=0;j<10;j++) if(xx[i][j]=='1') count++; if(count==0||count==10) continue; for(j=0;j<10;j++) if(xx[i][j]=='1') yy[j]++; } } void main() { int i; for(i=0;i<10;i++)yy[i]=0; if(ReadDat()){ printf("选票数据文件IN.DAT不能打开!/n/007"); return; } CountRs(); WriteDat(); } int ReadDat(void) { FILE *fp; int i; if((fp=fopen("IN.DAT","r")) == NULL) return 1; for(i=0;i<100;i++){ if(fgets(xx[i],11,fp)==NULL)return 1; xx[i][10]='/0'; } fclose(fp); return 0; } void WriteDat(void) { FILE *fp; int i; fp=fopen("OUT.DAT","w"); for(i=0;i<10;i++){ fprintf(fp,"%d/n",yy[i]); printf("第%d个人的选票数=%d/n",i+1,yy[i]); } fclose(fp); } ***************************************************************************************** ★题目40(id 43 整数统计运算题) 已知在文件IN.DAT中存有若干个(个数<200)四位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组xx中。请编制函数CalValue(),其功能要求: 1、求出这文件中共有多少个正整数totNum; 2、求这些数中的各位数字之和是偶数的数的个数totCnt,以及满足此条件的这些数的算术平均值totPjz,最后调用函数writeDat()把所求的结果输出到文件OUT.DAT中。部分源程序存在文件prog1.c中。请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。 #include <stdio.h> #include <conio.h> #define MAXNUM 200 int xx[MAXNUM]; int totNum=0; /*文件IN.DAT中共有多少个正整数*/ int totCnt=0; /*符合条件的正整数的个数*/ double totPjz=0.0; /*平均值*/ int ReadDat(void); void writeDat(void); void CalValue(void) { int i,qw,bw,sw,gw; for(i=0;i<MAXNUM;i++) if(xx[i]>0) { totNum++; qw=xx[i]/1000; bw=xx[i]/100%10; sw=xx[i]%100/10; gw=xx[i]%10; if((qw+bw+sw+gw)%2==0) { totCnt++; totPjz+=xx[i];} } if(totCnt==0) totPjz=0; else totPjz/=totCnt; } void main() { int i; clrscr(); for(i=0;i<MAXNUM;i++)xx[i]=0; if(ReadDat()){ printf("数据文件IN.DAT不能打开!/007/n"); return; } CalValue(); printf("文件IN.DAT中共有正整数=%d个/n",totNum); printf("符合条件的正整数的个数=%d个/n",totCnt); printf("平均值=%.2f/n",totPjz); writeDat(); } int ReadDat(void) { FILE *fp; int i=0; if((fp=fopen("IN.DAT","r"))==NULL) return 1; while(!feof(fp)){ fscanf(fp,"%d,",&xx[i++]); } fclose(fp); return 0; } void writeDat(void) { FILE *fp; fp=fopen("OUT.DAT","w"); fprintf(fp,"%d/n%d/n%6.2f/n",totNum,totCnt,totPjz); fclose(fp); } ************************************************************************* ★☆题目41(id 51 SIX/NINE问题) 下列程序prog1.c的功能是:计算出自然数SIX和NINE,它们满足的条件是SIX+SIX+SIX=NINE+NINE的个数cnt以及满足此条件所有的SIX与NINE的和SUM。请编写函数countValue()实现程序的要求,最后调用函数writeDat()把结果cnt和sum,输出到文件OUT15.DAT中。其中的S,I,X,N,E各代表一个十进制数字。部分源程序存在文件prog1.c中。请勿改动主函数main()和输出数据函数writeDat()的内容。 #include <stdio.h> int cnt,sum; void countValue() { int s,i,x,n,e,six,nine; for(s=1;s<10;s++) for(i=0;i<10;i++) for(x=0;x<10;x++) for(n=1;n<10;n++) for(e=0;e<10;e++) { six=s*100+i*10+x; nine=n*1000+i*100+n*10+e; if(3*six==2*nine) { cnt++;sum+=six+nine;} } } void main() { cnt=sum=0; countValue(); printf("满足条件的个数=%d/n",cnt); printf("满足条件所有的SIX与NINE的和=%d/n",sum); writeDat(); } writeDat() { FILE *fp; fp=fopen("OUT15.DAT","w"); fprintf(fp,"%d/n%d/n",cnt,sum); fclose(fp); } 另一种经典解法: void countValue() { int i; for(i=666;i<=999;i=i+2) if((i/10%10==(3*i/2)/100%10)&&((3*i/2)/1000==(3*i/2)%100/10)) {cnt++;sum+=i+3*i/2;} } 运算结果为:满足条件的个数=4 满足条件所有的SIX与NINE的和=9430 ******************************************************************************************** 题目42 结构体运算题跟南开12一样,只是将“从小到大”改成了“从大到小” 已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相等,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT5.DAT中。部分源程序存在文件prog1.c中。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #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() {int i,j; PRO xy; for(i=0;i<99;i++) for(j=i+1;j<100;j++) if(strcmp(sell[i].mc,sell[j].mc)<0||strcmp(sell[i].mc,sell[j].mc)==0&&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() { FILE *fp; int i; fp=fopen("OUT5.DAT","w"); for(i=0;i<100;i++){ printf("%s %s %4d %5d %5d/n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); } fclose(fp); } ***************************************************************************************** ☆题目43(id 82 字符排序题)id 82题(只是将结果按“从大到小”排序) 函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串变量的下标为奇数的字符按其ASCII值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。 例如:位置 0 1 2 3 4 5 6 7 源字符串 a b c d e f g h 则处理后字符串 a h c f e d g b 部分源程序存在文件prog1.c中。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #include <stdio.h> #include <string.h> #include <conio.h> char xx[20][80]; void jsSort() {int i,j,k,strl; char ch; for(i=0;i<20;i++) { strl=strlen(xx[i]); for(j=1;j<strl-2;j=j+2) for(k=j+2;k<strl;k=k+2) if(xx[i][j]>xx[i][k]) { ch=xx[i][j];xx[i][j]=xx[i][k];xx[i][k]=ch;} } } void main() { readDat(); jsSort(); writeDat(); } readDat() { FILE *in; int i=0; char *p; in=fopen("in.dat","r"); while(i<20&&fgets(xx[i],80,in)!=NULL){ p=strchr(xx[i],'/n'); if(p)*p=0; i++; } fclose(in); } writeDat() { FILE *out; int i; out=fopen("out.dat","w"); clrscr(); for(i=0;i<20;i++){ printf("%s/n",xx[i]); fprintf(out,"%s/n",xx[i]); } fclose(out); } ***************************************************************************************** 题目44(id 4字符串左右排序交换题 ) 函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。 条件:从字符串中间一分为二,左边部分按字符的ASCII值降序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。 例如:位置 0 1 2 3 4 5 6 7 8 源字符串 a b c d h g f e 1 2 3 4 9 8 7 6 5 则处理后字符串 h g f e d c b a 8 7 6 5 9 4 3 2 1 部分源程序存在文件prog1.c中。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #include <stdio.h> #include <string.h> #include <conio.h> char xx[20][80]; void jsSort() { int i,j,k,strl,half; char temp; for(i=0;i<20;i++) { strl=strlen(xx[i]); half=strl/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=strl-1;j>=0;j--,k--) { temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp;} } } void main() { readDat(); jsSort(); writeDat(); } readDat() { FILE *in; int i=0; char *p; in=fopen("in.dat","r"); while(i<20&&fgets(xx[i],80,in)!=NULL){ p=strchr(xx[i],'/n'); if(p)*p=0; i++; } fclose(in); } writeDat() { FILE *out; int i; clrscr(); out=fopen("out.dat","w"); for(i=0;i<20;i++){ printf("%s/n",xx[i]); fprintf(out,"%s/n",xx[i]); } fclose(out); } **************************************** 题目45(id 154数字统计排序题 ) 已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:依次从数组a中取出一个四位数,如果该四位数连续大于该四位数以前的五个数且该数是偶数(该四位数以前不满五个数,则不统计),则统计出满足此条件的个数cnt并把这些四位数按从大到小的顺序存入数组b中,最后调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。注意:部分源程序存在文件prog1.c中。程序中已定义数组:a[200],b[200],已定义变量:cnt 请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。 #include <stdio.h> #define MAX 200 int a[MAX], b[MAX], cnt = 0 ; void jsVal() {int i,j,flag; for(i=5;i<MAX;i++) {for(j=i-5;j<i;j++) if(a[i]>a[j]&&a[i]%2==0) flag=1; else { flag=0; break;} if(flag==1) b[cnt++]=a[i]; } for(i=0;i<cnt-1;i++) for(j=i+1;j<cnt;j++) if(b[i]<b[j]) {flag=b[i];b[i]=b[j];b[j]=flag;} } 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) ; } ***************************************************************************************** ★☆题目46(id 153 数字统计排序题 ) 已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:依次从数组a中取出一个四位数,如果该四位数连续大于该四位数以前的五个数且该数是奇数,且该数必须能被7整除(该四位数以前不满五个数,则不统计),则统计出满足此条件的个数cnt并把这些四位数按从大到小的顺序存入数组b中,最后调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。注意:部分源程序存在文件prog1.c中。程序中已定义数组:a[200],b[200],已定义变量:cnt 请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。 #include <stdio.h> #define MAX 200 int a[MAX], b[MAX], cnt = 0 ; void jsVal() { int i,j,flag; for(i=5;i<MAX;i++) { for(j=i-5;j<i;j++) if(a[i]>a[j]&&a[i]%2&&a[i]%7==0) flag=1; else { flag=0;break;} if(flag==1) b[cnt++]=a[i]; } for(i=0;i<cnt-1;i++) for(j=i+1;j<cnt;j++) if(b[i]<b[j]) { flag=b[i]; b[i]=b[j]; b[j]=flag;} } 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) ; } ****************************************☆题目47(id 76结构体运算题 ) 已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按金额从大到小进行排列,若金额相等,则按产品代码从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT3.DAT中。部分源程序存在文件prog1.c中。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #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() {int i,j; PRO xy; for(i=0;i<99;i++) for(j=i+1;j<100;j++) if(sell[i].je<sell[j].je||sell[i].je==sell[j].je&&strcmp(sell[i].dm,sell[j].dm)>0) {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() { FILE *fp; int i; fp=fopen("OUT3.DAT","w"); for(i=0;i<100;i++){ printf("%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); } fclose(fp); } ******************************************************************************************** 题目48(id 60整数各位数字运算题 ) 已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加个位数上的数等于百位数上的数加十位数上的数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把结果输出到out.dat文件。例如:6712,6+2=7+1,则该数满足条件存入数组b中,且个数cnt=cnt+1。 8129,8+9<>1+2,则该数不满足条件忽略。部分源程序存在文件prog1.c中。程序中已定义数组:a[300],b[300],已定义变量:cnt 请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。 #include <stdio.h> int a[300],b[300],cnt=0; jsValue() {int i,qw,bw,sw,gw,j; for(i=0;i<300;i++) {qw=a[i]/1000; bw=a[i]%1000/100; sw=a[i]%100/10; gw=a[i]%10; if(qw+gw==bw+sw) b[cnt++]=a[i]; } for(i=0;i<cnt-1;i++) for(j=i+1;j<cnt;j++) if(b[i]>b[j]) {qw=b[i]; b[i]=b[j]; b[j]=qw;} } main() { int i; readDat(); jsValue(); writeDat(); printf("cnt=%d/n",cnt); for(i=0;i<cnt;i++) printf("b[%d]=%d/n",i,b[i]); } readDat() { FILE *fp; int i; fp=fopen("in.dat","r"); for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]); fclose(fp); } 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); } ****************************************★题目49(id 33 整数各位数字运算题 ) 已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数减百位数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及不满足此条件的四位数平均值pjz2,最后调用写函数writeDat()把结果输出到out.dat文件。例如:9123,9-1-2-3>0,则该数满足条件计算平均值pjz1,且个数cnt=cnt+1。9812,9-8-1-2<0,则该数不满足条件计算平均值pjz2。部分源程序存在文件prog1.c中。程序中已定义数组:a[300],已定义变量:cnt,pjz1,pjz2。请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。 #include <stdio.h> int a[300],cnt=0; double pjz1=0.0,pjz2=0.0; jsValue() {int i,qw,bw,sw,gw,n=0; for(i=0;i<300;i++) {qw=a[i]/1000; bw=a[i]%1000/100; sw=a[i]%100/10; gw=a[i]%10; if(qw-bw-sw-gw>0) {cnt++;pjz1+=a[i];} else {n++;pjz2+=a[i];} } if(cnt==0) pjz1=0; else pjz1/=cnt; if(n==0) pjz2=0; else pjz2/=n; } main() { int i; readDat(); jsValue(); writeDat(); printf("cnt=%d/n满足条件的平均值pzj1=%7.2f/n不满足条件的平均值pzj2=%7.2f/n",cnt,pjz1,pjz2); } readDat() { FILE *fp; int i; fp=fopen("in.dat","r"); for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]); fclose(fp); } writeDat() { FILE *fp; int i; fp=fopen("out.dat","w"); fprintf(fp,"%d/n%7.2f/n%7.2f/n",cnt,pjz1,pjz2); fclose(fp); } ****************************************★题目50(id 2 字符串左右排序交换题 ) 函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。 条件:从字符串中间一分为二,左边部分按字符的ASCII值升序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。 例如:位置 0 1 2 3 4 5 6 7 8 源字符串 d c b a h g f e 4 3 2 1 9 8 7 6 5 则处理后字符串 h g f e a b c d 8 7 6 5 9 1 2 3 4 部分源程序存在文件prog1.c中。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 #include <stdio.h> #include <string.h> #include <conio.h> char xx[20][80]; void jsSort() { int i,j,k,strl,half; char temp; for(i=0;i<20;i++) { strl=strlen(xx[i]); half=strl/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=strl-1;j>=0;j--,k--) { temp=xx[i][j]; xx[i][j]=xx[i][k]; xx[i][k]=temp;} } } void main() { readDat(); jsSort(); writeDat(); } readDat() { FILE *in; int i=0; char *p; in=fopen("in.dat","r"); while(i<20 && fgets(xx[i],80,in)!=NULL){ p=strchr(xx[i],'/n'); if(p) *p=0; i++; } fclose(in); } writeDat() { FILE *out; int i; clrscr(); out=fopen("out.dat","w"); for(i=0;i<20;i++){ printf("%s/n",xx[i]); fprintf(out,"%s/n",xx[i]); } fclose(out); } ****************************************
题目51(id 134 整数各位打散组合运算题)
没有提供求素数函数isprime() ,可自己编制
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把千位数字和十位数字重新组成一个新的十位数(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数均是素数且新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
int isprime(int m)
{int i;
for(i=2;i<=m/2;i++)
if(m%i==0) return 0;
return 1;
}
void jsVal()
{int i,j,qw,bw,sw,gw;
int ab,cd;
for(i=0;i<200;i++)
{qw=a[i]/1000; bw=a[i]%1000/100;
sw=a[i]%100/10; gw=a[i]%10;
ab=10*qw+sw; cd=10*gw+bw;
if(isprime(ab)&&isprime(cd)&&ab>=10&&cd>=10) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) {qw=b[i];b[i]=b[j];b[j]=qw;}
}
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) ;
}
*****************************************************************************************
★题目52(id 135 整数各位打散组合运算题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把千位数字和个位数字重新组成一个新的十位数(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的个位数字),以及把百位数字和十位数字组成另一个新的十位数(新十位数的十位数字是原四位数的百位数字,新十位数的个位数字是原四位数的十位数字),如果新组成的两个十位数均是奇数并且两个十位数中至少有一个数能被5整除,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal()
{int i,thou,hun,ten,data,j;
int ab,cd;
for(i=0;i<MAX;i++)
{thou=a[i]/1000; hun=a[i]%1000/100;
ten=a[i]%100/10; data=a[i]%10;
ab=10*thou+data; cd=10*hun+ten;
if(ab%2&&cd%2&&(ab%5==0||cd%5==0)&&ab>=10&&cd>=10) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) {data=b[i];b[i]=b[j];b[j]=data;}
}
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) ;
}
****************************************★题目53(id 57 整数各位数字运算题)
已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把结果输出到out.dat文件。
例如:9123,9-1-2-3>0,则该数满足条件存入数组b中,且个数cnt=cnt+1。
9812,9-8-1-2>0,则该数不满足条件忽略。
部分源程序存在文件prog1.c中。
程序中已定义数组:a[300],b[300],已定义变量:cnt
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include <stdio.h>
int a[300],b[300],cnt=0;
jsValue()
{ int i,j,qw,bw,sw,gw;
for(i=0;i<300;i++)
{ qw=a[i]/1000; bw=a[i]/100%10;
sw=a[i]%100/10; gw=a[i]%10;
if((qw-bw-sw-gw)>0) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j]) { qw=b[i];b[i]=b[j];b[j]=qw;}
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf("cnt=%d/n",cnt);
for(i=0;i<cnt;i++) printf("b[%d]=%d/n",i,b[i]);
}
readDat()
{
FILE *fp;
int i;
fp=fopen("in.dat","r");
for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]);
fclose(fp);
}
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);
}
****************************************☆题目54(id 58 整数各位数运算排序题)
已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从大到小的顺序进行排序,最后调用写函数writeDat()把结果输出到out.dat文件。
例如:7153,7+1=5+3,则该数满足条件存入数组b中,且个数cnt=cnt+1。
8129,8+1<>2+9,则该数不满足条件忽略。
部分源程序存在文件prog1.c中。
程序中已定义数组:a[300],b[300],已定义变量:cnt
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include <stdio.h>
int a[300],b[300],cnt=0;
jsValue()
{ int i,j,qw,bw,sw,gw;
for(i=0;i<300;i++)
{ qw=a[i]/1000; bw=a[i]/100%10;
sw=a[i]%100/10; gw=a[i]%10;
if(qw+bw==sw+gw) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) { qw=b[i];b[i]=b[j];b[j]=qw;}
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf("cnt=%d/n",cnt);
for(i=0;i<cnt;i++) printf("b[%d]=%d/n",i,b[i]);
}
readDat()
{
FILE *fp;
int i;
fp=fopen("in.dat","r");
for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]);
fclose(fp);
}
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);
}
****************************************★☆题目55(id 35 素数统计排序题)
已知数据文件in.dat中存有300个四位数,并已调用读函数ReadDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序,最后调用写函数writeDat()把结果输出到out.dat文件。
例如:5591是素数,则该数满足条件存入数组b中,且个数cnt=cnt+1。9812是非素数,则该数不满足条件忽略。
部分源程序存在文件prog1.c中。
程序中已定义数组:a[300],b[300],已定义变量:cnt
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include <stdio.h>
int a[300],b[300],cnt=0;
int isP(int m){
int i;
for(i=2;i<m;i++)
if(m%i==0)return 0;
return 1;
}
jsValue()
{int i,j,value;
for(i=0;i<300;i++)
if(isP(a[i])) b[cnt++]=a[i];
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j]) {value=b[i]; b[i]=b[j]; b[j]=value;}
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf("cnt=%d/n",cnt);
for(i=0;i<cnt;i++) printf("b[%d]=%d/n",i,b[i]);
}
readDat()
{
FILE *fp;
int i;
fp=fopen("in.dat","r");
for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i]);
fclose(fp);
}
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);
}
****************************************
题目56(id 87 字符替换题)
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS5.DAT中。
替代关系:f(p)=p*11mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或f(p)对应的字符是小写字母,则该字符不变,否则将f(p)所对应的字符进行替代。
部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于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);
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*11%256<=32||xx[i][j]*11%256>='a'&&xx[i][j]*11%256<='z') continue;
else xx[i][j]=xx[i][j]*11%256;
}
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)!=NULL){
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("ps5.dat","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
}
fclose(fp);
}
另一解法:
void encryptChar()
{ int i,j, tem;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
{ tem=xx[i][j]*11%256;
if(tem<=32||tem>='a'&&tem<='z') continue;
else xx[i][j]=tem;
}
}
这里中间变量tem可以定义为:int、 unsigned char、unsigned int ,但千万别将中间变量tem设为了char型。
此题还有许多解法,方法可看题8
*****************************************************************************************
★☆题目57(id 109 出圈题)
设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每10人一组,给出这n个人的顺序表。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出
到文件JOSE.OUT中。
设 n = 100, s = 1,m = 10。
(1) 将1到n个人的序号存入一维数组p中;
(2) 若第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置;
(3) 重复第(2)步直至圈中只剩下p[1]为止。
注意:部分源程序存放在文件prog1.c中。
请勿改动主函数main()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#define N 100
#define S 1
#define M 10
int p[100], n, s, m ;
void WriteDat(void) ;
void Josegh(void)
{ int i,j,s1,w;
s1=s;
for(i=1; i<=n; i++)
p[i-1]=i;
for(i=n; i>=2; i--)
{ s1=(s1+m-1)%i;
if(s1==0) s1=i;
w=p[s1-1];
for(j=s1; j<i; j++)
p[j-1]=p[j];
p[i-1]=w;
}
}
void main()
{
m = M ;
n = N ;
s = S ;
Josegh() ;
WriteDat() ;
}
void WriteDat(void)
{
int i ;
FILE *fp ;
fp = fopen("jose.out", "w") ;
for(i = N - 1 ; i >= 0 ; i--) {
printf("%4d ", p[i]) ;
fprintf(fp, "%4d", p[i]) ;
if(i % 10 == 0) {
printf("/n") ;
fprintf(fp, "/n") ;
}
}
fclose(fp) ;
}
此题的另一种形式(实际上机的考试题)
设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数, 报数到第m个人, 此人出圈, 再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,给出这n个人的顺序表p。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈的顺序输出到OUT.DAT文件中。
注意:第1个出圈的编号存放在p[0]中,第2个出圈的编号存放在p[1]中,直至第n个出圈的编号存放在p[n-1]中。
设 n = 100, s = 1, m = 10进行编程。
注意: 部分源程序存放在PROG1.C中。
请勿改动主函数main()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#define N 100
#define S 1
#define M 10
int p[100], n, s, m ;
void WriteDat(void) ;
void Josegh(void)
{ int i,j,s1,w,q[100];
for(i=0;i<n;i++) q[i]=0;
s1=s;
for(i=1; i<=n; i++) p[i-1]=i;
for(i=n; i>=2; i--)
{ s1=(s1+m-1)%i;
if(s1==0) s1=i;
w=p[s1-1];
for(j=s1; j<i; j++) p[j-1]=p[j];
p[i-1]=w;
}
/*由于上面的解法是倒着存放出圈数,以下采用两个循环的是将数组p中的数据倒过来以实现题意要求,即:第1个出圈的编号存放在p[0]中,第2个出圈的编号存放在p[1]中,直至第n个出圈的编号存放在p[n-1]中。*/
for(i=0,j=n-1;i<n,j>=0;i++,j--) /*也可改为for(i=0,j=n-1;i<n;i++,j--) */
q[j]=p[i];
for(i=0;i<n;i++)
p[i]=q[i];
}
void main()
{
m = M ;
n = N ;
s = S ;
Josegh() ;
WriteDat() ;
}
void WriteDat(void) /*注意两种题中此函数的区别*/
{
int i, j = 0 ;
FILE *fp ;
fp = fopen("out.dat", "w") ;
for(i = 0 ; i <= N - 1 ; i++) {
printf("%4d ", p[i]) ;
fprintf(fp, "%4d", p[i]) ;
j++ ;
if(j % 10 == 0) {
printf("/n") ;
fprintf(fp, "/n") ;
}
}
fclose(fp) ;
}
*****************************************************************************************
★☆题目58(id 31 选票问题)
现有一个10个人100行的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推:内容均为字符0和1,1表示此人被选中,0表示此人未被选中,若一张选票人数小于等于5个人时被认为无效的选票。给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CountRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中。把结果yy输出到文件OUT.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#include <stdio.h>
char xx[100][11];
int yy[10];
int ReadDat(void);
void WriteDat(void);
void CountRs(void)
{ int i,j,count;
for(i=0;i<100;i++)
{ count=0;
for(j=0;j<10;j++)
if(xx[i][j]=='1') count++;
if(count<=5) continue;
for(j=0;j<10;j++)
if(xx[i][j]=='1') yy[j]++;
}
}
void main()
{
int i;
for(i=0;i<10;i++)yy[i]=0;
if(ReadDat()){
printf("选票数据文件IN.DAT不能打开!/n/007");
return;
}
CountRs();
WriteDat();
}
int ReadDat(void)
{
FILE *fp;
int i;
if((fp=fopen("IN.DAT","r")) == NULL) return 1;
for(i=0;i<100;i++){
if(fgets(xx[i],12,fp)==NULL)return 1;
xx[i][10]='/0';
}
fclose(fp);
return 0;
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("OUT.DAT","w");
for(i=0;i<10;i++){
fprintf(fp,"%d/n",yy[i]);
printf("第%d个人的选票数=%d/n",i+1,yy[i]);
}
fclose(fp);
}
****************************************
★☆题目59(id 141整数各位打散组合运算题题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把千位数字和十位数字重新组成一个新的十位数ab(新十位数的十位数字是原四位数的千位数字,新十位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab<cd,ab必须是奇数且不能被5整除,cd必须是偶数,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal()
{int i,thou,hun,ten,data,j;
int ab,cd;
for(i=0;i<MAX;i++)
{thou=a[i]/1000; hun=a[i]/100%10;
ten=a[i]%100/10; data=a[i]%10;
ab=10*thou+ten; cd=10*data+hun;
if(((ab-cd)<0&&ab%2==1&&ab%5!=0)&&cd%2!=1&&ab>=10&&cd>=10)
{b[cnt]=a[i];cnt++;}
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) {data=b[i];b[i]=b[j];b[j]=data;}
}
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) ;
}
***************************************
题目60(id 84 整数运算排序题)
在文件in.dat中有200组数据,每组有3个数,每个数均是三位数。函数ReadDat()读取这200组数据存放到结构数组aa中,请编制函数jsSort(),其函数的功能是:要求在200组数据中找出条件为每组中的第二个数大于第一个数加第三个数的之和,其中满足条件的组数作为函数jsSort() 的返回值,同时把满足条件的数据存入结构数组bb中,再对bb中的数据按照每组数据的第二个数加第三个之和的大小进行降序排列(第二个数加第三个数的和均不相等),排序后的结果仍重新存入结构数组bb中,最后调用函数WriteDat()把结果bb输出到文件out.dat中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
typedef struct{
int x1,x2,x3;
}data;
data aa[200],bb[200];
int jsSort()
{int i, j, cnt=0;
data ch;
for(i=0;i<200;i++)
if(aa[i].x2>aa[i].x1+aa[i].x3) bb[cnt++]=aa[i];
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(bb[i].x2+bb[i].x3<bb[j].x2+bb[j].x3) { ch=bb[i];bb[i]=bb[j];bb[j]=ch;}
return cnt;
}
void main()
{
int count;
readDat();
count=jsSort(); /*返回满足条件的个数*/
writeDat(count);
}
readDat()
{
FILE *in;
int i;
in=fopen("in.dat","r");
for(i=0; i<200; i++)
fscanf(in,"%d %d %d",&aa[i].x1,&aa[i].x2,&aa[i].x3);
fclose(in);
}
writeDat(int count)
{
FILE *out;
int i;
out=fopen("out.dat","w");
clrscr();
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 %d %d/n",bb[i].x1,bb[i].x2,bb[i].x3);
}
fclose(out);
}
*****************************************************************************************
题目61(id 19结构体运算题)
已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按金额从小到大进行排列,若金额相同,则按产品代码从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT2.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#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()
{int i,j;
PRO xy;
for(i=0;i<99;i++)
for(j=i+1;j<100;j++)
if(sell[i].je>sell[j].je||sell[i].je==sell[j].je&&strcmp(sell[i].dm,sell[j].dm)<0)
{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("OUT2.DAT","w");
for(i=0;i<100;i++){
printf("%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
fprintf(fp,"%s %s %4d %5d %5d/n", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
}
****************************************
题目62(id 9 字符替换题)
id 9 题条件微有不同,解法在后面给出
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS2.DAT中。
替代关系:f(p)=p*13 mod 256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或其ASCII值是偶数,则该字符不变,否则将f(p)所对应的字符进行替代。
部分源程序存在文件prog1.c中。原始数据文件存放的格式是:每行的宽度均小于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);
void encryptChar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*13%256<=32||(xx[i][j]*13%256)%2==0) continue;
else xx[i][j]=xx[i][j]*13%256;
}
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)!=NULL){
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("ps2.dat","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
}
fclose(fp);
}
void encryptChar() /*如果计算后f(p)值小于等于32或原字符ASCII值是偶数*/
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*13%256<=32||xx[i][j]%2==0) continue;
else xx[i][j]=xx[i][j]*13%256;
}
此题还有许多解法,方法可看题8
****************************************
★☆题目63(id 67、94 字符串移位题)
程序prog1.c的功能是:把 s 字符串中的所有字符左移一个位置,串中的第一个字符移到最后。请考生编写函数chg(char *s)实现程序要求,最后调用函数readwriteDAT( )把结果输出到bc2.out文件中。
例如:s字符串中原有内容为:Mn.123xyZ,则调用该函数后,结果为:n.123xyZM。
注意:部分源程序存在文件prog1.c文件中。
请勿改动主函数main( )和输出数据函数readwriteDAT()的内容。
#include <conio.h>
#include <stdio.h>
#define N 81
void readwriteDAT();
void chg(char *s)
{ int i;
char ch=*s;
for(i=0;i<strlen(s)-1;i++)
s[i]=s[i+1];
s[strlen(s)-1]=ch;
}
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);
readwriteDAT();
}
void readwriteDAT()
{
int i ;
char a[N] ;
FILE *rf, *wf ;
rf = fopen("bc2.in", "r") ;
wf = fopen("bc2.out", "w") ;
for(i = 0 ; i < 50 ; i++) {
fscanf(rf, "%s", a) ;
chg(a) ;
fprintf(wf, "%s/n", a) ;
}
fclose(rf) ;
fclose(wf) ;
}
****************************************
★题目64(id 22 素数题)
下列程序的功能是:找出所有100以内(含100)满足I,I+4,I+10都是素数的整数I(I+10也在100以内)的个数cnt以及这些I之和sum。请编写函数countValue()实现程序要求的功能,最后调用函数writeDat()把结果cnt和sum输出到文件out.dat中。部分源程序存在文件prog1.c中。请勿改动主函数main()和输出数据函数writeDat()的内容。
#include <stdio.h>
int cnt,sum;
int isPrime(int number) {
int i,tag=1;
for(i=2;tag && i<=number / 2; i++)
if(number % i ==0) tag =0;
return tag;
}
void countValue() {
int i;
for(i=2;i<=90;i++)
if(isPrime(i)&&isPrime(i+4)&&isPrime(i+10)) {
cnt++;
sum+=i;
}
}
void main() {
cnt=sum=0;
countValue();
printf("满足条件的整数的个数=%d/n",cnt);
printf("满足条件的整数的和值=%d/n",sum); writeDat();
}
writeDat() {
FILE *fp;
fp=fopen("out.dat","w");
fprintf(fp,"%d/n%d/n",cnt,sum);
fclose(fp);
}
运行结果为:满足条件的整数的个数=7 满足条件的整数的和值=201 ****************************************
★☆题目65(id 45 整数统计运算题)
已知在文件IN.DAT中存有若干个(个数<200)四位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组xx中。
请编制函数CalValue(),
其功能要求:1、求出这文件中共有多少个正整数totNum;
2、求这些数中的各位数字之和是奇数的数的个数totCnt,以及满足此条件的这些数的算术平均值totPjz,最后调用函数writeDat()把所求的结果输出到文件OUT.DAT中。
部分源程序存在文件prog1.c中。请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include <stdio.h>
#include <conio.h>
#define MAXNUM 200
int xx[MAXNUM];
int totNum=0; /*文件IN.DAT中共有多少个正整数*/
int totCnt=0; /*符合条件的正整数的个数*/
double totPjz=0.0; /*平均值*/
int ReadDat(void);
void writeDat(void);
void CalValue(void) {
int i ,qw,bw,sw,gw;
for(i=0;i<MAXNUM;i++)
if(xx[i]>0) {
totNum++;
qw=xx[i]/1000;
bw=xx[i]/100%10;
sw=xx[i]%100/10;
gw=xx[i]%10;
if((qw+bw+sw+gw)%2) {
totCnt++;
totPjz+=xx[i];
}
}
if(totCnt==0) totPjz=0;
else totPjz/=totCnt;
}
void main() {
int i;
clrscr();
for(i=0;i<MAXNUM;i++)xx[i]=0;
if(ReadDat()){
printf("数据文件IN.DAT不能打开!/007/n");
return;
}
CalValue();
printf("文件IN.DAT中共有正整数=%d个/n",totNum);
printf("符合条件的正整数的个数=%d个/n",totCnt);
printf("平均值=%.2f/n",totPjz);
writeDat();
}
int ReadDat(void) {
FILE *fp; int i=0;
if((fp=fopen("IN.DAT","r"))==NULL) return 1;
while(!feof(fp)){ fscanf(fp,"%d,",&xx[i++]);
}
fclose(fp);
return 0;
}
void writeDat(void) {
FILE *fp; fp=fopen("OUT.DAT","w");
fprintf(fp,"%d/n%d/n%6.2f/n",totNum,totCnt,totPjz);
fclose(fp);
} ****************************************
★☆题目66(id 47 素数题)
下列程序prog1.c的功能是:计算500-800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,再计算其间隔加、减之和,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数...的值sum。
请编写函数countValue()实现程序的要求,最后调用函数writeDat()把结果cnt和sum,输出到文件OUT11.DAT中。部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include <stdio.h>
int cnt,sum;
void countValue() {
int i,j,k=1;
for(i=800;i>500;i--) {
for(j=2;j<i;j++)
if(i%j==0) break;
if(j==i) {
cnt++;
sum=sum+k*i;
k=k*(-1);
}
}
}
void main() {
cnt=sum=0;
countValue();
printf("素数的个数=%d/n",cnt);
printf("按要求计算的值=%d/n",sum);
writeDat();
}
writeDat() {
FILE *fp;
fp=fopen("OUT11.DAT","w");
fprintf(fp,"%d/n%d/n",cnt,sum);
fclose(fp);
}
****************************************
题目67(id 49 整数各位数字运算题)
下列程序的功能是:选出5000以下符合条件的自然数。
条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出这些四位自然数的个数cnt以及这些数的和sum。
请编写函数countValue()实现程序的要求,最后调用函数writeDat()把结果cnt和sum,输出到文件OUT13.DAT中。部分源程序存在文件prog1.c中。
请勿改动主函数main()和输出数据函数writeDat()的内容。
#include <stdio.h>
int cnt,sum;
void countValue() {
int i,thou,hun,ten,data;
for(i=1000;i<5000;i++) {
thou=i/1000;
hun=i%1000/100;
ten=i%100/10;
data=i%10;
if(thou+hun==ten+data&&thou+hun==(data-thou)*10) {
cnt++;
sum+=i;
}
}
}
void main() {
cnt=sum=0;
countValue();
printf("满足条件的自然数的个数=%d/n",cnt);
printf("满足条件的自然数的个数之和=%d/n",sum);
writeDat();
}
writeDat() {
FILE *fp;
fp=fopen("OUT13.DAT","w");
fprintf(fp,"%d/n%d/n",cnt,sum);
fclose(fp);
}
****************************************
★☆题目68(id 142 整数各位数字统计运算题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:如果四位数各位上的数字均是奇数,则统计出满足此条件的个数cnt并把这些四位数按从大到小的顺序存入数组b中。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal() {
int i,j,thou,hun,ten,data;
for(i=0;i<200;i++) {
thou=a[i]/1000;
hun=a[i]%1000/100;
ten=a[i]%100/10;
data=a[i]%10;
if(thou&&thou%2&&hun%2&&ten%2&&data%2) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) {thou=b[i]; b[i]=b[j];b[j]=thou;}
}
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) ;
}
****************************************
☆题目69(id 145 整数统计运算题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把一个四位数的千位数字上的值减去百位数字上的值再减去十位数字上的值最后减去个位数字上的值,如果得出的值大于等于零且原四位数是奇数,则统计出满足此条件的个数cnt并把这些四位数按从小到大的顺序存入数组b中,最后调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt 请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;
void jsVal() {
int i,j,thou,hun,ten,data;
for(i=0;i<200;i++) {
thou=a[i]/1000;
hun=a[i]%1000/100;
ten=a[i]%100/10;
data=a[i]%10;
if(thou-hun-ten-data>=0&&a[i]%2) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j]) {
thou=b[i]; b[i]=b[j];b[j]=thou;
}
}
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) ;
}
****************************************
题目70(id 41 整数统计运算题)
已知在文件IN.DAT中存有若干个(个数<200)四位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组xx中。
请编制函数CalValue(),其功能要求:
1、求出这文件中共有多少个正整数totNum;
2、求这些数右移1位后,产生的新数是奇数的数的个数totCnt,以及满足此条件的这些数(右移前的值)的算术平均值totPjz,最后调用函数writeDat()把所求的结果输出到文件OUT.DAT中。
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include <stdio.h>
#include <conio.h>
#define MAXNUM 200 int xx[MAXNUM];
int totNum=0; /*文件IN.DAT中共有多少个正整数*/
int totCnt=0; /*符合条件的正整数的个数*/
double totPjz=0.0; /*平均值*/
int ReadDat(void);
void writeDat(void);
void CalValue(void) {
int i,data;
for(i=0;i<MAXNUM;i++)
if(xx[i]>0) {
totNum++;
data=xx[i]>>1;
if(data%2){totCnt++;totPjz+=xx[i];}
}
if(totCnt==0) totPjz=0;
else totPjz/=totCnt;
}
void main() {
int i;
clrscr();
for(i=0;i<MAXNUM;i++)xx[i]=0;
if(ReadDat()){
printf("数据文件IN.DAT不能打开!/007/n");
return;
}
CalValue();
printf("文件IN.DAT中共有正整数=%d个/n",totNum);
printf("符合条件的正整数的个数=%d个/n",totCnt);
printf("平均值=%.2f/n",totPjz); writeDat();
}
int ReadDat(void) {
FILE *fp;
int i=0;
if((fp=fopen("IN.DAT","r"))==NULL) return 1;
while(!feof(fp)){ fscanf(fp,"%d,",&xx[i++]); }
fclose(fp);
return 0;
}
void writeDat(void) {
FILE *fp;
fp=fopen("OUT.DAT","w");
fprintf(fp,"%d/n%d/n%6.2f/n",totNum,totCnt,totPjz);
fclose(fp);
}
****************************************
☆题目71(id 6 字符串左右排序题)
函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。
条件:从字符串中间一分为二,左边部分按字符的ASCII值降序排序,右边部分按字符的ASCII值升序排序。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上。
例如:位置 0 1 2 3 4 5 6 7 8
源字符串 a b c d h g f e 1 2 3 4 9 8 7 6 5
则处理后字符串 d c b a e f g h 4 3 2 1 9 5 6 7 8
部分源程序存在文件prog1.c中。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[20][80];
void jsSort() {
int i,j,k,strl,half;
char ch;
for(i=0;i<20;i++) {
strl=strlen(xx[i]);
half=strl/2;
for(j=0;j<half-1;j++)
for(k=j+1;k<half;k++)
if(xx[i][j]<xx[i][k]) {
ch=xx[i][j];xx[i][j]=xx[i][k];xx[i][k]=ch;
}
if(strl%2) half++;
for(j=half;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() {
readDat();
jsSort();
writeDat();
}
readDat() {
FILE *in;
int i=0;
char *p;
in=fopen("in.dat","r");
while(i<20&&fgets(xx[i],80,in)!=NULL){
p=strchr(xx[i],'/n');
if(p)*p=0; i++;
}
fclose(in);
}
writeDat() {
FILE *out;
int i;
clrscr();
out=fopen("out.dat","w");
for(i=0;i<20;i++){
printf("%s/n",xx[i]);
fprintf(out,"%s/n",xx[i]);
}
fclose(out);
}
****************************************
★☆题目72(id 136 整数各位打散组合运算题)
已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:把个位数字和千位数字重新组成一个新的十位数(新十位数的十位数字是原四位数的个位数字,新十位数的个位数字是原四位数的千位数字),以及把百位数字和十位数字组成另一个新的十位数(新十位数的十位数字是原四位数的百位数字,新十位数的个位数字是原四位数的十位数字),如果新组成的两个十位数均是偶数并且两个十位数中至少有一个数能被9整除,同时两个新数的十位数字均不为零,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数cnt。最后main()函数调用写函数writeDat( )把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。程序中已定义数组:a[200],b[200],已定义变量:cnt 请勿改动数据文件IN.DAT中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200 int a[MAX], b[MAX], cnt = 0 ;
void jsVal() {
int i,j,thou,hun,ten,data,ab,cd;
for(i=0;i<200;i++) {
thou=a[i]/1000;
hun=a[i]/100%10;
ten=a[i]%100/10;
data=a[i]%10;
ab=10*data+thou;
cd=10*hun+ten;
if((ab%9==0||cd%9==0)&&ab%2==0&&cd%2==0&&hun!=0&&data!=0) {
b[cnt]=a[i];cnt++;
}
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) {
data=b[i];
b[i]=b[j];
b[j]=data;
}
}
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) ;
}
****************************************
★题目73(id 26 字符替换题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数ConverCharD(),其函数的功能是:以行为单位把字符串中的所有小写字母改写成该字母的上一个字母,如果是字母a,则改写成字母z。大写字母仍为大写字母,小写字母仍为小写字母,其它字符不变。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT4.DAT中。
例:原文:Adb.Bcdza abck.LLhj 结果:Aca.Bbcyz zabj.LLgi 原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。部分源程序存在文件prog1.c中。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void ConvertCharD(void) {
int i,j;
for(i=0;i<maxline;i++) {
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]=='a') xx[i][j]='z';
else if(xx[i][j]>='b'&&xx[i][j]<='z') xx[i][j]-=1;
}
}
void main() {
clrscr();
if(ReadDat()){
printf("数据文件IN.DAT不能打开!/n/007");
return;
}
ConvertCharD();
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("OUT4.DAT","w");
for(i=0;i<maxline;i++){
printf("%s/n",xx[i]);
fprintf(fp,"%s/n",xx[i]);
}
fclose(fp);
}
****************************************
题目74(id 70 字符ASCII值移位替换题)
函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrCharJL(),其函数的功能是:以行为单位把字符串中的所有字符的ASCII值左移4位,如果左移后,其字符的ASCII值小于等于32或大于100,则原字符保持不变,否则就把左移后的字符ASCII值再加上原字符ASCII值,得到新的字符仍存入原字符串对应的位置上。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT7.DAT中。原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。部分源程序存在文件prog1.c中。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char xx[50][80];
int maxline=0;/*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void StrCharJL(void) {
int i,j;
char c;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++) {
c=xx[i][j]<<4;