C语言课后习题-循环
- 分数序列:2/1,3/2, 5/3, 8/5, 13/8…求前20项的和。
虽然麻烦了点,但是很好理解,嘻嘻!!
先为s[20]和a[20]分别赋值后,进行两个数组相除。
#include <stdio.h>
void main()
{
int i;
float sum=0;
float s[20],a[20];
s[0]=2;
s[1]=3;
a[0]=1;
a[1]=2;
for(i=2;i<20;i++)
{
s[i]=s[i-1]+s[i-2];
}
for(i=2;i<20;i++)
{
a[i]=a[i-1]+a[i-2];
}
for(i=0;i<20;i++)
{
sum=sum+s[i]/a[i];
}
printf("%f\n",sum);
}
2、一个球从100米高度自由落下,每次落地后反跳回原高度一半,在落下,在反弹,求他在第十次的时候经过多少米,反弹有多高?
思路:
①确定高度的计算,列出公式
②上升和下降的值相同,但后面别忘了加上100.
③记住求带有小数的值的时候,别忘了用float,而不用int 后面记得输出时用f别用d。
#include <stdio.h>
void main()
{
float sum=0;
float h[10];
int i;
h[0]=100;
for(i=1;i<10;i++)
{
h[i]=h[i-1]/2;
sum=sum+2*h[i];
}
printf("the height is %f\n",h[9]);
printf("the sum is %f\n",sum+100);
}
3、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。到第十天的时候,就只剩下一个桃子了,求第一天一共摘了多少个桃子。
思路:掌握好逻辑表达式,和已知条件。
#include <stdio.h>
void main()
{
int a[10],i;
a[0]=1;
for(i=1;i<10;i++)
{
a[i]=a[i-1]*2+1;
}
printf("peach is %d\n",a[9]);
}
4、用迭代法求x=根号a。求平方根的迭代公式为:
x(n+1)=1/2*(x(n)+a/x(n)).()里面的n和n+1为下标哦。
要求前后两次求出的x的差的绝对值小于10的-5次方。
#include <stdio.h>
#include <math.h>
void main()
{
float x0,a,x1;
printf("enter a number:");
scanf("%f",&a);
x0=a/2;
x1=(x0+a/x0)/2;
while(fabs(x1-x0)>=1e-5)
{
x0=x1;
x1=(x0+a/x0)/2;
}
printf("the square root of %5.2f is %5.2f\n",a,x1);
}
5、用牛顿迭代法求下面方程在1.5附近的根:
2xxx-4xx+3x-6=0
#include <stdio.h>
#include <math.h>
void main()
{
float x1,x0=1.5;
x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);
while(fabs(x1-x0>=1e-6))
{
x0=x1;
x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);
}
printf("方程的根为%f\n",x1);
}
6、用二分法求下面方程在(-10,10)之间的根:
2xxx-4xx+3x-6=0`
#include<stdio.h>
#include<string.h>
#include<math.h>
void main(){
double low=-10,high=10,mid;
double temp=10;
while(fabs(temp)>1e-5)
{
mid=(low+high)/2;//二分法
temp=((2*mid-4)*mid+3)*mid-6;
printf("%lf ",mid);
printf("%lf\n",temp);
if(temp>0)
high=mid;
else if(temp<0)
low=mid;
}
printf("%lf",mid);
}
6:两个乒乓球队进行比赛,各出3人。甲队为A、B、C三人,乙队为X、Y、Z3人。以抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程找出3对对手名单。
思路:首先可以看出XYZ为连续的,想到循环,其次,由于C的条件最多,所以先由C判断,判断A,后为B。并且不要忘了判断ABC的关系。
#include <stdio.h>
#include <stdlib.h>
void main()
{
char A;
char B;
char C;
char str;
for(str='X';str<='Z';str++)
{
if(str!='X'&&str!='Z')
{
C=str;
}
}
for(str='X';str<='Z';str++)
{
if(str!='X'&&str!=C)
A=str;
}
for(str='X';str<='Z';str++)
{
if(str!=A&&str!=C)
B=str;
}
printf("A-%c\nB-%c\nC-%c\n",A,B,C);
}
7、输出用星号表示的菱形。
先对上半部分进行遍历,后反过来为下半部分进行遍历。
掌握算法:当一行确定的情况下,对所有的列进行循环。
j>=(column+1)/2-(i-1) (column+1)/2-(i-1)为第i行最左边的星号
j<=(column+1)/2+(i-1) (column+1)/2+(i-1)为第i行最右边的星号(上半部分)
j>=(column+1)/2-(line-i) (column+1)/2-(line-i)为第i行最左边的星号
j<=(column+1)/2+(line-i) (column+1)/2+(line-i)为第i行最右边的星号(下半部分)
#include <stdio.h>
#include <stdlib.h>
int main(){
int line; // 菱形总行数
int column; // 菱形总列数
int i; // 当前行
int j; // 当前列
printf("请输入菱形的行数(奇数):");//因为对称还需要一个中间不变的所以一定为偶数
scanf("%d", &line);
if(line%2==0){
// 判断是否是奇数
printf("必须输入奇数!\n");
exit(1);//异常退出,exit(0)是正常退出。
}
column = line; // 总行数和总列数相同
for(i=1; i<=line; i++){
// 遍历所有行
if(i<(line+1)/2+1){
// 上半部分(包括中间一行)
for(j=1; j<=column; j++){
// 遍历上半部分的所有列
if( (column+1)/2-(i-1)<=j && j<=(column+1)/2+(i-1) ){
printf("*");
}else{
printf(" ");
}
}
}
else{
// 下半部分
for(j=1; j<=column; j++){
// 遍历下半部分的所有列
if( (column+1)/2-(line-i)<=j && j<=(column+1)/2+(line-i) ){
printf("*");
}else{
printf(" ");
}
}
}
printf("\n");
}
return 0;
}