习 题 77.1 已有变量定义和函数调用语句:int a=1,b=–5,c ;c=fun(a,b);fun 函数的作用是计算两个数之差的绝对值,并将差值返回调用函数,请编写fun 函数。
Fun(int x,int y){ }7.1 求两数之差绝对值#include <math.h>fun(int x,int y){ return abs(x-y); }main(){ int a=1,b=-5,c;c=fun(a,b);printf("|%d-%d|=%d\n",a,b,c);}7.2 已有变量定义和函数调用语句:int x=57;isprime(x);函数isprime( );用来判断一个整型数a 是否为素数,若是素数,函数返回1,否则返回0。
请编写isprime 函数。
isprime(int a){ }7.3 已有变量定义和函数调用语句int a ,b ;b=sum(a);函数sum()用以求∑=nk k 1,和数作为函数值返回。
若a 的值为10,经函数sum 的计算后,b 的值是55。
请编写sum 函数。
Sum(int n){ }7.3 求∑k#include <stdio.h>sum(int n){ int k,s=0;for(k=1;k<=n;k++)s=s+k;return s;}main(){ int a,b;printf("Input a: "); scanf("%d",&a);b=sum(a);printf("%c(1,%d)=%d\n",228,a,b);}7.4 一函数,输入一行字符,将此字符串中最长的单词输出。
7.4 输出最长的单词,假设只包含字母和空格,单词间以空格分隔,空格个数不限#include <string.h>void fun(char a[]){ int n,i,j,k=0,len[80],p;char c[80][80],max[80];n=strlen(a);for(i=0;i<n;i++)if(a[i]!=32) /*a[i]不为空格,说明单词开始了*/{ j=0;while(a[i]!=32) /*没有遇到下一个空格,说明单词没有结束*/{ c[k][j]=a[i]; j++; i++; } /*将单词放入字符串c[k]*/c[k][j]='\0'; /*人为加串尾标志*/k++; /*k为下一个单词存入c的行号*/}for(i=0;i<k;i++)len[i]=strlen(c[i]); /*求每行字符串的长度*/p=0;if(len[p]<len[i]) p=i;/*找最长字符串的行号*/printf("The word is : %s\n",c[p]);}main(){ char a[80];printf("Input a line string: "); gets(a);fun(a);}7.5 一函数,输入一个十六进制数,输出相应的十进制数。
7.5 十六进制数转换成十进制数#include <stdio.h>#include <ctype.h>int fun(char a[]){ int i,n=0,m;for(i=0;a[i];i++){ if(isalpha(a[i]))/*如果a[i]是字母,求出相应的十进制数*/switch(a[i]){ case 'a':case 'A': m=10; break;case 'b':case 'B': m=11; break;case 'c':case 'C': m=12; break;case 'd':case 'D': m=13; break;case 'e':case 'E': m=14; break;case 'f':case 'F': m=15; break;default: printf("Input error!\n"); exit(0);/*如果输入了不合法的字母,输出相应的信息*/ }else if(isdigit(a[i])) /*如果a[i]是数字*/m=a[i]-'0';else { printf("Input error!\n"); exit(0); }/*如果输入了不合法的字符,输出相应的信息*/ n=n*16+m; /*将十六进制数转换成十进制数*/ }return n;}main(){ char a[80]; int n;printf("input: "); scanf("%s",a);n=fun(a);printf("output: %d\n",n);}7.6 给出年、月、日,计算该日是该年的第几天。
#include <stdio.h>int fun(year,month,day){ int n=0,i;n=n+day; /*累加当月的天数*/for(i=month-1;i>0;i--) /*累加前面月份的天数*/switch(i){ case 12: n=n+31;case 11: n=n+30;case 10: n=n+31;case 9: n=n+30;case 8: n=n+31;case 7: n=n+31;case 6: n=n+30;case 5: n=n+31;case 4: n=n+30;case 3: n=n+31;case 2: if(year%4==0&&year%100!=0||year%400==0)n=n+28;else n=n+29; /*根据year判断闰年或平年,进行累加*/case 1: n=n+31;}return n; /*返回天数*/}main(){ int year,month,day;printf("Input year,month,day: "); scanf("%d%d%d",&year,&month,&day);printf("%d.%d.%d is No.%d of a year.\n",year,month,day,fun(year,month,day));}7.7 定义一个函数digit(n,k),它回送整数n的从右边开始数第k个数字的值。
例如:digit(15327,4)=5digit(289,5)=07.7 回送第k个数字#include <stdio.h>int fun(long n,int k){ int i,m ;for(i=1;i<=k;i++){ m=n%10; /*从右边分离出第i个数字*/n=n/10; /*为下一次分离作准备*/}return m; /*返回第k次分离出的数字*/}main(){ long int n; int k;printf("Input n: "); scanf("%ld",&n);printf("Input k: "); scanf("%d",&k);printf("The No.%d number is %d.\n",k,fun(n,k));}7.8 计算s。
已知s=10!+7!*8!将n!定义成函数。
#include <stdio.h>double fun(int n){ double f=1.0; int i;for(i=1;i<=n;i++)f=f*i; /*求n!*/return f; /*返回阶乘值*/}main(){ printf("10!+7!*8!=%g\n",fun(10)+fun(7)*fun(8)); }7.9 定义一个函数,使给定的二维数组(3×3)转置,即行列转换,并输出。
7.9 矩阵转置#include <stdio.h>void convert(int a[][3]){ int i,j,t;for(i=0;i<3;i++)for(j=0;j<i;j++){ t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t; }} /*矩阵转置*/main(){ int a[3][3],i,j;printf("Input 3*3 array: \n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]); /*读入数据*/printf("before converted, output: \n");for(i=0;i<3;i++){ for(j=0;j<3;j++)printf("%4d",a[i][j]);printf("\n");} /*输出原始数据*/convert(a); /*调用函数进行处理*/printf("after converted, output: \n");for(i=0;i<3;i++){ for(j=0;j<3;j++)printf("%4d",a[i][j]);printf("\n");} /*输出转置后的数据*/}7.10 写几个函数:①输入10个职工的性名和职工号;②按职工号由小到大的顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工的姓名。
7.10 编写几个函数,分别实现输入、排序、查找#include <stdio.h>#include <string.h>#define N 10void input(char name[N][8],char no[N][8]){ int i;printf("Input %d name and No.\n",N);for(i=0;i<N;i++)scanf("%s%s",name[i],no[i]);} /*输入每个人的姓名和学号*/void sort(char name[N][8],char no[N][8]){ char t[8]; int i,j,p;for(i=0;i<N-1;i++){ p=i;for(j=p;j<N;j++)if(strcmp(name[p],name[j])>0) p=j;if(p!=i){ strcpy(t,name[p]); strcpy(name[p],name[i]); strcpy(name[i],t);strcpy(t,no[p]); strcpy(no[p],no[i]); strcpy(no[i],t);}}} /*按姓名进行从小到大的排序,姓名进行交换的时候,职工号也进行交换,以保证职工号跟着姓名走,以免打乱对应的关系*/void find(char name[N][8],char no[N][8],char No[8],char messge[8]){ int low=0,high=N-1,mid;while(low<=high){ mid=(low+high)/2;if(strcmp(No,no[mid])>0) low=mid+1; /*向下找*/else if(strcmp(No,no[mid])<0) high=mid-1; /*向上找*/else { strcpy(message,name[mid]); return; } /*找到了,就将对应的姓名存入find字符串*/}strcpy(message,"no find"); /*找不到,find字符串存入"no find"*/}main(){ char name1[N][8],no1[N][8],No1[8],message1[8]; int i;clrscr();input(name1,no1); /*调用输入函数*/printf("%d alerks are: \n",N);printf("%10s%20s\n","name","No.");for(i=0;i<N;i++)printf("%10s%20s\n",name1[i],no1[i]); /*输出每个人的姓名和职工号*/ sort(name1,no1); /*调用排序函数*/printf("after sorted: \n");printf("%10s%20s\n","name","No.");for(i=0;i<N;i++)printf("%10s%20s\n",name1[i],no1[i]); /*输出排序后的姓名和职工号*/printf("Input finded No. : "); scanf("%s",No1); /*输入要查找的职工号*/find(name1,no1,No1,message1); /*调用查找函数,将找到的姓名放入find字符串*/ if(strcmp(message1,"no find")==0)printf("No find.\n");elseprintf("The finded alerk is: %s\n",message1);/*根据find的内容输出相应的信息*/}7.11 定义一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。