函数题
5-6-1 求一组数中的平均值及最大值
接口:
float Fun( int *p, int n,int *max);
其中 p、n、max 都是用户传入的参数。函数求数组中n个元素的平均值、最大值。最大值通过max带回,函数返回平均值 。
float Fun( int *p, int n,int *max) { float sum = 0.0,ave = 0.0; int i = 0; *max = 0; for(i = 0;i<n;i++) { sum += *(p+i); if(*(p+i) > *max) *max = *(p+i); } ave = 1.0*sum/n; return ave; }
5-6-2 判断满足条件的三位数
接口:
int search( int n );
统计给定区间内的三位数中有两位数字相同的完全平方数(如144、676)的个数。
其中传入的参数int n是一个三位数的正整数(最高位数字非0)。函数search返回[101, n]区间内所有满足条件的数的个数。
int Jud(int i) { int a,b,c; a = i%10; i/=10; b = i%10; i/=10; c = i%10; if((a==b&&b!=c)||(a==c&&b!=c)||(c==b&&c!=a)) return 1; else return 0; } int J2(int i) { int j = 10; for(;j<40;j++) { if(j*j==i) return 1; } return 0; } int search( int n ) { int i = 101; int count = 0; for(;i<=n;i++) { if(Jud(i)&&J2(i)) count++; } return count; }
5-6-3 函数实现字符串逆序
接口:
void f( char *p );
函数f对p指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。
void f( char *p ) { char t; int n = 0; char *tt = p; while(*tt!='\0') { n++; tt++; } for(int i = 0;i<n;i++) { char * t1 = p; for(int j = 0;j<n-i-1;j++) { t = *t1; *t1 = *(t1+1); *(t1+1) = t; t1++; } } }
5-6-4 查找子串
接口:
char *search( char *s, char *t );
函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。
char *search( char *s, char *t ) { char *pos = s; char *s1 = s; char *s2 = t; if(*t=='\0') { return s; } while(*pos!='\0') { s1= pos; s2 = t; while(*s1 == *s2&& *s2 != '\0') { s1++; s2++; } if(*s2== '\0') return pos; pos++; } return NULL; }
5-6-5 计算最长的字符串长度
接口:
int max_len( char *s[], int n );
实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。
其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。
int max_len( char *s[], int n ) { int max = 0; int i =0 ; for(i = 0;i<n;i++) { if(strlen(s[i])>max) max = strlen(s[i]); } return max; }
5-6-6 二分查找
接口:
int Search(int *p, int n, int k,int *Count);
实现一个函数,该函数采用二分查找法从一个已经升序排序的数组中,查找某个数k。如果找到k, 输出k所在的数组下标(0~n-1)及比较次数。若k不存在,输出-1和比较次数。
其中 p为数组首地址,n为数组长度,k为待查找的数, *Count为比较次数。
函数返回值:如果k在数组中返回其下标值,没找到返回-1。
int Search(int *p, int n, int k,int *Count) { int left = 0,right = n-1,mid; int i = 0; *Count = 0; while(left<=right) { mid = (left+right)/2; (*Count)++; if(*(p+mid)<k) { left = mid+1; } else if(*(p+mid)>k) { right = mid-1; } else { return mid; } } return -1; }
编程题
5-7-1 找最长的字符串
#include<stdio.h> #include<string.h> int main() { int n; scanf("%d",&n); char c[1200][90] ={0}; int max = 0,i,x; int len[1200] = {0}; for(i = 0;i<n;i++) { scanf("%s",c[i]); len[i] = strlen(c[i]); if(len[i]>max) { max = len[i]; x = i; } } printf("The longest is: %s",c[x]); return 0; }
5-7-2 藏头诗
注意这里规定一个汉字占三字节
#include<stdio.h> int main() { char c[4][26] = {0}; char pr[13] = {0}; for(int i = 0;i<4;i++) { scanf("%s",c[i]); } for(int j = 0;j<4;j++) { for(int k = 0;k<3;k++) { pr[3*j+k] = c[j][k]; } } pr[12] = '\0'; printf("%s",pr); return 0; }
5-7-3 英文单词排序
#include<stdio.h> #include<string.h> int main() { char c[20][20] = {0}; char t[18] = {0}; int i=0,j = 0,k = 0; while(1) { scanf("%s",c[i]); if(c[i][0]=='#') break; i++; } for(j=0;j<i-1;j++) for(k=0;k<i-j-1;k++) if(strlen(c[k])>strlen(c[k+1])) { strcpy(t,c[k]); strcpy(c[k],c[k+1]); strcpy(c[k+1],t); } for(j=0;j<i;j++) printf("%s ",c[j]); return 0; }