C语言基础复习三(结构化程序设计例题)

例题一:求最大最小平均值

#include<stdio.h>
int main()
{
	int n,max,min,i=0,f;
	float average=0.0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&f);
		if(i==0)
		{
			max=f;
			min=f;
		}
		average+=f;
		if(f>max) max=f;
		else if(f<min) min=f;
	}
	average=average/n;
	printf("最大值:%d\n",max);
	printf("最小值:%d\n",min);
	printf("平均值:%.1f\n",average);
    return 0;
}

例题二:自建字符串连接函数

编写一个字符串连接函数

方法一

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* cat(char* a,char* b)
{
	int alen=strlen(a),blen=strlen(b),i=0;
	char* p=(char*)malloc((alen+blen+1)*sizeof(char));
	for(i=0;i<alen;i++)
	{
		p[i]=a[i];
	}
	for(i=alen;i<alen+blen;i++)
	{
		p[i]=b[i-alen];
	}
	p[alen+blen]='\0';
	return p;
}
int main()
{
	char arr1[30],arr2[30],*p;
	gets(arr1);
	gets(arr2);
	p=cat(arr1,arr2);
	puts(p);
	return 0;
}

运行结果:

注:这里的cat函数有两个参数,首先使用malloc函数开辟一片空间,空间大小由传入的两个数组的长度决定,总长度为len(a)+len(b)+1,其中最后一个用来存放'\0'。首先从0~len(a)-1,分别将a的内容一一复制到新创建的数组p上,接下来将从len(a)~len(a)+len(b)-1,将b数组的内容一一复制到新数组。这里p是从len(a)开始,而b要从0开始,所以b1的下标为(i-alen)。

方法二

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* cat(char* a,char* b)
{
	int i,j,alen,blen;
	alen=strlen(a);
	blen=strlen(b);
	char* p=(char*)malloc((alen+blen+1)*sizeof(char));
	for(i=0;i<alen;i++)
	{
		p[i]=a[i];
	}
	for(j=0;j<blen;j++)
	{
		p[alen+j]=b[j];
	}
	p[alen+blen]='\0';
	return p;
}
int main()
{
	char arr1[30],arr2[30],*p;
	gets(arr1);
	gets(arr2);
	p=cat(arr1,arr2);
	puts(p);
	return 0;
}

这里用到了两个下标,i和j,第一次循环i改变,第二次循环j改变。

例题三:计算器设计

计算器程序设计,用户输入运算数和四则运算符,输出计算结果。

#include<stdio.h>
int main()
{
	float a,b;
	char c;
	printf("input xepression:a+(-、*、/)b=\n");
	scanf("%f%c%f",&a,&c,&b);
	switch(c)
	{
		case '+':
		{
			printf("%f\n",a+b);
			break;
		}
	case '-':
		{
			printf("%f\n",a-b);
			break;
		}
	case '*':
		{
			printf("%f\n",a*b);
			break;
		}
	case '/':
		{
			printf("%f\n",a/b);
			break;
		}
	default:printf("input error\n");
	}
	return 0;
}

运行结果:

例题四:车牌限行

已知某市的车牌号采用限行制度,星期一限行车牌号尾数为1、6;星期二为2、7,星期三为3、8;星期四为4、9;其他尾数为星期五。

#include<stdio.h>
int main()
{
	int x,y;
	scanf("%d",&x);
	y=x%10;//除10取余得到最低位!
	if(y==1||y==6) printf("周一限行"); 
	else if(y==2||y==7) printf("周二限行");
	else if(y==3||y==8) printf("周三限行");
	else if(y==4||y==9) printf("周四限行"); 
	else printf("周五限行");
	return 0;
}

运行结果

例题五:求圆周率

