C 基础练习

输出小于500的所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。 #include<stdio.h> #include<math.h> int main() { int flower=100,first=0,second=0,last=0; for(;flower<500;flower++) { first=flower%10; second=flower%100/10; last=flower/100; if(flower==pow(first,3) +pow(second,3)+pow(last,3))//pow(first,int)算次方函数 PRintf("%d,",flower); } } 给一个不多于6位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为158,应输出851。 #include<stdio.h> #include<math.h> int main() { int array[6],num=13224,count=0; int temp=1; for(int i=0;i<=6;i++) { if(num/temp==0) { count=i; break; } else temp*=10; } printf("count=%d\n",count); temp=1; for(int i=1;i<count;i++) { temp*=10; } for(int i=0;i<count;i++) { int a=num; //取一个多位数每一位的方法 //先除后余,先除与多位数相同位数的最小值获取最高位 //后余多位数相同位数的最小值剩下的值 array[i]=a/temp; num=num%temp; temp=temp/10; } for(int i=0;i<count;i++) { printf("%d,",array[i]); } for(int i=count-1;i>=0;i--) { printf("%d",array[i]); } } 求5+55+555+5555+55555的值。 #include<stdio.h> #include<math.h> int main() { int a=5,num=5,sum=0; for(int i=0;i<5;i++) { sum=num+sum; num=num*10+a; } printf("a+aa+...+aaaaa=%d",sum); } 冒泡排序 #include<stdio.h> #include<math.h> int main() { float num[10]; for(int i=0;i<10;i++) { scanf("%f",&num[i]);//标准输入函数中的格式必须与待输入的变量的类型一致否则无法输入 } for(int i=0;i<10;i++) { for(int j=0;j<10-i;j++) //注意J从0开始 { if(num[j]>num[j+1]) { float temp=num[j]; num[j]=num[j+1]; num[j+1]=temp; } } } for(int i=0;i<10;i++) { printf("%f,",num[i]); } } 将一个二维数组a的行和列的元素互换(即行列互换),存到另一个二维数组b中 #include<stdio.h> #include<math.h> #include<stdlib.h> //生成随机数头函数 #include<time.h> //生成随机数头函数 int main() { int a[4][5],b[5][4]; srand(time(0)); //生成随机数 for(int i=0;i<4;i++) { for(int j=0;j<5;j++) { a[i][j]=rand()%100; //生成100以内的随机数 } } for(int i=0;i<4;i++) { for(int j=0;j<5;j++) { b[j][i]=a[i][j]; } } return 0; } 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开 #include<stdio.h> int main() { char str[80]; gets(str); //输入字符串,可以输入空格,scanf函数不能输入空格 puts(str); int sum=0,i=0; while(str[i]!='\0')//字符串数组以'\0'结尾,可以用其判断是否结束 { if(str[i]==' ') { sum++; } i++; } sum++; printf("%d",sum); return 0; } 有3个字符串,要求找出其中最大者。 #include<stdio.h> #include<string.h> //字符串操作头函数 int main() { char str1[80],str2[80],str3[80],large[80]; gets(str1); gets(str2); gets(str3); if(strcmp(str1,str2)>0) //strcmp函数,第一个变量与第二个变量相等则返回0,否则返回第一个与第二个的差值,大为正数否则为负数 { strcpy(large,str1); } else { strcpy(large,str2); //字符串复制函数 } if(strcmp(str3,large)>0) { strcpy(large,str3); } puts(large); return 0; }

输入两个整数,要求用一个函数求出其最大公约数和最小公倍数

#include<stdio.h> #include<string.h> /*最小公倍数为两个数之积除以最大公约数*/ int main() { int num1,num2,sum; scanf("%d",&num1); scanf("%d",&num2); sum=num1*num2; if(num1<num2) { num1=num1+num2; num2=num1-num2; num1=num1-num2; } while(1) { int temp=num1%num2; if(temp==0) { printf("%d\n",num2); printf("%d",sum/num2); break; } else { num1=num2; num2=temp; } } return 0; }

输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。

#include<stdio.h> #include<string.h> int max_4(int a,int b,int c,int d); int max_2(int a,int b); int main() { int a,b,c,d; scanf("%d %d %d %d",&a,&b,&c,&d); //scanf函数输入多个变量的另一种方法 scanf("%d%d%d%d",&a,&b,&c,&d); int max=max_4(a,b,c,d); printf("max=%d",max); return 0; } int max_4(int a, int b, int c, int d) { int m=max_2(a,b); m=max_2(m,c); m=max_2(m,d); return m; } int max_2(int a, int b) { return(a>b?a:b); }

用递归方法求5!。

#include<stdio.h> #include<string.h> int fac(int num); int main() { int num=5; int res=fac(num); printf("%d",res); return 0; } int fac(int num) { if(num==1) return 1; else return (num*fac(num-1)); }

