C语言编程经典100例——21至30例

目录

第 21 例

第 22 例

第 23 例

第 24 例

第 25 例

第 26 例

第 27 例

第 28 例

第 29 例

第 30 例


第 21 例

程序源码:

/*
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少桃子。

程序分析:采取逆向思维的方法,从后往前推断。

1) 设x1为前一天桃子数,设x2为第二天桃子数, 则:

x2=x1/2-1, x1=(x2+1)*2

x3=x2/2-1, x2=(x3+1)*2

以此类推: x前=(x后+1)*2

2) 从第10天可以类推到第1天,是一个循环过程。
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int day, x1 = 0, x2;
    day=9;
    x2=1;
    while(day>0)
	{
        x1=(x2+1)*2;  // 第一天的桃子数是第2天桃子数加1后的2倍
        x2=x1;
        day--;
    }
    printf("第一天共摘了 %d 个桃子。\n",x1);
	printf ("\n");

    return 0;
}

程序运行结果:

第 22 例

程序源码:

/*
题目:两个乒乓球队进行比赛,各出三人。
甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单,有人向队员打听比赛的名单。
a说他不和x比,c说他不和x,z比,请编程序找出三对赛手的名单。

程序分析:详见下面的代码。
*/

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    char i,j,k;
    for(i='x';i<='z';i++)
	{
        for(j='x';j<='z';j++)
		{
            if(i!=j)
			{
                for(k='x';k<='z';k++)
				{
                    if(i!=k&&j!=k)
					{
                        if(i!='x'&&k!='x'&&k!='z')
						{
                            printf("三对赛手的名单为:\na--%c\nb--%c\nc--%c\n",i,j,k);
                        }
                    }
                }
            }
        }
    }

    return 0;
}

程序运行结果:

第 23 例

程序源码:

/*
题目:打印出如下图案(菱形)。

   *
  ***
 *****
*******
 *****
  ***
   *

程序分析:先把图形分成两部分来看待,前四行一个规律,
后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
*/

#include <stdio.h>

int main()
{
    int i,j,k;
    for(i=0;i<=3;i++)
	{
        for(j=0;j<=2-i;j++)
		{
            printf(" ");
        }
        for(k=0;k<=2*i;k++)
		{
            printf("*");
        }
        printf("\n");
    }
    for(i=0;i<=2;i++)
	{
        for(j=0;j<=i;j++)
		{
            printf(" ");
        }
        for(k=0;k<=4-2*i;k++)
		{
            printf("*");
        }
        printf("\n");
    }

	return 0;
}

程序运行结果:

第 24 例

程序源码:

/*
题目:有一个分数数列如下,2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

程序分析:重点是抓住分子与分母的变化规律。
*/

#include <stdio.h>
 
int main()
{
    int i,t;
    float sum=0;
    float a=2,b=1;
    for(i=1;i<=20;i++)
    {
        sum=sum+a/b;
        t=a;
        a=a+b;
        b=t;
    }
    printf("这个数列的前20项之和等于 %9.6f\n",sum);

	return 0;
}

程序运行结果:

第 25 例

程序源码:

/*
题目:求1!+2!+3!+...+20!的值。

程序分析:此程序只是把累加变成了累乘。
*/

#include <stdio.h>
 
int main()
{
    int i;
    long double sum,mix;
    sum=0,mix=1;
    for(i=1;i<=20;i++)
    {
        mix=mix*i;
        sum=sum+mix;
    }  
    printf("1!+2!+3!+...+20! = %lf\n",sum);

	return 0;
}

程序运行结果:

第 26 例

程序源码:

/*
题目:利用递归方法求5!。

程序分析:递归公式:f(n)=f(n-1)*n
*/

#include <stdio.h>
 
int main()
{
    int i;
    int fact(int);
    for(i=0;i<6;i++)
	{
        printf("%d! = %d\n",i,fact(i));
    }

	return 0;
}

int fact(int j)
{
    int sum;
    if(j==0)
	{
        sum=1;
    }
	else
	{
        sum=j*fact(j-1);
    }

    return sum;
}

程序运行结果:

第 27 例

程序源码:

/*
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

程序分析:详见下面的代码。
*/

#include <stdio.h>
 
int main()
{
    int i=5;
    void palin(int n);
    printf("请输入5个字符:");
    palin(i);
    printf("\n");

	return 0;
}

void palin(int n)
{
    char next;
    if(n<=1)
	{
        next=getchar();
        printf("相反顺序输出结果是:");
        putchar(next);
    }
	else
	{
        next=getchar();
        palin(n-1);
        putchar(next);
    }
}

程序运行结果:

第 28 例

程序源码:

/*
题目:编写一个程序计算两个矩阵的叉乘,并输出结果。

程序分析:详见下面的代码。
*/

#include <stdio.h>

#define N 3
#define M 4

