《高级语言程序设计》参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 输入两个整数,要求用两个函数求出其最大公约数和最小公倍数,最大公约数和最小公倍数都在主函数中输出。
如:输入36和60,输出为:zdgys=12,zxgbs=180
#include<stdio.h>
int main()
{
int i,j,t;
int max(int,int);
int min(int,int);
scanf("%d%d",&i,&j);
if(i<j)
{t=i;i=j;j=t;}
printf("zdgys=%d,zxgbs=%d\n",max(i,j),min(i*j,max(i,j)));
return 0;
}
int max(int i,int j)
{
int t;
while(j)
{
t=i%j;
i=j;
j=t;
}
return i;
}
int min(int p,int q)
{
return p/q;
}
又解:
#include<stdio.h>
int main()
{
int i,j,t;
int max(int,int);
int min(int,int);
scanf("%d%d",&i,&j);
if(i<j)
{t=i;i=j;j=t;}
printf("zdgys=%d,zxgbs=%d\n",max(i,j),min(i*j,max(i,j)));
return 0;
}
int max(int i,int j)
{
int n;
for(n=j;n>=2;n--)
if ((i%n==0) && (j%n==0)) break;
return n;
}
int min(int p,int q)
{
return p/q;
}
2. 输入4个整数,找出其中最大的数。
用函数的嵌套调用来处理。
#include<stdio.h>
int max2(int a,int b)
{
return(a>b?a:b);
}
int max4(int a,int b,int c,int d)
{
return max2(max2(max2(a,b),c),d);
}
int main()
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("max=%d\n",max4(a,b,c,d));
return 0;
}
3. 用递归调用的方法求n!。
如:输入为5,输出为5!=120。
#include<stdio.h>
int main()
{
int fac(int);
int n;
scanf("%d",&n);
printf("%d!=%d\n",n,fac(n));
return 0;
}
int fac(int n)
{
int c;
if ((n==0||n==1))
c=1;
else
c=fac(n-1)*n;
return c;
}
4. 按以下递归公式求函数的值。
⎩⎨⎧>+-==)
1(2)1()1(10 fun(n)n n fun n 例如,当给n 输入5时,输出为result is 18,(要求用递归实现,并且输入和输出都要在主函数中实现)。
#include<stdio.h>
int main()
{
int fun(int);
int n;
scanf("%d",&n);
printf("result is %d\n",fun(n));
return 0;
}
int fun(int n)
{
int c;
if(n==1)
c=10;
else
c=fun(n-1)+2;
return c;
}
5. 用递归法将一个整数n 转换成字符串。
(n 为不超过6为的整数)如输入为483,输出为:转换后的字符串为:483;如输入为-13579,输出为:转换后的字符串为:-13579。
注意:输入和输出都要在主函数中实现。
#include<stdio.h>
int i=0;
char st[6];
void main()
{void fun(int);
int n;
scanf("%d",&n);
if (n<0)
{n=-n; st[i++]='-';}
fun(n);
st[i]=0;
printf("转换后的字符串为:%s\n",st);
}
void fun(int m)
{
if(m/10)
fun(m/10);
st[i++]=m%10+48;
}
又解:
#include<stdio.h>
void main()
{void fun(int,char []);
int n;
char st[6];
scanf("%d",&n);
fun(n,st);
printf("转换后的字符串为:%s\n",st);
}
void fun(int m,char st[])
{ static int i=0;
if (m<0) {st[i++]='-';m=-m;}
if(m/10) fun(m/10,st);
st[i++]=m%10+48;
st[i]='\0';
}
6. 写一个函数,完成将任意一个数组中的值按逆序重新存放。
(数组长度不超过6位)
要求:数组内容的内容输入和重新存放后的输出都要在主函数中实现。
如:输入内容为5个整数,分别为8 6 5 4 1,重新存放后输出为:the result is 1,4,5,6,8。
#include<stdio.h>
#define N 6
void fun(int a[],int n)
{
int t,i;
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-1-i];
a[n-1-i]=t;
}
}
int main()
{ int a[N],i,n;
printf("input array length:");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
fun(a,n);
printf("the result is :");
for(i=0;i<n;i++)
printf("%d,",a[i]);
return 0;
}
7. 编写一个函数,用来分别求数组score_1(有5个元素)和数组score_2(有10个元素)各元素的平均值。
要求:输入和输出都要在主函数中实现。
如:输入第一个数组内容为:1 2 3 4 5,第二个数组内容为:2 4 6 8 10 12 14 16 18 20,输出分别为3和11。
#include<stdio.h>
float fun(int c[],int n)
{
float aver=0;
for(int i=0;i<n;i++)
aver+=c[i];
return aver/n;
}
int main()
{
int score_1[5],score_2[10],i;
for(i=0;i<5;i++)
scanf("%d",&score_1[i]);
for(i=0;i<10;i++)
scanf("%d",&score_2[i]);
printf("average of score_1:%f\n",fun(score_1,5));
printf("average of score_2:%f\n",fun(score_2,10));
return 0;
}
8. 编写一个函数,实现将两个字符串连接起来,并在main函数中调用此函数,不要调用系统提供的strcat函数。
(两个个字符串长度之和不超过100)
如输入第一个字符串为I LOVE,第二个字符串为:my motherland,则输出为I LOVE my motherland。
#include<stdio.h>
int main()
{
void connect(char [],char []);
char s1[100],s2[100];
gets(s1); gets(s2);
connect(s1,s2); puts(s1);
return 0;
}
void connect(char st1[],char st2[])
{
int i=0,k=0;
while(st1[++i]);
while(st1[i++]=st2[k++]); //循环次数?
}
又解:
#include<stdio.h>
#include <string.h>
int main()
{
void connect(char [],char []);
char s1[100],s2[100];
gets(s1); gets(s2);
connect(s1,s2); puts(s1);
return 0;
}
void connect(char st1[],char st2[])
{
strcpy(st1+strlen(st1)-1,st2);
}
9. 编写完成fun函数,比较两个字符串的大小,并在main函数中调用此函数,不要调用strcmp 函数。
要求:输入和输出都要在主函数中实现。
如:根据输入不同输入内容,对应输出“两个字符串相等”、“第一个字符串大”、“第二个字符串大”。
#include<stdio.h>
#include <string.h>
int fun(char a[],char b[])
{
int i;
for(i=0;i<strlen(a) || i<strlen(b);i++)
if (a[i]>b[i]) return 0;
else if (a[i]<b[i]) return 1;
return 2;
}
int main()
{
char a[100],b[100],i;
gets(a);
gets(b);
i=fun(a,b);
switch(i)
{case 0:printf("第一个字符串大\n");break;
case 1:printf("第二个字符串大\n");break;
default:printf("两个字符串相等\n");
return 0;
}
10. 编写一个函数,实现在一个升序排列的整型数组{1,3,5,7,14,23,45,87,155,231};中插入任意一个整数的功能,保持整型数组仍然升序排列,并在main函数中调用此函数,输入数据和最后输出都在主函数中实现。
#include<stdio.h>
int a[11]={1,3,5,7,14,23,45,87,155,231};
int main()
{
int c,i;
void fun(int a[],int c);
printf("input an integer:");
scanf("%d",&c);
fun(a,c);
for(i=0;i<11;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
void fun(int a[],int t)
{
int i,j;
if(t>a[9])
a[10]=t;
else
{
for(i=0;i<11;i++)
if(t<a[i]) break;
for(j=10;j>i;j--)
a[j]=a[j-1];
a[i]=t;
}
}
11. 写一个判断素数的函数,在主函数输入一个整数,是素数时输出yes,否则输出no,结果要求在主函数中输出。
#include<stdio.h>
int main()
{
int a;
int is_prime(int);
scanf("%d",&a);
if(is_prime(a))
printf("yes\n");
printf("no\n");
return 0;
}
int is_prime(int a)
{
int i;
for(i=2;i<a;i++)
{
if(a%i==0) break;
}
return (i>=a);
}
12. 编写一个函数,将一个字符串中的原音字母赋值到另一个字符串中,并在main函数中调用此函数,输入数据和最后输出都在主函数中实现。
#include<stdio.h>
char a[50],b[50]={0};
int main()
{
void fun(char a[],char b[]);
gets(a);
fun(a,b);
puts(b);
return 0;
}
void fun(char a[],char b[])
{
int i,j;
for(i=0,j=0;a[i]!='\0';i++)
if(a[i]=='a'||a[i]=='A'||a[i]=='e'||a[i]=='E'||a[i]=='i'||a[i]=='I'||a[i]=='o'||a[i]=='O'||a[i]=='u'||a[i]== 'U')
b[j++]=a[i];
}
13. 建立动态数组,输入5个学生的成绩,统计低于60分的学生成绩的个数,要求输入和输出功能在主函数中完成。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int check(int *);
int *p1,i,n;
p1=(int *)malloc(5*sizeof(int));
printf("输入5个学生的成绩:\n");
for(i=0;i<5;i++)
scanf("%d",&p1[i]);
n=check(p1);
printf("不及格的成绩个数为:%d\n",n);
return 0;
}
int check(int *p)
{
int i,k=0;
for(i=0;i<5;i++)
if (p[i]<60) k++;
return k;
}
14. 有一个一维数组score,内放10个学生成绩,编写完成ave函数求平均成绩,并将10个成绩中不及格(小于60)的成绩和该成绩在数组中的序号输出。
#include<stdio.h>
int main()
{
void ave(int a[10]);
int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
ave(a);
return 0;
}
void ave(int a[10])
{
int i,m=0;
for(i=0;i<10;i++)
{
m=m+a[i];
if(a[i]<60)
printf("%d %d\n",a[i],i);
}
printf("%d\n",m/10);
}
15. 编程实现:编写完成retu函数,实现统计统计第二个字符串在第一个字符串中出现的次数,在主函数中调用统计函数并输出结果。
如:第一个字符串为sdjfzhyishgzhyzhyiswzxmt,第二个字符串为zhy,输出结果为:3
#include<stdio.h>
#include<string.h>
int main()
{
int retu(char a[],char b[]);
char c[200],d[100];
gets(c);
gets(d);
printf("出现的次数为:%d\n",retu(c,d));
return 0;
}
int retu(char a[],char b[])
{
int i,j,t,m,s=0;//m表示匹配字符串长度
for(i=0;a[i]!='\0';i++)
{
m=0;
if(a[i]==b[0])
{
for(t=i,j=0;b[j]!='\0';t++,j++)
if(b[j]==a[t])
m++;
if(m==strlen(b))
s++;
}
}
return s;
}
又解:
#include<stdio.h>
#include<string.h>
int main()
{
int retu(char a[],char b[]);
char c[200],d[100];
gets(c);
gets(d);
printf("出现的次数为:%d\n",retu(c,d));
return 0;
}
int retu(char a[],char b[])
{
int i,j,t,s=0;
for(i=0;a[i]!='\0';i++)
{
if(a[i]==b[0])
{
for(t=i,j=0;b[j]!='\0';t++,j++)
if(b[j]!=a[t]) break;
if(b[j]=='\0') s++;
}
}
return s;
}
16 编写一程序,实现从键盘接收一个字符串,然后删除其中的空格后并输出。
如:输入“I am
a student!”,输出“Iamastudent!”,要求用指针实现。
#include<stdio.h>
#include<string.h>
int main()
{
char a[50],*p;
int l,i;
printf("input string a:");
gets(a);
p=a;
l=strlen(a);
for(l;l>0;l--)
{
if(*(p+l)==' ')
for(i=l;*(p+i)!='\0';i++)
*(p+i)=*(p+i+1);
}
puts(p);
return 0;
}
又解(推荐):
#include <stdio.h>
void delspace(char *st)
{
char *t;
for(t=st;*t!='\0';t++)
if (*t!=' ') *(st++)=*t;
*st='\0';
}
int main()
{
char str[100];
gets(str);
printf("the original data is :%s",str);
delspace(str);
printf("the result is :%s\n",str);
return 0;
}
17. 用冒泡法实现对10个整数按从大到小的顺序排序输出(要求用指针实现)。
#include<stdio.h>
int main()
{
int a[10],i,j,t,*p=a;
for(i=0;i<10;i++)
scanf("%d",p+i);
for(i=0;i<10;i++)
for(j=0;j<9-i;j++)
if(*(p+j)>*(p+j+1))
{
t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
for(i=0;i<10;i++)
printf("%d ",*(p+i));
puts("");
return 0;
}
又解(推荐):
#include<stdio.h>
int main()
{
int a[10],i,j;
void sort(int *);
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\nthe original data is :");
for(i=0;i<10;i++) printf("%d ",a[i]);
sort(a);
printf("\nthe result data is :");
for(i=0;i<10;i++)
printf("%d ",a[i]);
puts("");
return 0;
}
void sort(int *p)
{
int i,j,t;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(*(p+j)>*(p+j+1))
{
t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
}
18. 用选择法实现对10个整数按从小到大的顺序排序输出(要求用指针实现)。
#include<stdio.h>
int main()
{
int a[10],i,j,t,*p=a;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
if(*(p+i)>*(p+j))
{
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
}
for(i=0;i<10;i++)
printf("%d ",*(p+i));
puts("");
return 0;
}
又解(推荐):
#include<stdio.h>
int main()
{
int a[10],i,j;
void sort(int *);
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\nthe original data is :");
for(i=0;i<10;i++) printf("%d ",a[i]);
sort(a);
printf("\nthe result data is :");
for(i=0;i<10;i++)
printf("%d ",a[i]);
puts("");
return 0;
}
void sort(int *p)
{
int i,j,t;
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
if(*(p+i)>*(p+j))
{
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
}
}
19. 编写一个函数实现字符串复制功能,不能使用strcpy函数,并在 main函数中调用,输入字符串和输出赋值完后字符串的结果都在主函数中实现。
(要求用指针作为函数参数)#include<stdio.h>
int main()
{
char a[100],b[20];
void copy_string(char *,char *);
gets(b);
printf("\n the original data is :%s",b);
copy_string(a,b);
printf("\n the result data is :%s\n",a);
return 0;
}
void copy_string(char *p,char *q)
{
while(*p++=*q++);
}
又解:
#include<stdio.h>
int main()
{
char a[100],b[20];
void copy_string(char *,char *);
gets(b);
printf("\n the original data is :%s",b);
copy_string(a,b);
printf("\n the result data is :%s\n",a);
return 0;
}
void copy_string(char *p,char *q)
{
while(*q)
*(p++)=*(q++);
*p='\0';
}
20. 写一函数,求一个字符串的长度。
在main函数中输入字符串,并输出其长度。
(要求用指针实现)
#include<stdio.h>
int main()
{
char a[100],*p=a;
int fun(char *);
gets(a);
printf("length is %d\n",fun(a));
return 0;
}
int fun(char *p)
{
int k=0;
while(*p++)
k++;
return k;
}
21. 输入一个字符串,内有数字和非数字字符,例如:“A123x456 17960? 302tab5876”,将其中连续的数字作为一个整数,依次存在到一数组a中。
例如,123放在a[0],456放在a[1]……统计共有多少个整数,并输出这些数。
(要求用指针实现)
如:输入A123x456 17960? 302tab5876,输出为共有5个整数,分别为123,456,17960,302,5876。
#include<stdio.h>
char a[100];
int main()
{
void fun(char *);
char *p=a;
gets(p);
fun(p);
return 0;
}
void fun(char *p)
{
int num[100],s,k,j=0,i=0;
s=0;
while(*(p+i))
{
k=0;
while(*(p+i)>='0'&&*(p+i)<='9')
{
s*=10;
s+=*(p+i)-48;
i++;k=1;
}
if(k)
{
num[j++]=s;
s=0;
}
else
i++;
}
printf("%d\n",j);
for(i=0;i<j;i++)
printf("%d ",num[i]);
puts("");
}
又解(推荐):
#include<stdio.h>
void fun(char *p,int t[],int *x)
{
int s=0,flag=0,j=0;//s累加求和,flag标志新发现一个整数,j标记数组中新整数存放位置while (*p++)
{
if (*p>='0'&&*p<='9')
{s=s*10;
s=s+*p-48;
flag=1;
}
else if (flag) {t[j++]=s;s=0;flag=0;} //发现了一个新整数,存放在目标数组中}
*x=j;
}
int main()
{
char st[80];
int a[80],n,i;
gets(st);
fun(st,a,&n);
printf("共有%d个整数:\n",n);
for(i=0;i<n;i++)
printf("第%d个整数为:%d\n",i+1,a[i]);
return 0;
}
22. 有一篇文章,共有4行文章,每行有10个字符。
要求分别统计出其中英文大写字符、
小写字母、数字、空格以及其他字符的个数。
(要求用指针实现)
#include<stdio.h>
int main()
{
void count(char (*p)[10]);
char str[4][10];
printf("input 4 string:\n");
for(int i=0;i<4;i++)
gets(str[i]);
count(str);
return 0;
}
void count(char (*p)[10])
{ int l=0,L=0,digit=0,space=0,oth=0;
int i,j;
for(i=0;i<4;i++)
for(j=0;*(*(p+i)+j)!='\0';j++)
if((*(*(p+i)+j)>='a')&&(*(*(p+i)+j)='z'))
l++;
else if((*(*(p+i)+j))>='A'&&(*(*(p+i)+j)<='Z'))
L++;
else if(*(*(p+i)+j)>='0'&&*(*(p+i)+j)<='9')
digit++;
else if(*(*(p+i)+j)==32)
space++;
else
oth++;
printf("\ncapital letter:%d\nlower letter:%d\ndigit:%d\nspace:%d\nothers:%d\n", L,l,digit,space,oth);
}
又解(推荐):
#include<stdio.h>
int main()
{
void count(char (*p)[10],int []);
char str[4][10];
int wzxmt[5]={0,0,0,0,0};//分别统计大写、小写、数字、空格、其他字符个数printf("input 4 string:\n");
for(int i=0;i<4;i++)
gets(str[i]);
count(str,wzxmt);
printf("\n the result is big character n is :%d",wzxmt[0]);
printf("\n the result is little character n is :%d",wzxmt[1]);
printf("\n the result is digit character n is :%d",wzxmt[2]);
printf("\n the result is space character n is :%d",wzxmt[3]);
printf("\n the result is other character n is :%d",wzxmt[4]);
return 0;
}
void count(char (*p)[10],int wzxmt[])
{ int i,j;
for(i=0;i<4;i++)
for(j=0;p[i][j]!='\0';j++)
if((p[i][j]>='A')&&(p[i][j]<='Z'))
wzxmt[0]++;
else if((p[i][j]>='a')&&(p[i][j]<='z'))
wzxmt[1]++;
else if((p[i][j]>='0')&&(p[i][j]<='9'))
wzxmt[2]++;
else if(p[i][j]==' ')//空格字符的asicc码值为32,' '也可写成32
wzxmt[3]++;
else
wzxmt[4]++;
}
23. 编程实现从键盘输入任意十个字符串,找出并显示最长的那个字符串。
(要求用指针知识实现)
#include<stdio.h>
#include<string.h>
int main()
{
char max[50],b[50];
char *p=max,*p1=b;
gets(p);
for(int i=0;i<9;i++)
{
gets(p1);
if(strlen(p)<strlen(p1))
strcpy(p,p1);
}
puts("");
puts(max);
return 0;
}
又解(推荐):
#include<stdio.h>
#include<string.h>
char *maxstring(char (*st)[50])
{
int i;
char *temp;
temp=*st;
for(i=0;i<9;i++)
if (strlen(temp)<strlen(st[i])) temp=*(st+i);
return temp;
}
int main()
{
char st[10][50],*p;
int i;
for(i=0;i<10;i++)
gets(st[i]);
p=maxstring(st);
printf("\nthe longest string is :%s\n",p);
return 0;
}
24. 编写完成fun函数实现如下功能:从键盘输入任意一个正整数,求出它的偶数因子,并按从小到大的顺序放在pp所指的数组中,这些因子的个数通过形参n返回。
如输入56,输出为:the result is :2 4 8 14 28
自定义函数:Void fun(int x,int *pp,int *n)
#include<stdio.h>
int main()
{
void fun (int x,int *pp, int *n);
int x,a[100],*pp=a,n,i;
scanf("%d",&x);
fun(x,pp,&n);
printf("the result is :”);
for(i=0;i<n;i++)
printf("%d ",pp[i]);
printf("\n");
return 0;
}
void fun (int x,int *pp, int *n)
{
int i,j=0,t;
for(i=2;i<x;i++)
if(x%i==0&&i%2==0)
pp[j++]=i;
*n=j;
}
25. 编写一个函数,实现求出一个2维数组中的鞍点,并在main函数中调用此函数,2维数组中数据输入和鞍点数据输出都在主函数中实现。
(鞍点是指某个数在该行上最大,同时在该列上最小)
#include<stdio.h>
int main()
{
int an(int a[4][5]);
int a[4][5],i,j;
for(i=0;i<4;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
printf("%d\n",an(a));
return 0;
}
int an(int a[4][5])
{
int i,j,m,n,b,max,k,f;
for(i=0;i<4;i++)
{
max=a[i][0];
for(j=1;j<5;j++)
if(a[i][j]>max)
{
max=a[i][j];
m=j;
}
f=1;
for(k=0;k<4;k++)
if(max>a[k][m])
f=0;
if(f)
{
return(a[i][m]);
break;
}
}
}
26. 输入3个学生4门课的成绩,分别用aver_stu和aver_cour函数实现如下功能:
(1)计算每个学生平均分;
(2)计算每门课的平均分;
#include<stdio.h>
int score[3][4];
int a_stu[3],a_cour[4];
int r,c;
int main()
{
int i,j;
void aver_stu();
void aver_cour();
printf("\nNO. cour1 cour2 cour3 cour4\n");
for(i=0;i<3;i++)
{
printf("No %d:",i+1);
for(j=0;j<4;j++)
scanf("%d",&score[i][j]);
}
aver_stu();
aver_cour();
return 0;
}
void aver_stu() //计算并输出每个学生的平均成绩
{
int s;
for(int i=0;i<3;i++)
{
for(int j=0,s=0;j<4;j++)
s+=score[i][j];
a_stu[i]=s/4.0;
}
printf("\naverage of student:"); //输出每个学生的平均成绩
for(int j=0;j<3;j++)
printf("%2d ",a_stu[j]);
}
void aver_cour() //计算4门课程平均成绩的函数
{
int i,j;
float s;
printf("\naverage of soure :");
for(j=0;j<4;j++)
{
s=0;
for(i=0;i<3;i++)
s=s+score[i][j];
a_cour[j]=s/(float)3;
printf("%2d ",a_cour[j]);
printf("\n");
}
}
27. 编写完成fun函数实现将一行字符串中的最长的单词输出。
此行字符串从主函数传递给该函数。
#include<stdio.h>
char b[50];
int main()
{
char a[50];
void fun(char a[]);
gets(a);
fun(a);
return 0;
}
void fun(char a[])
{
int i,j,max=0,k,n,t;
for(i=0;a[i]!='\0';i++)
{
j=0;n=i;
while((a[n]>='a'&&a[n]<='z')||(a[n]>='A'&&a[n]<='Z'))
{
j++;
n++;
}
//j表示新单词长度,n表示新单词结束后下一个位置
if(max<j)
{
max=j;
k=i;
}
//max表示当前最长的单词长度,k表示当前最长的单词的起始位置}
//将最长的单词输出
for(t=k;t<k+max;t++)
printf("%c",a[t]);
printf("\n");
}
性能提高:
for(i=0;a[i]!='\0';i++)
{
j=0; n=i;
while((a[n]>='a'&&a[n]<='z')||(a[n]>='A'&&a[n]<='Z'))
{
j++;
n++;
}
if(max<j)
{
max=j;
k=i;
}
if (a[n]!='\0') i=n;
else break;
}
如果要求主函数输出,怎么办?
#include<stdio.h>
char b[50];
int main()
{
char a[50],tt[50];
void fun(char a[],char []);
gets(a);
fun(a,tt);
puts(tt);
return 0;
}
void fun(char a[],char tt[])
{
int i,j,max=0,k,n,t;
for(i=0;a[i]!='\0';i++)
{
j=0; n=i;
while((a[n]>='a'&&a[n]<='z')||(a[n]>='A'&&a[n]<='Z'))
{
j++;
n++;
}
if(max<j)
{
max=j;
k=i;
}
if (a[n]!='\0') i=n;
else break;
}
for(t=k,i=0;t<k+max;t++,i++)
tt[i]=a[t];
tt[i]='\0';
printf("\n");
}
28. 有3个学生,各学4门课程,输出总平均分数以及第n个学生的所有成绩。
(要求定义两个函数分别实现上述功能,用指针作为函数参数)
#include<stdio.h>
int main()
{
void average(int *);
void fun_n(int (*n)[4]);
int score[3][4]={{98,78,87,86},{85,87,76,45},{93,95,67,87}};
average(*score);
fun_n(score);
return 0;
}
void average(int *p)
{
int sum=0;
for(int i=0;i<12;i++)
sum+=*(p+i);
printf("average of all scores: %d\n",sum/12);
}
void fun_n(int (*n)[4])
{
int k;
printf("The score of No.");
scanf("%d",&k);
k=k-1;
for(int j=0;j<4;j++)
printf("%d ",*(*(n+k)+j));
puts("");
}
29. 有3个学生,每个学生有4门课程的成绩,要求在用户输入学生学号以后,能输出该学生的全部成绩。
(用指针函数知识实现)
#include<stdio.h>
int main()
{ int *fun(int (*p)[4],int n);
int *p1,m,i,stu[3][4]={{78,89,87,90},{77,67,78,98},{89,90,67,89}};
printf("input m:\n");
scanf("%d",&m);
printf("\n");
p1=fun(stu,m);
for(i=0;i<4;i++)
printf("%d ",*(p1+i));
printf("\n");
return 0;
}
int *fun(int (*p)[4],int n)
int *pt;
pt=*(p+n-1);
return pt;
}
30. 定义一个结构体变量(包括年、月、日)。
计算当天是本年中的第几天,注意闰年问题。
如输入1979 4 4,输出第94天,输入2000 4 4,输出第95天。
#include<stdio.h>
struct
{
int year;
int month;
int day;
}date;
int main()
{
int i,days;
int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
printf("input year,month,day:");
scanf("%d,%d,%d",&date.year,&date.month,&date.day);
days=0;
for(i=1;i<date.month;i++)
days+=day_tab[i];
days+=date.day;
if(date.year%4==0&&date.year%100!=0||date.year%400==0&&date.month>=3) days+=1;
printf("%d/%d is the %dth day in %d.\n",date.month,date.day,days,date.year);
return 0;
}
又解(推荐):
#include <stdio.h>
struct
{
int year;
int month;
int day;
}date;
int dayer(int (*st)[13])
{
int i,leap,day=date.day;
leap = (date.year%4==0&&date.year%100!=0) || date.year%400==0;
for (i=1; i<date.month; i++)
day = day + st[leap][i];
return day;
int main(void)
{
int k,leap,day;
int tab[2][13]={
{0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31},
{0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31}};
printf("请输入任意一个年份(年份月份天):");
scanf("%d%d%d",&date.year,&date.month,&date.day);
day=dayer(tab);
printf("是第%d天\n",day);
return 0;
}
31. 设计候选人得票统计程序,要求有4个侯选人(分别是Zhang 、Wang 、Li、Zhao),选民每次输入一个被选人的姓名,最后统计出各人的得票结果。
#include<stdio.h>
#include<string.h>
struct Person
{
char name[20];
int count;
}leader[4]={"Zhang",0,"Wang",0,"Li",0,"Zhao",0};
int main()
{
int i,j;
char leader_name[20];
for(i=1;i<=10;i++)
{
scanf("%s",leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
printf("\nResult:\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
return 0;
}
又解:
#include<stdio.h>
#include<string.h>
struct Person
{
char name[20];
int count;
}leader[4]={"zhang",0,"wang",0,"li",0,"zhao",0};
int main()
{
int i,j;
void count(char *,struct Person []);
char leader_name[20];
for(i=1;i<=10;i++)
{
scanf("%s",leader_name);
count(leader_name,leader);
}
printf("\nResult:\n");
for(i=0;i<4;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
return 0;
}
void count(char *str,struct Person leader[])
{
int i;
for(i=0;i<4;i++)
if (strcmp(str,leader[i].name)==0) leader[i].count++;
}
32. 定义一个包括学号、姓名、成绩的学生结构体,要求实现输入3个学生信息的输入后,按照成绩的高低顺序输出各学生的信息。
#include<stdio.h>
#define N 3
struct Student
{
int num;
char name[20];
float score;
};
int main()
{
struct Student stu[N];
struct Student temp;
int i,j;
printf("请输入三个学生的信息:学号、姓名、成绩:\n");
for(i=0;i<N;i++)
{
scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score);
}
printf("The order is :\n");
for(j=i+1;j<N;j++)
{
if(stu[j].score<stu[i].score)
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
for(i=0;i<N;i++)
printf("%6d %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score);
return 0;
}
又解(推荐):
#include<stdio.h>
#define N 3
struct Student
{
int num;
char name[20];
float score;
};
void sort(struct Student stu[])
{
int i,j;
struct Student temp;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(stu[i].score<stu[j].score)
{ temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
int main()
{
struct Student stu[N];
int i,j;
printf("请输入三个学生的信息:学号、姓名、成绩:\n");
for(i=0;i<N;i++)
{
scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score);
}
printf("The order is :\n");
sort(stu);
printf("%6d %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score);
return 0;
}
33. 有3个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入3个学生数据,要求完成max函数和print函数,找到并输出输出平均成绩最高分的学生的信息(包括学号、姓名、3门课程成绩、平均分数)(用结构体知识)。
#include<stdio.h>
#define N 3
struct Student
{
int num;
char name[20];
float score[3];
float aver;
};
int main()
{
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu);
struct Student stu[N],*p=stu;
input(p);
print(max(p));
return 0;
}
void input(struct Student stu[])
{
int i;
printf("请输入各个学生的信息:学号、姓名、三门课成绩:\n");
for(i=0;i<N;i++)
{
scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].sco re[2]);
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;
}
}
struct Student max(struct Student stu[])
{
int i,m=0;
for(i=0;i<N;i++)
if(stu[i].aver>stu[m].aver)
m=i;
return stu[m];
}
void print(struct Student stu)
{
printf("\n成绩最高的学生是:\n");
printf("学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",stu.num,,stu.score[0],stu.score[1],stu.score[2],stu.aver);
}
34. 学生记录由学号和成绩组成,N名学生的数据已经在主函数中放入结构体数组,编写完成fun函数,把低于平均分的学生数据放在b所指的数组中,低于平均分的学生人数通过形参n返回,平均分通过函数值返回。
#include <stdio.h>
#define N 8
typedef struct {
char num[10];
double s;
}STREC;
double fun(STREC *a,STREC *b,int *n)
{
int i,j=0;
double sum=0,ave=0;
for(i=0;i<N;i++)
sum+=a[i].s;
ave=sum/N;
for(i=0;i<N;i++)
if (a[i].s<ave) b[j++]=a[i];
*n=j;
return ave;
}
void main()
{
STREC
s[N]={{"gao05",85},{"gao03",76},{"gao02",69},{"gao04",85},{"gao01",91},{"gao07",72},{"gao 08",64},{"gao06",87}};
STREC h[N],t;
int i,j,n;
double ave;
ave=fun(s,h,&n);
printf("the %d student data which is lower than %7.3f:\n",n,ave);
for(i=0;i<n;i++)
printf("%s %4.1f\n",h[i].num,h[i].s);
printf("\n");
}
35. N名学生的数据已经在主函数中放入结构体数组s中,fun函数功能是返回指定学号的学
生数据,若没有找到指定学号,在结构体变量中给学号置空串,成绩置-1,作为函数值返回。
#include <stdio.h>
#include <string.h>
#define N 4
typedef struct
{char num[10];
int s;
}st;
st fun(st *a,char *b)
{
int i,f=0;
st p;
p=a[0];
for(i=0;i<N;i++)
if (strcmp(a[i].num,b)==0) {p=a[i];f=1;}
if (f==0)
{p.num[0]='\0';p.s=-1;}
return p;
}
int main()
{
st s[N]={{"gao005",85},{"gao003",76},{"gao002",89},{"gao001",34}};
st h;
char m[10];
int i;
for(i=0;i<N;i++)
{if (i%4==0) printf("\n");
printf("%s %3d",s[i].num,s[i].s);
}
printf("\n enter the number:");gets(m);
h=fun(s,m);
printf("the data:");
printf("\n %s %4d\n",h.num,h.s);
printf("\n");
return 0;
}
36. 从键盘上读入3个字符串,对它们按字母大小的升序排序,然后把排好序的字符串送到磁盘文件中保存,文件把保存到d盘根目录下,完成write函数。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void write(char (*st)[20],FILE *fp1)
{
int i,j;。