C语言编程实验课之循环结构.docx
- 文档编号:18584698
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:25
- 大小:39.05KB
C语言编程实验课之循环结构.docx
《C语言编程实验课之循环结构.docx》由会员分享,可在线阅读,更多相关《C语言编程实验课之循环结构.docx(25页珍藏版)》请在冰点文库上搜索。
C语言编程实验课之循环结构
1.奇偶分家
给定N个正整数,请统计奇数和偶数各有多少个?
输入格式:
输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。
输出格式:
在一行中先后输出奇数的个数、偶数的个数。
中间以1个空格分隔。
输入样例:
9
887410126150342277
输出样例:
36
(1)编程思路。
用一重循环for(inti=1;i<=n;i++)依次读入n个非负整数,每读入一个整数x,判断其奇偶性,若为奇数,cnt1++;若为偶数,cnt2++。
(2)源程序。
#include
intmain()
{
intn;
scanf("%d",&n);
intcnt1=0,cnt2=0;
intx;
for(inti=1;i<=n;i++)
{
scanf("%d",&x);
if(x%2==1)
cnt1++;
else
cnt2++;
}
printf("%d%d\n",cnt1,cnt2);
return(0);
}
2.求交错序列前N项和
本题要求编写程序,计算交错序列1-2/3+3/5-4/7+5/9-6/11+...的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留三位小数。
输入样例:
5
输出样例:
0.917
(1)编程思路。
序列中,第i项的分子为i,分母为(2*i-1),其符号为(-1)i-1。
但在计算交错序列时,最好不用(-1)i-1来处理第i项的符号。
一个简单的办法是:
设置一个表示符号的变量flag,初始时,flag=1,表示正项(或加号),flag=-1,表示负项(或减号)。
每循环累加一项后,flag=-flag,这样flag的值在1,-1,1,-1,…之间进行切换,正好符合交错序列的变化。
从而,序列第i项表示为flag*i/(2*i-1)。
(2)源程序。
#include
intmain()
{
intn;
scanf("%d",&n);
doubles=0;
intflag=1;
for(inti=1;i<=n;i++)
{
s=s+1.0*flag*i/(2*i-1);
flag=-flag;
}
printf("%.3f\n",s);
return(0);
}
3.求给定精度的简单交错序列部分和
本题要求编写程序,计算序列部分和1-1/4+1/7-1/10+...直到最后一项的绝对值不大于给定精度eps。
输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum=S”的格式输出部分和的值S,精确到小数点后六位。
题目保证计算结果不超过双精度范围。
输入样例1:
4E-2
输出样例1:
sum=0.854457
输入样例2:
0.02
输出样例2:
sum=0.826310
(1)编程思路。
交错序列的求法类同上一题。
只是本题计算的项数不能直接确定,是计算到最后一项的绝对值不大于给定精度eps。
采用while循环完成,循环条件为:
while(fabs(p)>eps)//其中p为最后一项。
(2)源程序。
#include
#include
intmain()
{
intt=1,i=1;
doublesum=0,p=1.0,eps;
scanf("%lf",&eps);
if(eps>=1)
printf("sum=%.6f",p);
else
{
while(fabs(p)>eps)
{
p=t*1.0/i;
sum=sum+p;
i+=3;
t=-t;
}
printf("sum=%.6f",sum);
}
return0;
}
4.最大公约数和最小公倍数
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511292
输出样例:
732044
(1)编程思路。
利用转辗相除法求两个整数的最大公约数。
例如,求整数m=48,n=18两个数的最大公约数的方法如下图所示。
具体做法是:
,若m%n==0,则n是最大公约数,否则,计算r=m%n,置m=n,n=r,重复这个过程,直到m%n==0。
(2)源程序。
#include
intmain()
{
intm,n;
scanf("%d%d",&m,&n);
inta,b,r;
a=m,b=n;
while(a%b!
=0)
{
r=a%b;
a=b;
b=r;
}
printf("%d%d\n",b,m*n/b);
return(0);
}
5.统计字符
本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
输入格式:
输入为10个字符。
最后一个回车表示输入结束,不算在内。
输出格式:
在一行内按照letter=英文字母个数,blank=空格或回车个数,digit=数字字符个数,other=其他字符个数的格式输出。
输入样例:
aZ&
09Az
输出样例:
letter=4,blank=3,digit=2,other=1
(1)编程思路。
用循环读入10个字符,每读入一个字符进行判断,根据判断结果进行相应计数即可。
(2)源程序。
#include
intmain()
{
charch;
intletter=0,blank=0,digit=0,other=0;
for(inti=1;i<=10;i++)
{
ch=getchar();
if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')
letter++;
elseif(ch>='0'&&ch<='9')
digit++;
elseif(ch==''||ch=='\n')
blank++;
else
other++;
}
printf("letter=%d,blank=%d,digit=%d,other=%d\n",letter,blank,digit,other);
return(0);
}
6.寻找250
对方不想和你说话,并向你扔了一串数……而你必须从这一串数字中找到“250”这个高大上的感人数字。
输入格式:
输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。
输出格式:
在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。
题目保证输出的数字在整型范围内。
输入样例:
888666123-23325013250-222
输出样例:
5
(1)编程思路。
由于输入的数据个数未知,因此采用循环while(scanf("%d",&x)!
=EOF)输入各数据。
(2)源程序。
#include
intmain()
{
intans=0,cnt=0,x;
while(scanf("%d",&x)!
=EOF)
{
cnt++;
if(x==250&&ans==0)ans=cnt;
}
printf("%d\n",ans);
return0;
}
7.大笨钟
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。
不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。
一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。
另外,虽然一天有24小时,钟却是只在后半天敲1~12下。
例如在23:
00敲钟,就是“当当当当当当当当当当当”,而到了23:
01就会是“当当当当当当当当当当当当”。
在午夜00:
00到中午12:
00期间(端点时间包括在内),笨钟是不敲的。
下面就请你写个程序,根据当前时间替大笨钟敲钟。
输入格式:
输入第一行按照hh:
mm的格式给出当前时间。
其中hh是小时,在00到23之间;mm是分钟,在00到59之间。
输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。
如果不是敲钟期,则输出:
Onlyhh:
mm.TooearlytoDang.
其中hh:
mm是输入的时间。
输入样例1:
19:
05
输出样例1:
DangDangDangDangDangDangDangDang
输入样例2:
07:
05
输出样例2:
Only07:
05.TooearlytoDang.
(1)编程思路。
根据输入的时间判断笨钟是否敲响,若给定时间为午夜00:
00到中午12:
00期间(条件描述为:
hh<12||(hh==12&&mm==0)),输出笨钟不会敲响的信息;否则,计算需要敲击的次数num,num=hh-12,并且若mm>0,num++。
然后用循环输出num个字符串“Dang”即可。
(2)源程序。
#include
intmain()
{
inthh,mm;
scanf("%d:
%d",&hh,&mm);
if(hh<12||(hh==12&&mm==0))
printf("Only%02d:
%02d.TooearlytoDang.\n",hh,mm);
else
{
intnum;
num=hh-12;
if(mm>0)num++;
for(inti=1;i<=num;i++)
printf("Dang");
printf("\n");
}
return(0);
}
8.求特殊方程的正整数解
本题要求对任意给定的正整数N,求方程X2+Y2=N的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程X2+Y2=N的全部正整数解,其中X≤Y。
每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。
如果没有解,则输出NoSolution。
输入样例1:
884
输出样例1:
1028
2022
输入样例2:
11
输出样例2:
NoSolution
(1)编程思路1。
采用穷举法求方程的整数解。
X取1~
之间的正整数,Y也取X~
之间的正整数,用二重循环对X和Y的取值组合进行穷举,若X2+Y2=N成立,则找到一组解输出。
(2)源程序1。
#include
#include
intmain()
{
intn;
scanf("%d",&n);
intx,y,t,cnt=0;
t=(int)sqrt(n);
for(x=1;x<=t;x++)
for(y=x;y<=t;y++)
{
if(x*x+y*y==n)
{
printf("%d%d\n",x,y);
cnt++;
}
}
if(cnt==0)
printf("NoSolution\n");
return(0);
}
(3)编程思路2。
上面程序1,采用二重循环穷举X和Y的组合情况。
实际上,只需穷举X(取1~
之间的正整数),对每一个X,计算出Y(
),若Y>X且Y为整数,则找到一组解。
(4)源程序2。
#include
#include
intmain()
{
intn;
scanf("%d",&n);
intx,y,t,cnt=0;
t=(int)sqrt(n);
for(x=1;x<=t;x++)
{
y=(int)sqrt(n-x*x);
if(y>=x&&x*x+y*y==n)
{
printf("%d%d\n",x,y);
cnt++;
}
}
if(cnt==0)
printf("NoSolution\n");
return(0);
}
9.求符合给定条件的整数集
给定不超过6的正整数A,考虑从A开始的连续4个数字。
请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。
整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234235243245253254
324325342345352354
423425432435452453
523524532534542543
(1)编程思路。
设满足条件的三位数的百位、十位和个位数分别为x、y和z。
每个数位上的数字可以取a~a+3这四个数字,采用三重循环对x、y和z的组合情况进行穷举即可。
for(x=a;x<=a+3;x++)
for(y=a;y<=a+3;y++)
for(z=a;z<=a+3;z++)
{//……}
在穷举时一定要保证x、y、z互不相同。
(2)源程序。
#include
intmain()
{
inta;
scanf("%d",&a);
intx,y,z,cnt=0;
for(x=a;x<=a+3;x++)
{
for(y=a;y<=a+3;y++)
{
if(y==x)continue;
for(z=a;z<=a+3;z++)
{
if(z==x||z==y)continue;
printf("%d%d%d",x,y,z);
cnt++;
if(cnt%6==0)printf("\n");
elseprintf("");
}
}
}
return(0);
}
10.打印九九口诀表
下面是一个完整的下三角九九口诀表:
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81
本题要求对任意给定的一位正整数N,输出从1*1到N*N的部分口诀表。
输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。
输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
(1)编程思路。
程序写成一个嵌套的二重循环,外循环i控制输出的行数(1~n),内循环j控制每行中输出i个乘法算式。
(2)源程序。
#include
intmain()
{
intn;
scanf("%d",&n);
for(inti=1;i<=n;i++)
{
for(intj=1;j<=i;j++)
printf("%d*%d=%-4d",j,i,i*j);
printf("\n");
}
return0;
}
11.打印菱形图案
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号“*”组成的菱形,如样例所示。
每个星号后跟一个空格。
输入样例:
7
输出样例:
*
***
*****
*******
*****
***
*
(1)编程思路。
程序写成两个嵌套的二重循环,第一个二重循环用于输出菱形图案的上半部,其中外循环(设循环变量为i)控制输出的行数(1~(n+1)/2),内循环控制每行(第i行)的输出,可由两个独立的一重循环完成,先用一个一重循环输出(n+1)/2-i个空格;再用一个一重循环输出2*i-1个星号“*”。
第二个二重循环用于输出菱形图案的下半部,其中外循环(设循环变量为i)控制输出的行数(n/2~1),内循环控制每行(第i行)的输出,同样由两个独立的一重循环完成,先用一个一重循环输出(n+1)/2-i个空格;再用一个一重循环输出2*i-1个星号“*”。
(2)源程序。
#include
intmain()
{
intn;
scanf("%d",&n);
for(inti=1;i<=(n+1)/2;i++)
{
for(intj=1;j<=(n+1)/2-i;j++)
printf("");
for(intk=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
for(inti=n/2;i>=1;i--)
{
for(intj=1;j<=n/2-i+1;j++)
printf("");
for(intk=1;k<=2*i-1;k++)
printf("*");
printf("\n");
}
return(0);
}
12.打印空心字符菱形
本题目要求读入菱形起始字母和菱形的高度,然后输出空心字符菱形。
所谓“空心菱形”是指:
每行由两端为字母、中间为空格的字符串构成,每行的字符串中心对齐;上半部分相邻两行字符串长度差2,且字母从给定的起始字母逐一递增;下半部分与上半部分对称。
输入格式:
输入在一行中给出起始字母(范围为英文大写字母A-G)和菱形的高度(为不超过10的奇数)。
输出格式:
输出空心字符菱形。
输入样例:
B5
输出样例:
B
CC
DD
CC
B
(1)编程思路。
程序写成两个嵌套的二重循环,第一个二重循环用于输出菱形图案的上半部分,其中外循环(设循环变量为i)控制输出的行数(1~(n+1)/2),内循环控制每行(第i行)的输出,可看成依次输出4个部分的内容,先用一个一重循环输出(n+1)/2-i个空格;再输出一个字母(该字母为给定的起始字母+i-1);之后再用一个一重循环输出2*i-3个空格,接着输出一个字母(第1行不会输出-1个空格,也不输出后面的一个字母)。
第二个二重循环用于输出菱形图案的下半部,由于和上半部分对称,将第一个二重循环的外循环变量i的取值适当变化即可。
(2)源程序。
#include
intmain()
{
charch;
intn,i,j,k;
scanf("%c%d",&ch,&n);
for(i=1;i<=(n+1)/2;i++)
{
for(j=1;j<=(n+1)/2-i;j++)
printf("");
printf("%c",ch+i-1);
for(k=1;k<=2*i-3;k++)
printf("");
if(i!
=1)printf("%c",ch+i-1);
printf("\n");
}
for(i=n/2;i>=1;i--)
{
for(j=1;j<=(n+1)/2-i;j++)
printf("");
printf("%c",ch+i-1);
for(k=1;k<=2*i-3;k++)
printf("");
if(i!
=1)printf("%c",ch+i-1);
printf("\n");
}
return(0);
}
13.统计素数并求和
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
1031
输出样例:
7143
(1)编程思路。
判断一个数m是否为素数的方法是:
用2~sqrt(m)中的每一个整数i去除m,若某一个i能整除m,则m不是素数;否则,m是素数。
该操作可以写成一个循环,如下:
for(i=2;i<=sqrt(1.0*m);i++)
if(m%i==0)break;
循环执行后,若i>sqrt(1.0*m),则m是素数,因为这种情况下,循环中的break语句没有被执行,即2~sqrt(m)中的每一个整数i都不能整除m。
求m~n之间的所有素数,写成一个循环,在循环中嵌套一个循环判断每个整数i是否为素数,若是,则计数并累加求和。
(2)源程序。
#include
#include
intmain()
{
intm,n;
intcnt=0,sum=0;
inti,j;
scanf("%d%d",&m,&n);
if(m==1)m++;
for(i=m;i<=n;i++)
{
intt=(int)sqrt(1.0*i);
for(j=2;j<=t;j++)
if(i%j==0)break;
if(j>t)
{
cnt++;
sum+=i;
}
}
printf("%d%d\n",cnt,sum);
return0;
}
14.约分最简分式
分数可以表示为分子/分母的形式。
编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。
最简分式是指分子和分母不具有可以约分的成分了。
如6/12可以被约分为1/2。
当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:
12/34表示34分之12。
分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:
在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
输出格式:
在一行中输出这个分数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编程 实验 循环 结构
![提示](https://static.bingdoc.com/images/bang_tan.gif)