int main ()
{
	int a[N][M],b[M][N];    //定义二维整型数组a和b。
	int i,j,k,s;

	printf ("请输入二维整型数组a的12个元素:\n");
	//利用双重循环通过键盘给二维整型数组a赋值。
	for (i=0;i<N;i++)
	{
		for (j=0;j<M;j++)
		{
			printf ("a[%d][%d]=",i,j);
			scanf ("%d",&a[i][j]);
		}
	}

	printf ("\n请输入二维整型数组b的12个元素:\n");
	//利用双重循环通过键盘给二维整型数组a赋值。
	for (i=0;i<M;i++)
	{
		for (j=0;j<N;j++)
		{
			printf ("b[%d][%d]=",i,j);
			scanf ("%d",&b[i][j]);
		}
	}

	//输出二维整型数组a。
	printf ("\n二维整型数组a:\n");
	for (i=0;i<N;i++)
	{
		for (j=0;j<M;j++)
		{
			printf ("%-5d",a[i][j]);
		}
		printf ("\n");
	}

	//输出二维整型数组b。
	printf ("\n二维整型数组b:\n");
	for (i=0;i<M;i++)
	{
		for (j=0;j<N;j++)
		{
			printf ("%-5d",b[i][j]);
		}
		printf ("\n");
	}

	//计算 s = a×b 的值,并输出 s 的值。
	printf ("\n“二维整型数组a×二维整型数组b”的结果是:\n");
	for (i=0;i<N;i++)
	{
		for (j=0;j<N;j++)
		{
			for (k=s=0;k<M;k++)
			{
				s+=a[i][k]*b[k][j];
			}
			printf ("%-10d",s);
		}
		printf ("\n");
	}
	printf ("\n");

	return 0;
}

程序运行结果:

第 29 例

程序源码:

/*
题目:给一个不多于5位的正整数,求它是几位数,并逆序打印出各位数字。

程序分析:分解出每一位数,详见下面的代码。
*/

#include <stdio.h>
 
int main( )
{
    long a,b,c,d,e,x;
    printf("请输入一个不多于 5 位的正整数:");
    scanf("%ld",&x);
    a=x/10000;        //分解出万位
    b=x%10000/1000;   //分解出千位
    c=x%1000/100;     //分解出百位
    d=x%100/10;       //分解出十位
    e=x%10;           //分解出个位
    if (a!=0)
	{
		printf("该数字为 5 位数,逆序输出为:%ld%ld%ld%ld%ld\n",e,d,c,b,a);
    }
	else if(b!=0)
	{
		printf("该数字为 4 位数,逆序输出为:%ld%ld%ld%ld\n",e,d,c,b);
    } 
	else if(c!=0)
	{
		printf("该数字为 3 位数,逆序输出为:%ld%ld%ld\n",e,d,c);
    } 
	else if(d!=0)
	{
		printf("该数字为 2 位数,逆序输出为:%ld%ld\n",e,d);
    } 
	else if(e!=0)
	{
		printf("该数字为 1 位数,逆序输出为:%ld\n",e);
    }

	return 0;
}

程序运行结果:

第 30 例

程序源码:

/*
题目:输入一个5位数,判断它是不是回文数。个位与万位相同,
十位与千位相同的5位数是回文数,比如12321是回文数。

程序分析:分解出每一位数,详见下面的代码。
*/

#include <stdio.h>
 
int main( )
{
    long ge,shi,qian,wan,x;
    printf("请输入一个 5 位数:");
    scanf("%ld",&x);
    wan=x/10000;        //分解出万位
    qian=x%10000/1000;  //分解出千位
    shi=x%100/10;       //分解出十位
    ge=x%10;            //分解出个位
    
	if (ge==wan&&shi==qian)
	{ 
		//个位等于万位并且十位等于千位
        printf("%d 是回文数!\n",x);
    }
	else
	{
        printf("%d 不是回文数!\n",x);
    }

	return 0;
}

程序运行结果:

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现卫星环绕地球的动画效果,可以使用OpenGL图形库来绘制图形和动画。下面是一个简单的C语言程序,可以实现卫星绕地球的动画效果: ```c #include <GL/glut.h> #define PI 3.1415926 GLfloat angle = 0.0f; // 卫星角度 GLfloat r = 10.0f; // 卫星距离地球表面的距离 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // 绘制地球 glColor3f(0.0f, 0.0f, 1.0f); glutWireSphere(5.0f, 20, 20); // 绘制卫星 glColor3f(1.0f, 0.0f, 0.0f); glTranslatef(0.0f, 0.0f, -r); glRotatef(angle, 0.0f, 1.0f, 0.0f); glTranslatef(0.0f, 0.0f, 5.0f); glutWireSphere(0.5f, 8, 8); glutSwapBuffers(); } void update(int value) { angle += 1.0f; if (angle > 360.0f) { angle -= 360.0f; } glutPostRedisplay(); glutTimerFunc(25, update, 0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(640, 480); glutCreateWindow("Satellite Orbiting Earth"); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); glutDisplayFunc(display); glutTimerFunc(25, update, 0); glutMainLoop(); return 0; } ``` 程序中使用了OpenGL的三维图形绘制和动画技术。首先通过glutWireSphere函数绘制了地球,然后通过glTranslatef和glRotatef函数设置卫星的位置和旋转角度,最后再用glutWireSphere函数绘制卫星。 update函数控制卫星的旋转,通过glutTimerFunc函数定时更新卫星的位置和角度,并调用glutPostRedisplay函数来重绘窗口。主函数中注册了display和timer函数,并调用glutMainLoop函数启动程序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值