2022年自学考试《C语言程序设计》练习题及答案12
【3.56】下面程序的功能是根据命令行参数分别实现一个正整数的累加或阶乘。例如:如果可执行文件的文件名是sm,则执行该程序时输入:'sm+10',可以实现10的累加;输入:'sm-10',可以实现求10的阶乘。
#include
#include
main(int argc,char*argv[])
{int n;
void sum(),mult();
void(*funcp)();
n=atoi(argv[2]);
if(argc!=3||n<=0)
dispform();
switch(①)
{case'+':funcp=sum;
break;
case'-':funcp=mult;
break;
default:dispform();
}
②;
}
void sum(int m)
{int i,s=0;
for(i=1;i
③;
printf('sum=%dn',s);
}
void mult(int m)
{long int i,s=1;
for(i=1;i<=m;i++)
s*=i;
printf('mult=%ldn';s);
}
dispform()
{printf('usage:sm n(+/!)(n>0)n');
exit(0);
}
【3.57】下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。
#include
main()
{char str[100];
int i=0;
FILE*fp;
if((fp=fopen('test.txt',①))==NULL)
{printf('Can't open the file.n');
exit(0);
}
printf('Input a string:n');
gets(str);
while(str)
{if(str>='a'&&str<='z')
str=②;
fputc(str,fp);
i++;
}
fclose(fp);
fp=fopen('test.txt',③);
fgets(str,strlen(str)+1,fp);
printf('%sn',str);
fclose(fp);
}
【3.58】下面程序的功能是将从终端上读入的10个整数以二进制方式写入名为'bi.dat'的新文件中。
#include
FILE*fp;
main()
{int i,j;
if((fp=fopen(①,'wb'))==NULL)
exit(0);
for(i=0;i<10;i++)
{scanf('%d',&j);
fwrite(②,sizeof(int),1,③);
}
fclose(fp);
}
【3.59】以字符流形式读入一个文件,从文件中检索出六种C语言的关键字,并统计、输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或't'、'n'结束的字符串。
#include
#include
FILE*cp;
char fname[20],buf[100];
int num;
struct key
{char word[10];
int count;
}keyword[]={'if',0,'char',0,'int',0,
'else',0,'while',0,'return',0};
char*getword(FILE*fp)
{int i=0;
char c;
while((c=getc(fp))!=EOF&&(c==''||c=='t'||c=='n'));
if(c==EOF)return(NULL);
else buf[i++]=c;
while((c=①&&c!=''&&c!='t'&&c!='n')
buf[i++]=c;
buf='';
return(buf);
}
lookup(char*p)
{int i;
char*q,*s;
for(i=0;i
{q=②;
s=p;
while(*s&&(*s==*q))
{③
}
if(④)
{keyword.count++;
break;
}
}
return;
}
main()
{int i;
char*word;
printf('Input file name:');
scanf('%s',fname);
if((cp=fopen(fname,'r'))==NULL)
{printf('File open error:%sn',fname);
exit(0);
}
num=sizeof(keyword)/sizeof(struct key);
while(⑤)
lookup(word);
fclose(cp);
for(i=0;i
printf('keyword:%-20scount=%dn',keyword.word,keyword.count);
}
【3.60】下面程序的功能是从键盘接受姓名(例如:输入'ZHANG SAN'),在文件'try.dat'中查找,若文件中已经存入了刚输入的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该姓名存入文件。要求:⑴若磁盘文件'try.dat',已存在,则要保留文件中原来的信息;若文件'try.dat'不存在,则在磁盘上建立一个新文件;⑵当输入的姓名为空时(长度为0),结束程序。
#include
main()
{FILE*fp;
int flag;
char name[30],data[30];
if((fp=fopen('try.dat',①))==NULL)
{printf('Open file errorn');
exit(0);
}
do
{printf('Enter name:');
gets(name);
if(strlen(name)==0)
break;
strcat(name,'n');
②;
flag=1;
while(flag&&(fgets(data,30,fp)③))
if(strcmp(data,name)==0)
④;
if(flag)
fputs(name,fp);
else
printf('tData enter error!n');
}while(⑤);
fclose(fp);
}
【程序填空题参考答案】
【3.56】答案:①*argv[1]②(*funcp)(n)③s+=i
注释:程序执行时输入的命令及参数的个数(操作系统规定用空格表示字符串的分隔)由系统赋给主函数的形数argc,输入的命令和参数以字符串的格式保存,字符串的首地址分别赋给指针数组argv的各个元素,其中argv[1]是'+'或'-',分别表示累加或阶乘。程序根据argv[1]所指向的字符串的内容给指向函数的指针变量funcp赋值。②处要求的语句是根据指向函数的指针变量的内容对相应的函数实现调用,所以选择A或B是错误的;据funcp是被调函数的地址,*funcp实现了对函数的调用,根运算符的结合性,(*funcp)表示取funcp的目标,而*funcp(n)则funcp先和(n)结合,funcp就被解释为函数名,显然是错误的。
【3.57】答案:①'w'②-32③'r'
【3.58】答案:①'bi.dat'②&j③fp
【3.59】答案:①fgetc(fp))!=EOF②&keyword<i>.word[0]
③s++;q++;④*s==*q⑤(word=getword(cp))!=NULL
【3.60】答案:①'a+'②rewind(fp)③!=NULL④flag=0⑤ferror(fp)==0
热门推荐:
自考有疑问、不知道如何选择主考院校及专业、不清楚自考当地政策,点击立即了解》》
推荐阅读: