程序设计基础中可能出现的简单编程题1(以郑大为主体)

  我们在学习编程过程中往往不仅有C语言实验报告,还有程序设计实验报告。程序设计这一科目主要是为了培养我们写代码时的计算思维,养成从问题到代码实现逐步分析,逐步深入的好习惯。

目录

1.输入三个正整数(程序要判断是否是正整数,如果不是,提示“输入错误,请重新输入,程序进入重新输入环节,直到用户输入正整数!判定是否能够构成直角三角形。显示信息:你所输入的数据如下:a=12 b=22 c=21。确认继续运行,请按Y,重新输入请按n,按其他键退出程序!

 2.编程计算n!。(n是1到20之间的整数,如果n<1或者n>20则提示“输入错误请重新输入,程序进入重新输入环节,直到用户输入正确数值!”)

3.判断一个数是否是对称数。

4.输入一个正整数,将该数的八进制表示逆序输出。

5.输入一个正整数,计算该十进制数是多少位。

6.编制程序,输出1000对李生素数(差值为2的成对素数,例如:3和5、11和13,17-19)。判断是否是素数写成一个函数。

7.有0、1、2、3、4,任选三个数组成一个三位数 (可重复),有多少个这样的三位数?分别都是多少?输出三位数时每行输出5个。

8.计算输出:s(n)=1-1/2+1/3-1/4+1/5-…+(-1)^(n-1)1/n的极限值。要求计算误差不大于10^(-3)。 

9.通过函数调用,实现任意两个数的除法运算。

10.构建一个函数int max(int xint y)求两个数的最大值,并通过该函数求任意三个整数的最大值。

11.通过函数调用,计算两个数的最小公倍数。

12.用递推法实现 cos(x)

13.用递归算法求:1+2+3+......+n。

14.用递归算法求数组元素的和。

15.用递归语句,计算x^n。其中,n是正整数。

16.用递归的方法实现十进制到八进制的转换。

17.将两个无序的一维数组排序,然后将其合并到一个一维数组中,仍保持数组有序。

18.输入一个分数,将其划为最简。例如:12/24 化简为 1/2。为了把分数约分为最简分式,首先计算分子和分母的最大公约数,然后分子和分母都除以最大公约数。求最大公约数的经典算法是Euclid算法方法如下:分别让变量m和n存储两个数的值。如果n为0,那么停止操作m中的值是最大公约数 (GCD) :否则计算m除以n的余数,把n保存到m并把余数保存到n中。然后重复上述过程,每次都先判定n是否为0。

19.有100个人围坐在一张圆桌边,座次为1~100,开始时第13座次的人先退席,以后每次数到第13个人退席,编写程序,给出退席顺序。


1.输入三个正整数(程序要判断是否是正整数,如果不是,提示“输入错误,请重新输入,程序进入重新输入环节,直到用户输入正整数!判定是否能够构成直角三角形。显示信息:你所输入的数据如下:a=12 b=22 c=21。确认继续运行,请按Y,重新输入请按n,按其他键退出程序!
#include<stdio.h> 
#include<stdlib.h>
int main()
{
	int a,b,c;
	char ch;
	printf("请输入三个正整数\n");
	scanf("%d%d%d",&a,&b,&c);
	fflush(stdin);//在获取带空格的输入字符串时,缓冲区不会为下一个输入清除,即系统会把空格直接赋值给变量,可能不是我们所设想的值,影响结果 
	if(a<=0||b<=0||c<=0) 
		printf("输入错误,请重新输入\n");
	else
	{
		printf("你所输入的数据如下:a=%d,b=%d,c=%d\n",a,b,c);
		printf("确认继续运行,请按y,重新输入请按n,按其他键退出程序!\n");
		scanf("%c",&ch) ;
		if(ch=='y')
		{
			if(a*a+b*b==c*c||b*b+c*c==a*a||a*a+c*c==b*b)
				printf("该三角形是直角三角形\n");
			else
				printf("该三角形不是直角三角形\n");
	    }
		else if(ch=='n')
		{
			printf("请重新输入\n");
			scanf("%d%d%d",&a,&b,&c);
			if(a*a+b*b==c*c||b*b+c*c==a*a||a*a+c*c==b*b)
				printf("该三角形是直角三角形\n");
			else
				printf("该三角形不是直角三角形\n");
		}
		else
			exit(0);
	}

	return 0;
}

fflush(stdin);//在获取带空格的输入字符串时,缓冲区不会为下一个输入清除,即系统会把空格直接赋值给变量,可能不是我们所设想的值,影响结果 。比如在本题,如果我们把该语句注释掉,那么在我们输完三边之长后,程序就不会让我们输入c的值,因为c直接从缓冲区得到我们输入三边时最后的回车字符,则程序结果错误。大家可以自行尝试一下,当然大家也可以加个do…while循环语句,让程序更完善。

 2.编程计算n!。(n是1到20之间的整数,如果n<1或者n>20则提示“输入错误请重新输入,程序进入重新输入环节,直到用户输入正确数值!”)
#include<stdio.h>
int main()
{
	long long int a=1;
	int n,i;
	for(;;)
	{
		fflush(stdin);
		printf("请输入1到20之间的整数\n");
		scanf("%d",&n);
		if(n<1||n>20) 
			printf("输入错误,请重新输入\n");
		else
			break;
	}
	for( i=1;i<=n;i++)
	{
		a*=i;
	}
	printf("阶乘的结果为:%lld\n",a);
	return 0;
}

这里又出现了fflush(stdin),主要是为确保数据的准确性,避免得到的数据不是想要的,更严谨。另外,for(;;)有没有让大家懵懵的呢?其实,这就是一个死循环了,所以,你要是这样写,里面必须有break,不然程序就停不下来了。

3.判断一个数是否是对称数。
#include<stdio.h>
int main()
{
	int n=0;
	int num,i,j,r;
	int arr[100000];
	printf("请输入整数:");
	scanf("%d",&num);
	while(num)
	{
		r=num%10;
		arr[n++]=r;
		num=num/10;
	}
	for(i=0;i<n/2;i++)
	{
		if(arr[i]!=arr[n-1-i])
		{
			printf("非对称数");
			break; 
		}
		else
		{
			printf("对称数");
			break; 
		}
	}
	return 0;
}

上面的代码也算是取巧了,因为我们都知道对称数的特点,以中间一个数或者两个数为对称轴前后对称。所以,我在上面就通过逐位取模把每一位数放入数组,最后通过数组元素比较来判断是否为对称数。大家也可以想想对称数还有什么特点,有没有更为简便的判断方法呢?

4.输入一个正整数,将该数的八进制表示逆序输出。
#include<stdio.h>
int main()
{
	int n=0;
	int num,i,r;
	char ch[10];
	printf("请输入一个正整数\n");
	scanf("%d",&num);
	while(num)
	{
		r=num%8;
		ch[n++]=r+'0';//逆序输出48是0的Ascll值 
		num=num/8;
	}
	for(i=0;i<n;i++)
		printf("%c",ch[i]);
	printf("是该正整数的逆序八进制数") ; 
	return 0;
}

这道题有两个值得大家注意的地方。①整型数据r+48变成字符型到底是什么情况?②八进制数是怎么表示?大家好好想一想,尤其是①这个是比较容易搞迷的。当然,这种知识后面也会仔细讲,希望能够帮助到大家。

5.输入一个正整数,计算该十进制数是多少位。
#include<stdio.h>
int main()
{
	int n=0;
	int num;
	printf("请输入一个正整数\n");
	scanf("%d",&num);
	while(num)
	{
		num=num/10;
		n=n+1; 
	}
	printf("该正整数的位数是:%d ",n);
	return 0;
}

这道题属于中规中矩了,没有特别的知识点,只需要想明白就很好写了。

6.编制程序,输出1000对孪生素数(差值为2的成对素数,例如:3和5、11和13,17-19)。判断是否是素数写成一个函数。
#include<stdio.h>
#include<math.h>
int isPrime(int x)
{
	int i=0;
	int flag=1;
	if(x==1)
		flag=1; 
	if(x==2) 
	    flag=0;//当我们把for语句中的判断语句变成了sqrt(x) 后,由int会取整数部分,所以会产生错误 
	else
	{
		for(i=2;i<sqrt(x);i++)
		{
			if(x%i==0)//在上面范围中,若能整除则不是素数 
			{
				flag=0;
			}
		}
	}
    return flag;
}
int main()
{
	int i,count=0;
	for(i=1;count<1000;i++) //先确定让它打印1000对 
	{
		if(isPrime(i)&&isPrime(i+2)) //if语句需要判断条件 &&只有两边都为真才为真。flag为返回值,理应 
		 {
		 	count++;
		 	printf("第%d对孪生素数是%d和%d\n",count,i,i+2);
		 }
	}
	return 0;
}

这道题的知识点应该有三个:①素数的判断,素数判断函数的建立。②flag的使用,这里引入这样一个看似没有什么用的变量,实则是将其作为一个判断标准。在很多复杂程序中,为了避免大量无用计算,极高程序效率,都会引入一个类似的变量,起到控制进程的开关作用。③逻辑与&&的首次出现,还有别的逻辑运算符值得大家了解。

7.有0、1、2、3、4,任选三个数组成一个三位数 (可重复),有多少个这样的三位数?分别都是多少?输出三位数时每行输出5个。
#include<stdio.h> 
int main()
{
	int i=0,j=0,n=0;
	int s;
	int count=0;
	for(i=1;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			for(n=0;n<5;n++)
			{                  
				s=i*10*10+j*10+n;
				printf(" 第%2d个三位数:%d ",count,s);
				count++;
			}
			printf("\n");
		}
	}
	printf("共计三位数个数=%d",count);
	return 0;
}

这个题没有太多值得讲解的地方,只要对三位数有一定认识,知道循环嵌套基本上就ok了。唯一值得关注的是我的i是从1开始,而不是一贯从0开始,大家可以思考下为什么这样设计。

8.计算输出:s(n)=1-1/2+1/3-1/4+1/5-…+(-1)^(n-1)1/n的极限值。要求计算误差不大于10^(-3)。 
#include<stdio.h>
int main()
{
	double i=1.0,result=0;
    int sign=1,n=0;//用来改变符号
	for(n=1;i>0.001;n++)
	{
		i=(double)1/n;
		result+=(double)sign*i;
		sign=-sign;
	}
	printf("当n=%d时,result=%f",n-1,result);
	return 0;
}

这里关于n是int类型,还是double类型,最开始还犹豫了很久,后来一看题干,这不铁int吗?所以,大家写题时首要任务是看清题干。此外,这题要注意类型转换,避免导致因为类型问题精度有所损失。

9.通过函数调用,实现任意两个数的除法运算。
#include<stdio.h>
void menu()
{	
	printf("1.求两个数的和\n");
	printf("2.求两个数的差\n"); 
	printf("3.求两个数的商和模\n"); 
	printf("4.求两个数的倒数之和\n");
	printf("0.退出系统\n");
	printf("请做出你的选择:\n");
}

void Add(float x,float y)
{
	float num=0;
	printf("%.2f\n",num=x+y);
}

void Sub(float x,float y)
{
	float num=0	;
	printf("输出的结果为:%.2f\n",num=x-y);
}

void Div(float x,float y)
{
	float num=0;
	int mol=0;
	printf("输出的结果为:%.2f %d",num=x/y,mol=(int)x%(int)y);
}

void BackAdd(float x,float y)
{
	float num=0;
	printf("输出的结果为:%.2f",num=(1/x)+(1/y));
}		     	
void Math()
{
    float a,b;
    int x=0;
	do
	{
	    menu();
		scanf("%d",&x);
		switch(x)
	    {
		    case 1:
			    {
			       printf("您选择:求两个数的和,请输入两个数\n");
			       scanf("%f%f",&a,&b);
				   Add(a,b);
				   break;
		     	}
		    case 2:
			    {
			       printf("您选择:求两个数的差,请输入两个数(前为被减数,后为减数)\n"); 
			       scanf("%f%f",&a,&b);
			       Sub(a,b);
				   break;
		    	}
	     	case 3:
			    {
				   printf("您选择:求两个数的商和模,请输入两个数(前者为被除数,后为除数)\n"); 	
			       scanf("%f%f",&a,&b);
			       Div(a,b);
			       break;
	 	   	    }
		    case 4:
			    {
			    	printf("您选择:求两个数的倒数之和,请输入两个数\n"); 	
			        scanf("%f%f",&a,&b);
			        BackAdd(a,b);
		    		break;   
		       	}
     		case 0:
			    {
			    	printf("退出系统\n");
			     	break; 
			    }
		    default:
		    	{
				    printf("输入错误,重新选择\n");
		    	    break;
			    }
			    
	   }
	}while(x);
}
int main()
{
	Math();
	return 0; 
}

其实,除法运算是加减乘除中比较特殊的一个,对于两个操作数是有一定的规定(不同规定,运算结果不同),希望大家能多去了解一下这些基础知识。(当然上面代码不是纯正的本题代码,大家小心使用)

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值