编写一个函数,用来分别求数组score_1(有5个元素)和数组score_2(有10个元素)各元素的平均值。

#include<stdio.h> float ave(float score[],int sum); int main() { float score_1[5],score_2[10]; //无特殊说明第一考虑为float型 printf("input score_1\n"); for(int i=0;i<5;i++) { scanf("%f",&score_1[i]); //输出与输入函数格式一定要与变量一致 } printf("input score_2\n"); for(int i=0;i<10;i++) { scanf("%f",&score_2[i]); } printf("ava1=%f\n",ave(score_1,5)); printf("ava2=%f\n",ave(score_2,10)); return 0; } float ave(float score[],int num) { float sum=0.0; for(int i=0;i<num;i++) { sum=sum+score[i]; } return (sum/num); }

将一个数组中的值按逆序重新存放

#include<stdio.h> #include<string.h> int main() { int max; printf("input max\n"); scanf("%d",&max); int num[max]; //数组可以用变量确定数组大小 for(int i=0;i<max;i++) { scanf("%d",&num[i]); } for(int i=0;i<max/2;i++) { int temp=num[max-i-1]; num[max-i-1]=num[i]; num[i]=temp; } for(int i=0;i<max;i++) { printf("%d,",num[i]); } return 0; }

用递归法将一个整数n转换成字符串

#include<stdio.h> #include<string.h> void tra(int num, int n); int main() { int num,n=10; scanf("%d",&num); if(num<0) //注意负数的判断 { num=-num; putchar('-'); } tra(num,n); return 0; } void tra(int num,int n) { if(num/n==0) { putchar(num%n+'0'); return; } else { tra(num/10,n); printf("%c",num%n+'0'); } }

用指针实现输入3个整数并按从小到大的顺序输出

#include<stdio.h> #include<string.h> int exchange(int* a,int *b,int *c); int main() { int a,b,c; scanf("%d %d %d",&a,&b,&c); exchange(&a,&b,&c); printf("%d,%d,%d",a,b,c); return 0; } int exchange(int *a, int *b, int *c) { int temp; if(*a>*b) //&为取地址符号若变量为指针则取的为指针本身的值,取指针指向的地址的值为* { temp=*a; *a=*b; *b=temp; } if(*a>*c) { temp=*a; *a=*c; *c=temp; } if(*b>*c) { temp=*b; *b=*c; *c=temp; } }

用指针实现将数组b[10]中的元素按逆序存放。

#include<stdio.h> void exchange(char *p, int n); int main() { int n=3; char b[n]; for(int i=0;i<n;i++) { scanf("%c",&b[i]); } char *p=&b[0]; exchange(p,n); for(int i=0;i<n;i++) { printf("%c,",b[i]); } return 0; } void exchange(char *p,int n) { char temp; for(int i=0;i<n/2;i++) { temp=*(p+i); *(p+i)=*(p+n-1); *(p+n-1)=temp; } }

用选择法实现对10个整数按从小到大的顺序排序输出

#include<stdio.h> #include<stdlib.h> #include<time.h> void exchange(int *p, int n); int main() { srand(time(0)); int n=10; int arr[n]; for(int i=0;i<n;i++) { arr[i]=rand()%100; printf("%d,",arr[i]); } printf("\n"); exchange(&arr[0],n); for(int i=0;i<n;i++) { printf("%d,",arr[i]); } return 0; } void exchange(int *p, int n) { for(int i=0;i<n;i++) { int max=0; for(int j=1;j<n-i;j++) { if(*(p+max)<*(p+j)) //指针操作需要极为消息 { max=j; } } int temp=*(p+n-i-1); *(p+n-i-1)=*(p+max); *(p+max)=temp; } }

定义一个结构体变量(包括年、月、日)。计算当天是本年中的第几天,注意闰年问题

#include<stdio.h> struct { int year; int moun; int day; }date; int main() { int sum=0; printf("input year,moun,day\n"); scanf("%d %d %d",&date.year,&date.moun,&date.day); sum=(date.moun-1)*30+date.day; if(date.moun==3) { sum=sum+1; } else if(date.moun==5||date.moun==4) { sum=sum+2; } else if(date.moun==7||date.moun==6) { sum=sum+3; } else if(date.moun==8) { sum=sum+4; } else if(date.moun==10||date.moun==9) { sum=sum+5; } else if(date.moun==12||date.moun==11) { sum=sum+6; } if(date.moun>2) { sum=sum-2; if(date.year/4==0||date.year/400==0||date.year/100==0) sum+=1; } printf("sum=%d",sum); return 0; }

