资源描述
六、编程题参考答案
1.编程,统计在所输入的50个实数中有多少个正数、多少个负数、多少个零。
#include "stdio.h"
#define N 50
void main()
{ float x; unsigned int s1,s2,s3,i;
s1=s2=s3=0;
for(i=1;i<=N;i++) {
scanf("%f",&x);
if(x<0) s1++; else if(x==0) s2++; else s3++;
}
printf("负数%u个,零%u个,正数%u个\n",s1,s2,s3);
}
2. 编程,计算并输出方程 X2+Y2=1989 的所有整数解。
#include "stdio.h"
void main()
{ int x,y;
for(x=-45;x<=45;x++) {
y=-45;
while(y<=45) {
if(x*x+y*y==1989)
printf("%d*%d+%d*%d=%d\n",x,x,y,y,1989);
y++;
}
}
}
3.编程,输入一个10进制正整数,然后输出它所对应的八进制、十六进制数。
#include "stdio.h"
void main()
{ unsigned int x;
printf("请输入一个十进制正整数:");
scanf("%u",&x);
printf("%d=八进制数 %o=十六进制数%x\n",x,x,x);
}
4.编程,找出1000以的所有完数,并输出其因子。
#include "stdio.h"
void main()
{ int i,j,s=1;
for(i=1;i<=1000;i++,s=1) {
for(j=2;j<=i/2;j++) if(i%j==0) s+=j; // 求 i的因子和
if(s==i) {
printf("%d=1",i); // 如果i 是完数则输出其各因子
for(j=2;j<=i/2;j++)
if(i%j==0) printf("+%d",j);
printf("\n");
}
}
}
5. 输入一个正整数,输出它的所有质数因子。
#include "stdio.h"
void main()
{ int m,i=2;
printf("请输入一个整数:"); scanf("%d",&m);
while(m!=1) if(m%i==0){ printf("%d ",i); m/=i; } else i++;
printf("\n");
}
6. 输入20个整数,输出其中能被数组中其它元素整除的那些数组元素。
#include "stdio.h"
#define N 20
void main()
{ int a[N],i,j;
for(i=0;i<N;i++) scanf("%d",&a[i]);
for(i=0;i<N;i++) for(j=0;j<N;j++)
if(a[i]%a[j]==0&&i!=j) { printf("%d\n",a[i]); break; }
}
7. 输入两个数组(数组元素个数自定),输出在两个数组中都出现的元素。
#include "stdio.h"
#define NA 6
#define NB 8
void main()
{ float a[NA],b[NB]; int i,j;
for(i=0;i<NA;i++) scanf("%f",&a[i]);
for(i=0;i<NB;i++) scanf("%f",&b[i]);
for(i=0;i<NA;i++) for(j=0;j<NB;j++)
if(a[i]==b[j]) { printf("%f\n",a[i]); break; }
}
8. 输入两个数组(数组元素个数自定),输出在两个数组中都不出现的元素。
#include "stdio.h"
#define NA 6
#define NB 8
void main()
{ float a[NA],b[NB]; int i,j;
for(i=0;i<NA;i++)scanf("%f",&a[i]);
for(i=0;i<NB;i++)scanf("%f",&b[i]);
for(i=0;i<NA;i++) {
for(j=0;j<NB;j++) if(a[i]==b[j]) break;
if(j==NB) printf("%f ",a[i]);
}
printf("\n");
for(i=0;i<NB;i++) {
for(j=0;j<NA;j++) if(b[i]==a[j]) break;
if(j==NA) printf("%f ",b[i]);
}
printf("\n");
}
9.编程,将字符数组S2中的全部字符拷贝到字符数组S1中。
#include "stdio.h"
void main()
{ char s1[20],s2[]="Good morning!"; int i=0;
while((s1[i++]=s2[i])!='\0');
printf("%s\n",s1);
}
10.给定年份year,判别该年份是否闰年(定义一个宏以判别该年份是否闰年)。
#include <stdio.h>
#define f(year) year%4==0&&year%100!=0||year%400==0
void main()
{ int y;
printf("请输入年份:"); scanf("%d",&y);
if(f(y)) printf("%d 年为闰年\n",y);
else printf("%d 年不是闰年\n",y);
}
11.输入一行小写字母后,或输出原文,或将字母变成其下一字母(a变成b、b变成c、…、x变成y、y变成z、z变成a)输出,用条件编译方法实现以上选择。
#include <stdio.h>
#define MAX 80
#define SWITCH 1
void main()
{ char str[MAX]; int i=0;
printf("请输入文本行:\n"); scanf("%s",str);
#if(SWITCH)
while(str[i]!='\0')
if(str[i]>='a'&&str[i]<='z')
if(str[i]=='z')str[i]='a'; else str[i]++; i++;
#endif
printf("%s\n",str);
}
12. 编写函数,处理n行n列维数组:将每一行的元素同除以该行上绝对值最大的元素。
#include "stdio.h"
#include "math.h"
void div(float** a,int n)
{ int i,j; float x;
for(i=0;i<n;i++) {
x=*(*(a+i));
for(j=1;j<n;j++)
if(fabs(*(*(a+i)+j))>fabs(x)) x=*(*(a+i)+j);
for(j=0;j<n;j++) *(*(a+i)+j)/=x;
}
return;
}
void main() // 函数引用示例
{ float b[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int i,j; float* c[3];
for(i=0;i<3;i++) c[i]=b[i]; div(c,3);
for(i=0;i<3;i++) {
for(j=0;j<3;j++) printf("%f ",b[i][j]); printf("\n");
}
}
13. 编写函数,求任意阶多项式 a0+a1X+a2X2+...+anXn 的值并返回多项式的值。
#include "stdio.h"
float f1(float* a,float x,int n)
{ int i; float t=1,y=0;
for(i=0;i<n;i++) { y+=*(a+i)*t; t*=x; }
return y;
}
void main() // 函数引用示例
{ float b[4]={1,2,3,4};
printf("%f\n",f1(b,2,4));
}
14. 设计一个函数,使给出一个数的原码,能得到该数的补码。
#include <stdio.h> // 假定sizeof(int)为2;
unsigned int getbit(unsigned int value) //第1位为0表示数的原码,
{ if(value>>15) return (value^0x7fff)+1; //其补码即其原码;若value
else return value; //右移15位后为1,表示value是负数的原码,负数
} //的补码为原码按位取反(第1位不变)后加1。
void main()
{ unsigned int y=0x800c,k;
k=getbit(y); printf("%x\n",k);
}
15. 编写函数,求m行、n列的二维数组全体元素中负数的个数。
#include <stdio.h>
int sum(float **a,int m,int n)
{ int i,j; int y=0;
for(i=0;i<m;i++) for(j=0;j<n;j++) if(*(*(a+i)+j)<0) y++;
return y;
}
void main() // 函数引用示例
{ float b[2][3]={{-1,2,-3},{4,-5,-6}}; int i; float* c[2];
for(i=0;i<2;i++) c[i]=b[i]; printf("%d\n",sum(c,2,3));
}
16. 编写函数,返回在一个整数组中出现次数最多的数与其出现次数。
#include <stdio.h>
void fun(float *a,int n,int *k,float *x)
{ int i,j,y; *k=0;
for(i=0;i<n;i++) { y=0;
for(j=0;j<n;j++) if(*(a+i)==*(a+j)) y++;
if(y>*k) { *k=y; *x=*(a+i); }
}
return;
}
void main() // 函数引用示例
{ float c[10]={0,4,2,4,3,2,4,-3,1.5,7.6},t; int m;
fun(c,10,&m,&t); // 若说明float *t; int *m;
printf("元素%f出现次数为%d\n",t,m); // 引用为 fun(c,10,m,t) 将
} // 产生悬挂指针的错误,即t、m不只指向确定的存储单元。
17.编一个程序,打入月份号,输出该月的英文月名,要求用指针数组处理。
#include <stdio.h>
void main()
{ char *month_name[12]={"January","February","March","April",
"May", "June","July","August","September","October",
"Novenber","December"};
int n;
printf("请输入月份号:");
scanf("%d",&n);
if(n<1||n>12) printf("月份号输入错误!\n");
else printf("%d月的英文表示是%s\n",n,month_name[n-1]);
}
18.编写递归函数,将输入的以“?”结束的字符串按与输入相反的顺序输出。
#include <stdio.h>
void pline()
{ char ch;
if((ch=getchar())!='?') { pline(); putchar(ch); }
return;
}
void main() // 函数引用示例
{ pline(); printf("\n"); }
19. 编写函数,在n个元素的一维数组中,统计比相邻元素大的数组元素个数并将统计数返回(不考虑a[0]和a[n-1]),要求以指针变量而不是数组名作参数。
#include <stdio.h>
int num(float *x,int n)
{ int i,k=0;
for(i=1;i<n-1;i++) if(*(x+i)>*(x+i-1)&&*(x+i)>*(x+i+1)) k++;
return k;
}
void main() // 函数引用示例
{ float a[10]={1,3,4,2,6,7,12,5,9,8};
printf("%d\n",num(a,10));
}
20. 编写函数,在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。
#include <stdio.h>
void num(float *b,int n,float *max,float *min)
{ *max=*b; *min=*b;
for(int i=1;i<n;i++) {
if(*(b+i)>*max) *max=*(b+i);
if(*(b+i)<*min) *min=*(b+i);
}
return;
}
void main() // 函数引用示例
{ float a[10]={1,3,4,2,6,7,12,5,9,8},x,y;
num(a,10,&x,&y); printf("最大值为%f,最小值为%f。\n",x,y);
}
21. 编写一个函数,统计m行n列二维数组中有多少个正数、多少个负数,多少个零,并
返回统计结果。
#include <stdio.h>
void sub(float** a,int m,int n,int *fs,int *lin,int *zs)
{ int i,j; *fs=*lin=*zs=0;
for(i=0;i<m;i++) for(j=0;j<n;j++)
if(*(*(a+i)+j)<0) (*fs)++;
else if(*(*(a+i)+j)==0) (*lin)++; else (*zs)++;
return;
}
void main() // 函数引用示例
{ float b[5][3]={{-1,5,2},{3,0,-2},{0,-3,5},
{4,7,-8},{3,4,5}},*c[5];
int i,k1,k2,k3;
for(i=0;i<5;i++) c[i]=b[i]; sub(c,5,3,&k1,&k2,&k3);
printf("负数%d个,零%d个,正数%d个。\n",k1,k2,k3);
}
22. 编写函数,在给定的一行以'.'结束的字符中,找出最长的单词并输出。
#include <stdio.h>
void find(char *str)
{ char *p1,*p2,*p3; int k1=0,k2=0; // k1为最长串的长度,初值为0。
p1=p2=p3=str; // p3指向最长串首字符,p1指向当前处理串首字符,
while(*p2!='.') // p2为移动指针,*p2为空格表示查找到单词尾部。
if(*p2!=' ') { k2++; p2++; }
else if(k2>k1) { p3=p1; p1=++p2; k1=k2; k2=0; }
else { k2=0; p1=++p2; }
for(k2=0;k2<=k1;k2++) printf("%c",*(p3+k2));
printf("\n"); return;
}
void main() // 函数引用示例
{ char a[40]; int i=0;
while((a[i++]=getchar())!='.'); find(a);
}
23. 编写函数print,打印一个学生的成绩数组,该数组中有若干个学生的数据记录,每个记录包括num,name,score[3]。
#include <stdio.h>
struct student {
char num[7],name[9];int score[3];
}; // 尾部分号不得遗漏
void print(struct student* s,int n)
{ int i; // 运算符'*'、'&'的优先级均低于运算符'.'
for(i=0;i<n;i++)
printf("%s %s %4d%4d%4d\n",(*(s+i)).num,(*(s+i)).name,
(*(s+i)).score[0],(*(s+i)).score[1],(*(s+i)).score[2]);
return;
}
void main()
{ struct student t[4]; int i;
for(i=0;i<4;i++)
scanf("%s%s%d%d%d",&t[i].num,&t[i].name,&t[i].score[0],
&t[i].score[1],&t[i].score[2]);
print(t,4);
}
24. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中的英文字符。
#include <stdio.h>
void main()
{ FILE *fpd1,*fpd2; char ch;
fpd1=fopen("d1.dat","r"); fpd2=fopen("d2.dat","w");
while(fscanf(fpd1,"%c",&ch)!=EOF)
if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')
fprintf(fpd2,"%c",ch);
fclose(fpd1); fclose(fpd2);
}
25. 编程,把文本文件d1.dat复制到d2.dat(其中空格字符不复制)。
#include <stdio.h>
void main()
{ FILE *fpd1,*fpd2; char ch;
fpd1=fopen("d1.dat","r"); fpd2=fopen("d2.dat","w");
while(fscanf(fpd1,"%c",&ch)!=EOF)
if(ch!=' ') fprintf(fpd2,"%c",ch);
fclose(fpd1); fclose(fpd2);
}
26. 编程,把文本文件d1.dat复制到d2.dat(其写英文字母要转换为小写字母)。
#include <stdio.h>
void main()
{ FILE *fpd1,*fpd2; char ch;
fpd1=fopen("d1.dat","r"); fpd2=fopen("d2.dat","w");
while(fscanf(fpd1,"%c",&ch)!=EOF) {
if(ch>='A'&&ch<='Z') ch=ch+32;
fprintf(fpd2,"%c",ch);
}
fclose(fpd1); fclose(fpd2);
}
27. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中除英文字符和数字以外的其它容。
#include <stdio.h>
void main()
{ FILE *fpd1,*fpd2; char ch;
fpd1=fopen("d1.dat","r"); fpd2=fopen("d2.dat","w");
while(fscanf(fpd1,"%c",&ch)!=EOF)
if(!(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'||ch>='0'&&ch<='9'))
fprintf(fpd2,"%c",ch);
fclose(fpd1); fclose(fpd2);
}
28. 求出1至100之间的素数(只能被1和自身整除的数)并顺序写入文件su.dat。
#include <stdio.h>
#include <math.h>
void main()
{ FILE *fp; int i,j,k=2;
fp=fopen("su.dat","w"); fprintf(fp,"%4d%4d",2,3);
for(i=5;i<100;i=i+2) {
for(j=3;j<=sqrt(i);j=j+2) if(i%j==0) break;
if(j>sqrt(i)) { fprintf(fp,"%4d",i); k++;
if(k%10==0) fprintf(fp,"\n"); }
}
fclose(fp);
}
29.磁盘文件a1和a2,各自存放一个已按字母顺序排好的字符串,编程合并二个文件到a3
文件中,合并后仍保持字母顺序。
#include <stdio.h>
#include <math.h>
void main()
{ FILE *fp1,*fp2,*fp3; int i,j,k; char c1,c2;
fp1=fopen("a1","r"); fp2=fopen("a2","r");
// 首先从文件a1、a2中各读入一个字符分别送入变量c1、c2,下面将作
// 循环比较,直到读到文件尾标志为止。
fp3=fopen("a3","w"); c1=fgetc(fp1); c2=fgetc(fp2);
do {
if(c1<c2){ fputc(c1,fp3);c1=fgetc(fp1); }
else { fputc(c2,fp3); c2=fgetc(fp2); }
} while(!feof(fp1)&&!feof(fp2));
// 若a1先读到文件尾,则将c2写入a3,再将a2中其它字符读入后写入a3;...
if(feof(fp1)) do {
fputc(c2,fp3); c2=fgetc(fp2);
} while(!feof(fp2)) ;
else do { fputc(c1,fp3); c1=fgetc(fp1);
} while(!feof(fp1)) ;
fclose(fp1); fclose(fp2); fclose(fp3);
}
30.顺序文件C.DAT每个记录包含学号(8位字符)和成绩(三位整数)两个数据项。从文件读入学生成绩,将大于或等于60分的学生成绩再形成一个新的文件SCORE60.DAT保存在A盘上,并显示出学生总人数、平均成绩和与格人数。
#include <stdio.h>
#include <math.h>
void main()
{ FILE *fp1,*fp2; char s[9]; int x,zrs=0,pjcj=0,jgrs=0;
fp1=fopen("c.dat","r"); fp2=fopen("a:score60.dat","w");
fscanf(fp1,"%s%d",s,&x);
do {
zrs++; pjcj+=x;
if(x>=60) { jgrs++; fprintf(fp2,"%s %d\n",s,x); }
fscanf(fp1,"%s%d",s,&x);
} while(!feof(fp1));
printf("总人数:%d 平均成绩:%d 与格人数:%d\n",zrs,pjcj/zrs,jgrs);
fclose(fp1); fclose(fp2);
}
31.程序清单:
typedef int datatype;
typedef struct node
{datatype data;
struct node *next;
}linklist;
……
INVERT(linklist *head)
{linklisk *p,*q;
p=head->next;
if(p!=NULL)
{head->next=NULL;
do
{q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
while(p!=NULL);
}
}
32.程序清单:
PURGE(linklist *head)
{linklist *p,*q;
q=head->next;
if(q==NULL)return;
p=q->next;
while(p!=NULL)
if(p->data==q->data)
{q=p->next;
free(p);
p=q->next;
}
else
{q=p;
p=p->next;
}
}
33、程序清单:
#include <stdio.h>
main()
{static char x[]=”computer”;
char *p;
for(p=x;p<x+7;p+=2)putchar(*p);
printf(“\n”);
}
34、#include <stdio.h>
#include <string.h>
main()
{int m;
char str[80],str2[80];
printf(“input a string:\n”);
gets(str2);
printf(“intput m:\n);
scanf(“%d”,&m);
if(strlen(str2)<m)
printf(“err input!\n”);
else
{copystr(str1,str2,m);
printf(“rsult is :%s\n”,str1);
}
}
copystr(char *p1,char *p2,int m)
{int n=0;
while(n<m-1)
{p2++;
n++;
}
while(*p2!=’\0’)
{*p1=*p2;p1+=;
p2++;
}
*p1=’\0’;
}
35、程序清单:
float search(float (pointer)[4],int n)
{float *pt;
pt=*(pointer+n);
return(pt);
}
36、Main()
{int score[][4]={{60,76,80,90},{45,86,57,90},{58,95,80,71},{78,50,60,85}};
int (*p)[4],j,k,flag;
p=score;
for(j=0,j<4;j++)
if(*(*(p+j)+k)<60)flag=1;
if(flag==1)
{printf(“NO.%dis fail,svoreare:\n”,j);
for(k=0,;k<4;k++)
printf(“%5d”, *(*(p+j)+k);
printf(“\n”);
}
}
37、程序清单:
main()
{int b[16],x,k,r,I;
printf(“enter a integer :\n”):
scanf(“%d”,&x);
printf(%6d’s binary number is:\n”,x);
k=-1;
do
{r=x%2;
k++;
*(b+k;
x/=2;
}while(x!=0
for(I=k;I>=0;I--)
printf(“%d”,*(b+i)
printf(“\n”);
}
38、float p(int n,int x)
{flaot t,t1,t2;
展开阅读全文