我们在学习编程过程中往往不仅有C语言实验报告,还有程序设计实验报告。程序设计这一科目主要是为了培养我们写代码时的计算思维,养成从问题到代码实现逐步分析,逐步深入的好习惯。
目录
2.编程计算n!。(n是1到20之间的整数,如果n<1或者n>20则提示“输入错误请重新输入,程序进入重新输入环节,直到用户输入正确数值!”)
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)。
10.构建一个函数int max(int xint y)求两个数的最大值,并通过该函数求任意三个整数的最大值。
17.将两个无序的一维数组排序,然后将其合并到一个一维数组中,仍保持数组有序。
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;
}
其实,除法运算是加减乘除中比较特殊的一个,对于两个操作数是有一定的规定(不同规定,运算结果不同),希望大家能多去了解一下这些基础知识。(当然上面代码不是纯正的本题代码,大家小心使用)