设计候选人得票统计程序,要求有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() { char name[20]; int i=0; while(i<3) { gets(name); //输入为gets,输出为puts for(int i=0;i<4;i++) { if(strcmp(name,leader[i].name)==0) //switch只能比较int型 { leader[i].count++; return; } } i++; } return 0; }

建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。(动态数组重点)

#include<stdio.h> #include<string.h> #include<malloc.h> //动态数组头文件 int main() { int n=5; int *p=(int*) malloc(n*sizeof(int)); //动态数组声明方法,此时*p相当于p[5] printf("input score\n"); for(int i=0;i<n;i++) { scanf("%d",&p[i]); } free(p); //动态数组一定要释放 return 0; }

有一个一维数组score,内放10个学生成绩,用一个函数求平均成绩,并将10个成绩中不及格(小于60)的成绩和该成绩在数组中的序号输出。

#include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<time.h> float ave(float score[], int n); int main() { float score[10]; srand(time(0)); for(int i=0;i<10;i++) { score[i]=rand()%100; printf("%2.1f,",score[i]); } printf("\n"); printf("average=%2.1f",ave(score,10)); return 0; } float ave(float score[],int n) { int sum=0; for(int i=0;i<10;i++) { sum=sum+score[i]; if(score[i]<=60) printf("%d,",i+1); } printf("\n"); return (sum/10); }

输入8个学生4门课的成绩,分别用函数实现如下功能: (1) 计算每个学生平均分; (2) 计算每门课的平均分; (3) 找出32个分数中最高分所对应的学生和课程。

#include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<time.h> int main() { srand(time(0)); int m=8,n=4,arry[m][n]; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { arry[i][j]=rand()%100; } } int sum1[m],sum2[n]; int max[2]={0,0}; int maxs=arry[0][0]; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(arry[i][j]>maxs) { max[0]=i; max[1]=j; } sum1[i]=sum1[i]+arry[i][j]; sum2[j]=arry[i][j]+sum2[j]; } } return 0; }

用一个函数实现将一行字符串中的最长的单词输出。此行字符串从主函数传递给该函数。

#include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<time.h> void maxWorld(char world[]); int main() { char world[80]; gets(world); maxWorld(world); return 0; } void maxWorld(char world[]) { int i=0; int max=0,temp=0,begain=0; while(1) { if(world[i]==' '||world[i]=='\0') { if(temp>max) { max=temp; begain=i-max; } if(world[i]=='\0') { break; //while中return跳出整个函数,break跳出while循环 } temp=0; } else { temp++; } i++; } for(int i=begain;i<begain+max;i++) { printf("%c",world[i]); } }

输出金字塔图案(要求用循环实现)

#include<stdio.h> void main() {int i,j,k; for (i=0;i<=4;i++) {for (j=0;j<=3-i;j++) printf(" "); for (k=0;k<=2*i;k++) printf("*"); printf("\n"); } for (i=0;i<=4;i++) {for (j=0;j<=i;j++) printf(" "); for (k=0;k<=6-2*i;k++) printf("*"); printf("\n"); } }

要有一个已排好序的数组,求输入一个数后,按原来排序的规律将她插入数组中。

#include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<time.h> void insert(int *p,int n); void main() { int arry_1[5]={9,12,44,100,101}; int m; scanf("%d",&m); int arry_2[6]; //对于数组的重排可以将原数组复制到另一个数组中 int i,j; if(arry_1[0]>arry_1[1]) //减序排列 { for(i=0;i<5;i++) { if(m>arry_1[i]) break; } } else //增序排序 { for(i=0;i<5;i++) { if(m<arry_1[i]) break; } } for(j=0;j<6;j++) { if(j<i) { arry_2[j]=arry_1[j]; } else if(j==i) { arry_2[j]=m; } else { arry_2[j]=arry_1[j-1]; } } for(i=0;i<6;i++) { printf("%d,",arry_2[i]); } }

有一行电文,已按下面规律译成密码: A→Z a→z B→Y b→y C→X c→x 即第1个字母变成第26个字母,第i个字母变成第(26 – i + 1)个字母。非字母符号不变。要求编程序将密码译回原文,并输出密码和原文。

#include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<time.h> int main() { char world[100],tran[100]; gets(world); int i=0; while(world[i]!='\0') { if(world[i]>='A'&&world[i]<='Z') { tran[i]=25-(world[i]-'A')+'A'; } else if(world[i]>='a'&&world[i]<='z') { tran[i]=25-(world[i]-'a')+'a'; } else { tran[i]=world[i]; } i++; } tran[i]='\0'; puts(tran); return 0; }

编一程序,输入月份号,输出该月的英文月名。例如,输入3,则输出March,要求用指针数组处理。

#include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<time.h> int main() { char * month_name[13]={"illegal month","January","February","March","April", "May","June","july","August","September","October", "November","December"}; int n=0; scanf("%d",&n); if(n<1||n>12) //注意容错 { n=0; } printf("\n%s",*(month_name+n)); }