求圆周率pi的近似值,计算公式为\frac{pi}{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-\frac{1}{11}+......

#include<stdio.h>
#include<math.h>
int main()
{
	int s=1;//以此来表示符号
	double n=1.0,pi=0.0,t=1.0; //n为分母,pi为各项不断累加,t为这一个项的的值
	while(fabs(t)>1e-6)
	{
		t=s*1/n;
		pi+=t;
		s=-s;//每循环一次改变一次符号
		n+=2;//分母每次加2
	}
	pi=4*pi;
	printf("PI:%lf",pi);
	return 0;
}

例题六:倒序输出

从键盘输入一个非负整数,并将此数倒叙输出(如输入:12345,输出54321)

#include<stdio.h>
int main()
{
	int x,s=0;
	scanf("%d",&x);
	while(x!=0)
	{
		s=x%10;//取最低位
		x/=10;//将最低位舍去
		printf("%d",s);
	}
    return 0;
}

例题七:判断素数

#include<stdio.h>
#include<math.h>
int isprime(int n)
{
	if(n==1) return 0;
	if(n==2) return 1;
	int i,flag=1;//flag作为标记位,默认为素数 
	for(i=2;i<sqrt(n)+1;i++)
	{
		if(n%i==0)
		{
			flag=0;	//有能够整除的,就说明不是素数。 
			break;
		}
	}
	return flag;
}
int main()
{
	int x;
	scanf("%d",&x);
	if(isprime(x)) printf("%d是素数",x);
	else printf("%d不是素数",x);
    return 0;
}

注意:1不是素数,2是素数要单独判断

例题八:统计个十百位不同的数字个数

统计100~999中,个位,十位,百位数字各不相同的整数的个数。

方法一

#include<stdio.h>
int main()
{
	int a,b,c,count=0;
	for(a=1;a<=9;a++)
	{
		for(b=0;b<=9;b++)
		{
			for(c=0;c<=9;c++)
			{
				if(a!=b&&a!=c&&b!=c) count++;
			}
		}
	}
	printf("count=%d",count);
    return 0;
}

注:这里将a,b,c分别作为这个数字的百位、十位、个位。

方法二

#include<stdio.h>
int main()
{
	int i,a,b,c,count=0;
	for(i=100;i<=999;i++)
	{
		c=i%10;//获取个位
		b=(i/10)%10;//获取十位
		a=(i/100);//获取百位
		if(a==b||a==c||b==c) continue;//不符合条件时,跳出本层循环,count不进行自加 
		count++; 
	}
	printf("count=%d",count);
    return 0;
}

例题九:百钱买百鸡(解三元二次方程)

100个铜钱买了100只鸡,其中公鸡一只5钱,母鸡一只3钱,小鸡一钱3只,问100只鸡中公鸡、母鸡、小鸡各多少?罗列出所有可能的答案。

设,公鸡、母鸡、小鸡分别位x,y,z只。则5x+3y+\frac{z}{3}=100,x+y+z=100;

#include<stdio.h>
int main()
{
	int x,y,z;
	for(x=0;x<=20;x++)
	{
		for(y=0;y<=34;y++)
		{
			for(z=0;z<=100;z+=3)
			{
				if((5*x+3*y+y/3==100)&&(x+y+z==100))
				printf("公鸡:%2d个,母鸡:%2d个,小鸡:%2d个\n",x,y,z);
			}
		}
	}
    return 0;
}

例题十:求最大公因数和最小公倍数

输入两个数,打印出两个数的最小公倍数和最大公因数。

方法一:枚举法

#include<stdio.h>
int gcf(int a,int b)
{
	int c;//用来存储潜在的最大公因数 
	c=a<b?a:b;//找出两个数中最小的,因为最大公因数一定<=两数间最小的 
	while(1)
	{
		if(a%c==0&&b%c==0)//极限境况是c自减到1 
		{
			return c;
		}
		else c--;
	}
}
int lcm(int a,int b)
{
	int c;//存储潜在小公倍数 
	c=a>b?a:b;
	while(1)
	{
		if(c%a==0&&c%b==0)
		{
			return c;
		}
		else c++;
	}
}
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	printf("最大公因数:%d\n",gcf(a,b));
	printf("最小公倍数:%d\n",lcm(a,b));
    return 0;
}

方法二:欧几里得算法(辗转相除法)

只要改变一下,求最大公因数的函数gcf就可以了。

int gcf(int a,int b)
{
	int t;
	while(t=a%b)
	{
		a=b;
		b=t;
	} 
	return b;
}

例题11:s=a+aa+aaa+...

其中a是任意数,几个数需要键盘输入。

#include<stdio.h>
int main()
{
	int n,a,i=0,s=0,sum=0;
	scanf("n=%d,a=%d",&n,&a);
	for(i=0;i<n;i++)
	{
		s=s*10+a;
		sum+=s;
	}
	printf("%d\n",sum);
    return 0;
}

例题12:统计“完全数”

输入一个数字n,统计1~n的完全数个数,完全数:一个属等于自身所有因子之和。

(如1+2+3=6,6就是完全数)

题目转化为求一个数的所有因子。

#include<stdio.h>
int main()
{
	int n,i,j,sum=0,count=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<(int)(i/2)+1;j++)
		{
			if(i%j==0)
			{
				sum=sum+j;
			}
		}
		if(sum==i)
		{
			count++;
			printf("%d是完全数\n",i);
		}
		sum=0;//循环一个i,将sum归零,重新进行下一个i的判断! 
	}
	printf("完全数共 %d个",count);
    return 0;
}

这里特别要注意的是每次循环一个i后要进行对sum的归零处理!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

背水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值