一、实验目的:
1.深入理解循环结构程序的设计思想,熟悉和掌握while 语句、do—while语句和for语句的使用规则和流程。
2. 掌握嵌套的循环结构的实现。
3.掌握break语句、continue语句的功能及其异同。
4.掌握在程序设计中用循环的方法实现各种算法(如穷举、累加(累乘)、迭代等)。
5.进一步熟练程序调试的技能。
二、实验内容:
项目1 找出最小值
【项目任务】输入一个正整数 n, 再输入 n 个整数,找出其中的最小值。试编写相应程序。
【项目目的】
(1)正确使用for循环;
(2)理解“排序”算法的开始思路。
程序源代码
#include <stdio.h>
int main()
{
int i,n,t;
scanf(“%d”,&n);
int a[n];
for(i=0;i<n;i++)
{
scanf(“%d”,&a[i]);
}
t=a[0];
for(i=0;i<n;i++)
{
if(t>a[i])
{
t=a[i];
}
}
printf(“%d”,t);
return 0;
}
项目2 黑洞数问题
【项目说明】黑洞数也称为陷阱数,又称“ Kapreka 问题”,是一类具有奇特转换特性的数。任何一个数字不全相同的三位数,经有限次 “重排求差”操作(即组成该数的数字重排后的最大数减去重排后的最小数),总会得到 495 。最后所得的 495 即为三位黑洞数,四位黑洞数为6174。
【项目任务】
验证黑洞数问题。
例如,对三位数207:
第1次重排求差得:720-27 = 693
第2次重排求差得:963-369 = 594
第3次重排求差得:954-459 = 495
以后会停留在495这一黑洞数。如果三位数的 3 个数字全相同,一次转换后即为 0 。
输入一个三位数n ,编程给出重排求差的过程。
程序源代码
#include<stdio.h>
void paixu(int* g,int* s,int* b)//利用指针函数分别求出个位、十位、百位。
{
int t;
if(*g>*b)
{
t=*b;
*b=*g;
*g=t;
}
if(*g>*s)
{
t=*s;
*s=*g;
*g=t;
}
if(*s>*b)
{
t=*s;
*s=*b;
*b=t;
}
}
int main()
{
int n,m=0,ge,shi,bai,chuzhi=0,mozhi=0,jieguo=0;
scanf(“%d”,&n);
printf(“对三位数%d:\n”,n);
do
{
m++;
ge=n%10;
shi=n/10%10;
bai=n/100;
paixu(&ge,&shi,&bai);
if(ge==shi==bai)
{
printf(“第%d次重排求差得:0\n”,m);
}
else if(ge==0)//讨论个位为0的情况
{
if(ge==0&&shi!=0)//个位为0,十位不为0
{
chuzhi=bai100+shi10+ge;
mozhi=shi10+bai;
jieguo=bai100+shi10+ge-shi10-bai;
printf(“第%d次重排求差得:%d-%d=%d\n”,m,chuzhi,mozhi,jieguo);
n=bai100+shi10+ge-shi10-bai;
}
else//个位为0,十位为0
{
chuzhi=bai100+shi10+ge;
mozhi=bai;
jieguo=bai100+shi10+ge-bai;
printf(“第%d次重排求差得:%d-%d=%d\n”,m,chuzhi,mozhi,jieguo);
n=bai100+shi10+ge-bai;
}
}
else个位,十位,百位都不为0
{
chuzhi=bai100+shi10+ge;
mozhi=ge100+shi10+bai;
jieguo=bai100+shi10+ge-ge100-shi10-bai;
printf(“第%d次重排求差得:%d-%d=%d\n”,m,chuzhi,mozhi,jieguo);
n=bai100+shi10+ge-ge100-shi10-bai;
}
if(n==495)//当n为495时跳出循环
{
break;
}
}while(1);
return 0;
}