例子
递归求年龄
#include<stdio.h>
// int age(int a);
// int main(){
// int xue1=10;
// int xue2=age(xue1);
// int xue3=age(xue2);
// int xue4=age(xue3);
// int xue5=age(xue4);
// printf("%d\n",xue5);
//
// return 0;
// }
// int age(int a){
// return a+2;
// }
int age(int a);
int main(){
int xue5=age(5);
printf("%d",xue5);
}
int age(int a){
if(a==1)
return 10;
else if(a>=2)
return age(a-1)+2;
}
递归求n!
#include<stdio.h>
int resort(int n);
int main(){
int n=0;
scanf("%d",&n);
printf("%d!=%d",n,resort(n));
return 0;
}
int resort(int n){
if(n==0||n==1)
return 1;
else if(n>=2)
return resort(n-1)*n;
}
汉诺塔
#include<stdio.h>
int main(){
void hanoi(int n,char one,char two,char three);
int m;
printf("input the number:");
scanf("%d",&m);
printf("move %d\n",m);
hanoi(m,'A','B','C');
return 0;
}
void hanoi(int n,char one,char two,char three){
//将n个盘从one借助two转移到three
void move(char x,char y);
if(n==1)
move(one,three);
else{
hanoi(n-1,one,three,two);//通过三将1的东西移到2
move(one,three);//将一的最后一块移到三
hanoi(n-1,two,one,three);//继续移动
}
}
void move(char x,char y){
printf("%c->%c\n",x,y);
}
求十个人的平均成绩
#include<stdio.h>
int main(){
//100 56 78 98 67.5 99 54 88.5 76 58
float average(float arr[10]);//函数声明
float score[10],aver;
int i=0;
printf("input 10 scores:\n");
for(i=0;i<10;i++){
scanf("%f",&score[i]);
}
printf("\n");
aver=average(score);
printf("average score is %5.2f\n",aver);
return 0;
}
float average(float arr[10]){
int i=0;
float sum=0;
for(i=0;i<10;i++){
sum+=arr[i];
}
return sum/10;
}
选择法排序
#include<stdio.h>
//45 2 9 0 -3 54 12 5 66 33
int main(){
void sort(int arr[],int size);
int arr[10],i,size;
printf("enter array:\n");
size=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<10;i++){
scanf("%d",&arr[i]);
}
sort(arr,size);
printf("排序后的数组:\n");
for(i=0;i<10;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
void sort(int arr[],int size){
int min=arr[0];
int i,j,flag;
for(i=0;i<size;i++){
min=arr[i];
flag=i;//标记一下最小值的位置
for(j=i+1;j<size;j++){
if(min>arr[j]){
min=arr[j];
flag=j;
}
}
arr[flag]=arr[i];
arr[i]=min;
}
}
二维数组找最大值
#include<stdio.h>
int main(){
int max_value(int arr[][4]);
int arr[3][4]={1,3,5,7,2,4,6,8,15,17,34,12};
printf("Max value is %d\n",max_value(arr));
return 0;
}
int max_value(int arr[3][4]){
int i,j,max;
max=arr[0][0];
for(i=0;i<3;i++){
for(j=0;j<4;j++){
if(arr[i][j]>max)
max=arr[i][j];
}
}
return max;
}
作用域 总结
习题
最大公约数和最小公倍数
#include<stdio.h>
int main(){
int gcd(int x,int y);
int m,n;
scanf("%d %d",&n,&m);
int num1=gcd(n,m);
int num2=n*m/num1;
printf("%d,%d的最大公约数为:%d\n",n,m,num1);
printf("%d,%d的最小公倍数为:%d\n",n,m,num2);
return 0;
}
int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
求解一元二次方程
#include<stdio.h>
#include<math.h>
double x1,x2,p,q;
int main(){
void dayu_zero(double b,double disk,double a);
void xiaoyu_zero(double b,double disk,double a);
void dengyu_zero(double b,double disk,double a);
double a,b,c;
scanf("%lf,%lf,%lf",&a,&b,&c);
double disk=b*b-4*a*c;
if(disk>0){
dayu_zero(b,disk,a);
printf("实数解x1=%lf\n",x1);
printf("实数解x2=%lf\n",x2);
} else if(disk==0){
//两个相等实数解
dengyu_zero(b,disk,a);
printf("实数解x1=%lf\n",x1);
printf("实数解x2=%lf\n",x2);
}else{
xiaoyu_zero(b,disk,a);
printf("虚数解x1=%lf+%lfi",p,q);
printf("虚数解x2=%lf-%lfi",p,q);
}
return 0;
}
void dayu_zero(double b,double disk,double a){
//两个实数解
x1=(-b+sqrt(disk))/(2*a);
x2=(-b-sqrt(disk))/(2*a);
}
void xiaoyu_zero(double b,double disk,double a){
p=-b/(2*a);
q=sqrt(-disk)/(2*a);
}
void dengyu_zero(double b,double disk,double a){
//两个相等实数解
x1=(-b+sqrt(disk))/(2*a);
x2=x1;
}
判断素数
#include<stdio.h>
#include<math.h>
int main(){
int panduan(int a);
int a=0;
scanf("%d",&a);
if(panduan(a)){
printf("%d为素数\n",a);
}else{
printf("%d不是素数\n",a);
}
return 0;
}
int panduan(int a){
int i=0;
if(a<=3){
return a!=1;
}
for(i=2;i<=sqrt(a);i++){
if(a%i==0)
return 0;
}
return 1;
}
行列互换
#include<stdio.h>
//1 2 3
//4 5 6
//7 8 9
int main(){
void fanzhuan(int arr[3][3]);
int arr[3][3],i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d",&arr[i][j]);
}
}
printf("翻转前的数组\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",arr[i][j]);
}
printf("\n");
}
fanzhuan(arr);
printf("翻转后的数组\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
void fanzhuan(int arr[3][3]){
int i,j,t;
for(i=0;i<3;i++){
for(j=i+1;j<3;j++){
t=arr[i][j];
arr[i][j]=arr[j][i];
arr[j][i]=t;
}
}
}
逆序字符串
#include<stdio.h>
#include<string.h>
int main(){
void reverse(int left,int right,char arr[]);
char arr[100];
scanf("%s",arr);
printf("顺序->%s\n",arr);
int right=strlen(arr)-1;//减一是因为数组索引到不了
reverse(0,right,arr);
printf("逆序->%s\n",arr);
return 0;
}
void reverse(int left,int right,char arr[]){
char temp;
if(left<right){
temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
reverse(left+1,right-1,arr);
}
}
连接字符串
#include<stdio.h>
int main(){
void lianjie(char* str1,char* str2);
char str1[100],str2[100];
printf("输入字符串str1:");
scanf("%s",str1);
printf("输入字符串str2:");
scanf("%s",str2);
lianjie(str1,str2);
printf("%s\n",str1);
return 0;
}
void lianjie(char* str1,char* str2){
while(*str1!='\0')
str1++;
while(*str2!='\0')
*str1++=*str2++;
*str1=*str2;
}
复制元音字母带另一个字符串
#include<stdio.h>
int main(){
void panduan(char* str1,char* str2);
char str1[100];
char str2[100];
scanf("%s",str1);
panduan(str1,str2);
printf("%s\n",str2);
return 0;
}
void panduan(char* str1,char* str2){
while(*str1!='\0'){
if(*str1=='a'||
*str1=='e'||
*str1=='i'||
*str1=='o'||
*str1=='u'||
*str1=='A'||
*str1=='E'||
*str1=='I'||
*str1=='O'||
*str1=='U'){
*str2++=*str1;
}
str1++;
}
*str2=*str1;
}
数字空格
#include<stdio.h>
int main(){
char arr[8];
int i=0;
for(i=0;i<=7;i++){
if(i%2==0)
scanf("%c",&arr[i]);
else
arr[i]=' ';
}
printf("%s\n",arr);
return 0;
}
#include<stdio.h>
#include<string.h>
int main(){
void add_space(char arr[],int sz);
char arr[8];
scanf("%s",arr);
int sz=strlen(arr)-1;
add_space(arr,sz);
printf("%s\n",arr);
return 0;
}
void add_space(char arr[],int sz){
int i=0;
for(i=sz;i>=0;i--){
arr[i+i]=arr[i];
arr[i+i+1]=' ';
}
}
输出最长单词
#include<stdio.h>
#include<string.h>
int main(){
int alpha(char);
int longest(char[]);
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("The longest word is:");
for(i=longest(line);alpha(line[i]);i++)
printf("%c",line[i]);
printf("\n");
return 0;
}
int alpha(char c){
if((c>='a'&&c<='z')||(c>='A'&&c<='z')){
return 1;
}else{
return 0;
}
}
int longest(char string[]){
int len=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(string);i++){
if(alpha(string[i])){
if(flag){
point=i;//标记单词起始位置
flag=0;
}else
len++;
}else{
flag=1;
if(len>=length){
length=len;
place=point;
len=0;
}
}
}
return place;
}
#include<stdio.h>
#include<string.h>
int main(){
int panduan(char);
char str[100];
gets(str);
int place=0,point;//标记最长单词起始位置
int maxlen=0;//最长的长度
int len=0,i,flag=1;
for(i=0;i<=strlen(str);i++){
if(panduan(str[i])){
if(flag){
point=i;
flag=0;
}
len++;
}else{
flag=1;
if(maxlen<len){
place=point;
maxlen=len;
}
//判断结束
len=0;
}
}
for(i=place;i<place+maxlen;i++)
printf("%c",str[i]);
printf("\n");
}
int panduan(char c){
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
return 1;
}else
return 0;
}
冒泡排序字符
#include<stdio.h>
int main(){
void sort(char arr[]);
char arr[10];
scanf("%s",arr);
printf("%s\n",arr);
sort(arr);
printf("%s\n",arr);
return 0;
}
void sort(char arr[]){
int i,j;
char cc;
for(i=1;i<10;i++){
for(j=0;j<10-i&&arr[j]!='\0';j++){
if(arr[j]>arr[j+1]){
cc=arr[j];
arr[j]=arr[j+1];
arr[j+1]=cc;
}
}
}
}
有问题的题
#include<stdio.h>
int main(){
int x,n;
double p(int n,int x);
printf("input x&n :");
scanf("%d %d",&n,&x);
printf("%.2lf\n",p(n,x));
return 0;
}
double p(int n,int x){
if(n==0)
return 1;
else if(n==1)
return x;
else if(n>1){
return (2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x)/n;
}
}
递归 数字转换为字符串
#include<stdio.h>
int main(){
void panduan(int n);
int n=0;
scanf("%d",&n);
if(n<0){
putchar('-');
putchar(' ');
n=-n;
}
panduan(n);
return 0;
}
void panduan(int n){
int i;
if((i=n/10)!=0){
panduan(i);
}
putchar(n%10+'0'); //强转 3+'0'
putchar(' ');
}
累加月份
#include<stdio.h>
int main(){
int year,month,day,sum=0;
scanf("%d %d %d",&year,&month,&day);
sum=day;
int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(year%400==0||(year%4==0&&year%100!=0))
month_day[2]=29;
int i=1;
for(i=1;i<month;i++)
sum+=month_day[i];
printf("%d",sum);
return 0;
}