C语言:菜鸟教程经典100例题(51-80)

C语言经典100例
注:以下答案与原文不完全相同

实例1-50

实例51 - 与&

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include <stdio.h>
int main()
{
	int a, b;
	a = 077;
	b = a & 3;
	printf("a & b(decimal) 为 %d \n", b);
	b &= 7;
	printf("a & b(decimal) 为 %d \n", b);

	return 0;
}

//a & b(decimal) 为 3 
//a & b(decimal) 为 3

实例52 - 或

学习使用按位或 |。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include<stdio.h>
int main()
{
	int a, b;
	a = 077;
	b = a | 3;
	printf("b 的值为 %d \n", b);
	b |= 7;
	printf("b 的值为 %d \n", b);

	return 0;
}

//b 的值为 63
//b 的值为 63

实例53 - 异或^

学习使用按位异或 ^。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

//0^0=0; 0^1=1; 1^0=1; 1^1=0 。

#include <stdio.h>
int main()
{
    int a,b;
    a=077;
    b=a^3;
    printf("b 的值为 %d \n",b);
    b^=7;
    printf("b 的值为 %d \n",b);
    return 0;
}

//b 的值为 60 
//b 的值为 59

实例54

取一个整数 a 从右端开始的 4~7 位。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//
 
#include <stdio.h>
int main()
{
    unsigned a,b,c,d;
    printf("请输入整数:\n");
    scanf("%o",&a);
    b=a>>4;
    c=~(~0<<4);
    d=b&c;
    printf("%o\n%o\n",a,d);
    return 0;
}

//36
//36
//1

实例55 - ~

学习使用按位取反~。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include <stdio.h>
int main()
{
    int a,b;
    a=234;
    b=~a;
    printf("a 的按位取反值为(十进制) %d \n",b);
    a=~a;
    printf("a 的按位取反值为(十六进制) %x \n",a);
    return 0;
}

/*
请输入整数:
a 的按位取反值为(十进制) -235 
a 的按位取反值为(十六进制) ffffff15 
*/

实例56

画图,学用circle画圆形。

#include <graphics.h> 
//VC6.0中是不能运行的,要在Turbo2.0/3.0中  

int main()   
{  
    int driver,mode,i;   
    float j=1,k=1;   
    driver=VGA;  
    mode=VGAHI;   
    initgraph(&driver,&mode,"");   
    setbkcolor(YELLOW);   
    for(i=0;i<=25;i++)   
    {   
        setcolor(8);   
        circle(310,250,k);   
        k=k+j;   
    j=j+0.3;   
    }   
    return 0;  
}

实例57

画图,学用line画直线(在TC中实现)。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include "graphics.h"
int main()
{
    int driver,mode,i;
    float x0,y0,y1,x1;
    float j=12,k;
    driver=VGA;mode=VGAHI;
    initgraph(&driver,&mode,"");
    setbkcolor(GREEN);
    x0=263;y0=263;y1=275;x1=275;
    for(i=0;i<=18;i++)
    {
        setcolor(5);
        line(x0,y0,x0,y1);
        x0=x0-5;
        y0=y0-5;   
        x1=x1+5;   
        y1=y1+5;   
        j=j+10;
    }
}

实例58

学用rectangle画方形。(在TC中实现)。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include "graphics.h"
int main()
{
    int x0,y0,y1,x1,driver,mode,i;
    driver=VGA;mode=VGAHI;
    initgraph(&driver,&mode,"");
    setbkcolor(YELLOW);
    x0=263;y0=263;y1=275;x1=275;
    for(i=0;i<=18;i++)
    {
        setcolor(1);
        rectangle(x0,y0,x1,y1);
        x0=x0-5;
        y0=y0-5;
        x1=x1+5;
        y1=y1+5;
    }
    settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
    outtextxy(150,40,"How beautiful it is!");
    line(130,60,480,60);
    setcolor(2);
    circle(269,269,137);
}

实例59

画图,综合例子。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

# define PAI 3.1415926
# define B 0.809
# include "graphics.h"
#include "math.h"
int main()
{
    int i,j,k,x0,y0,x,y,driver,mode;
    float a;
    driver=CGA;mode=CGAC0;
    initgraph(&driver,&mode,"");
    setcolor(3);
    setbkcolor(GREEN);
    x0=150;y0=100;
    circle(x0,y0,10);
    circle(x0,y0,20);
    circle(x0,y0,50);
    for(i=0;i<16;i++)
    {
        a=(2*PAI/16)*i;
        x=ceil(x0+48*cos(a));
        y=ceil(y0+48*sin(a)*B);
        setcolor(2); line(x0,y0,x,y);
    }
    setcolor(3);circle(x0,y0,60);
    /* Make 0 time normal size letters */
    settextstyle(DEFAULT_FONT,HORIZ_DIR,0);
    outtextxy(10,170,"press a key");
    getch();
    setfillstyle(HATCH_FILL,YELLOW);
    floodfill(202,100,WHITE);
    getch();
    for(k=0;k<=500;k++)
    {
        setcolor(3);
        for(i=0;i<=16;i++)
        {
            a=(2*PAI/16)*i+(2*PAI/180)*k;
            x=ceil(x0+48*cos(a));
            y=ceil(y0+48+sin(a)*B);
            setcolor(2); line(x0,y0,x,y);
        }
        for(j=1;j<=50;j++)
        {
            a=(2*PAI/16)*i+(2*PAI/180)*k-1;
            x=ceil(x0+48*cos(a));
            y=ceil(y0+48*sin(a)*B);
            line(x0,y0,x,y);
        }
    }
    restorecrtmode();
}

实例60

画图,综合例子2。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include "graphics.h"
#define LEFT 0
#define TOP 0
#define RIGHT 639
#define BOTTOM 479
#define LINES 400
#define MAXCOLOR 15
int main()
{
    int driver,mode,error;
    int x1,y1;
    int x2,y2;
    int dx1,dy1,dx2,dy2,i=1;
    int count=0;
    int color=0;
    driver=VGA;
    mode=VGAHI;
    initgraph(&driver,&mode,"");
    x1=x2=y1=y2=10;
    dx1=dy1=2;
    dx2=dy2=3;
    while(!kbhit())
    {
        line(x1,y1,x2,y2);
        x1+=dx1;y1+=dy1;
        x2+=dx2;y2+dy2;
        if(x1<=LEFT||x1>=RIGHT)
            dx1=-dx1;
        if(y1<=TOP||y1>=BOTTOM)
            dy1=-dy1;
        if(x2<=LEFT||x2>=RIGHT)
            dx2=-dx2;
        if(y2<=TOP||y2>=BOTTOM)
                dy2=-dy2;
        if(++count>LINES)
        {
            setcolor(color);
            color=(color>=MAXCOLOR)?0:++color;
        }
    }
    closegraph();
}

实例61 - 杨辉三角形

打印出杨辉三角形(要求打印出10行)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

#include <stdio.h>

int main()
{
	int i, j;
	int a[10][10];

	printf("\n");

	for (i = 0; i < 10; i++) 
	{
		a[i][0] = 1;
		a[i][i] = 1;
	}

	for (i = 2; i < 10; i++)
		for (j = 1; j < i; j++)
			a[i][j] = a[i - 1][j - 1] + a[i - 1][j];

	for (i = 0; i < 10; i++) 
	{
		for (j = 0; j <= i; j++)
			printf("%5d", a[i][j]);
		printf("\n");
	}

	return 0;
}

/*

	1
	1    1
	1    2    1
	1    3    3    1
	1    4    6    4    1
	1    5   10   10    5    1
	1    6   15   20   15    6    1
	1    7   21   35   35   21    7    1
	1    8   28   56   70   56   28    8    1
	1    9   36   84  126  126   84   36    9    1
*/

实例62

学习putpixel画点,(在TC中实现)。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include "stdio.h"
#include "graphics.h"
int main()
{
    int i,j,driver=VGA,mode=VGAHI;
    initgraph(&driver,&mode,"");
    setbkcolor(YELLOW);
    for(i=50;i<=230;i+=20)
        for(j=50;j<=230;j++)
            putpixel(i,j,1);
    for(j=50;j<=230;j+=20)
        for(i=50;i<=230;i++)
            putpixel(i,j,1);
}

实例63

画椭圆ellipse(在TC中实现)。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include "stdio.h"
#include "graphics.h"
#include "conio.h"
int main()
{
    int x=360,y=160,driver=VGA,mode=VGAHI;
    int num=20,i;
    int top,bottom;
    initgraph(&driver,&mode,"");
    top=y-30;
    bottom=y-30;
    for(i=0;i<num;i++)
    {
        ellipse(250,250,0,360,top,bottom);
        top-=5;
        bottom+=5;
    }
    getch();
}

实例64

利用ellipse and rectangle 画图(在TC中实现)。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include "stdio.h"
#include "graphics.h"
#include "conio.h"
main()
{
    int driver=VGA,mode=VGAHI;
    int i,num=15,top=50;
    int left=20,right=50;
    initgraph(&driver,&mode,"");
    for(i=0;i<num;i++)
    {
        ellipse(250,250,0,360,right,left);
        ellipse(250,250,0,360,20,top);
        rectangle(20-2*i,20-2*i,10*(i+2),10*(i+2));
        right+=5;
        left+=5;
        top+=10;
    }
    getch();
}

实例65

一个最优美的图案(在TC中实现)。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//
 
#include "graphics.h"
#include "math.h"
#include "dos.h"
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
#include "stdarg.h"
#define MAXPTS 15
#define PI 3.1415926
struct PTS {
    int x,y;
};
double AspectRatio=0.85;
void LineToDemo(void)
{
    struct viewporttype vp;
    struct PTS points[MAXPTS];
    int i, j, h, w, xcenter, ycenter;
    int radius, angle, step;
    double rads;
    printf(" MoveTo / LineTo Demonstration" );
    getviewsettings( &vp );
    h = vp.bottom - vp.top;
    w = vp.right - vp.left;
    xcenter = w / 2; /* Determine the center of circle */
    ycenter = h / 2;
    radius = (h - 30) / (AspectRatio * 2);
    step = 360 / MAXPTS; /* Determine # of increments */
    angle = 0; /* Begin at zero degrees */
    for( i=0 ; i<MAXPTS ; ++i ){ /* Determine circle intercepts */
        rads = (double)angle * PI / 180.0; /* Convert angle to radians */
        points[i].x = xcenter + (int)( cos(rads) * radius );
        points[i].y = ycenter - (int)( sin(rads) * radius * AspectRatio );
        angle += step; /* Move to next increment */
    }
    circle( xcenter, ycenter, radius ); /* Draw bounding circle */
    for( i=0 ; i<MAXPTS ; ++i ){ /* Draw the cords to the circle */
        for( j=i ; j<MAXPTS ; ++j ){ /* For each remaining intersect */
            moveto(points[i].x, points[i].y); /* Move to beginning of cord */
            lineto(points[j].x, points[j].y); /* Draw the cord */
        }
    }
}
int main()
{
    int driver,mode;
    driver=CGA;mode=CGAC0;
    initgraph(&driver,&mode,"");
    setcolor(3);
    setbkcolor(GREEN);
    LineToDemo();
}

实例66

输入3个数a,b,c,按大小顺序输出。

#include <stdio.h>

int main()
{
	int a, b, c;
	int t;

	printf("Please enter 3 numbers:\n");
	scanf("%d %d %d", &a, &b, &c);

	if (a > b)
	{
		if (b > c)
			printf("%d > %d > %d\n", a, b, c);
		else
		{
			if(a > c)
				printf("%d > %d > %d\n", a, c, b);
			else
				printf("%d > %d > %d\n", c, a, b);
		}
	}
	else
	{
		if (b < c)
			printf("%d > %d > %d\n", c, b, a);
		else
		{
			if (a > c)
				printf("%d > %d > %d\n", b, a, c);
			else
				printf("%d > %d > %d\n", b, c, a);
		}
	}

	return 0;
}

/*
Please enter 3 numbers:
3 6 2
6 > 3 > 2
*/
#include <stdio.h>

void swap(int *s1, int *s2)
{
	int t;

	t = *s1;
	*s1 = *s2;
	*s2 = t;
}

int main()
{
	int a, b, c;
	int *p1, *p2, *p3;

	printf("Please enter 3 numbers:\n");
	scanf("%d %d %d", &a, &b, &c);

	p1 = &a;
	p2 = &b;
	p3 = &c;

	if (a > b)
		swap(p1, p2);
	if (a > c)
		swap(p1, p3);
	if (b > c)
		swap(p2, p3);

	printf("%d %d %d\n", a, b, c);

	return 0;
}

/*
Please enter 3 numbers:
3 6 2
2 3 6
*/

实例67

输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

#include <stdio.h>

int main()
{
	int num[10];
	int m, n;
	int t;

	printf("Please enter 10 numbers:\n");
	scanf("%d %d %d %d %d %d %d %d %d %d", &num[0], &num[1], &num[2], &num[3], &num[4], &num[5], &num[6], &num[7], &num[8], &num[9]);

	for (int i = 0; i < 10; i++)
	{
		m = 0;
		for (int j = 0; j < 10; j++)
		{
			if (num[i] < num[j])
				break;
			else
				m++;
		}
		if (m == 10)
		{
			t = num[0];
			num[0] = num[i];
			num[i] = t;
		}
	}

	for (int i = 0; i < 10; i++)
	{
		n = 0;
		for (int j = 0; j < 10; j++)
		{
			if (num[i] > num[j])
				break;
			else
				n++;
		}
		if (n == 10)
		{
			t = num[9];
			num[9] = num[i];
			num[i] = t;
		}
	}

	printf("%d %d %d %d %d %d %d %d %d %d\n", num[0], num[1], num[2], num[3], num[4], num[5], num[6], num[7], num[8], num[9]);

	return 0;
}

/*
Please enter 10 numbers:
3 8 7 9 12 4 6 1 5 10
12 8 7 9 3 4 6 10 5 1
*/

实例68

有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。

#include <stdio.h>

int main()
{
	int num[32];
	int move[32];
	int m, n;

	printf("How many numbers?\n");
	scanf("%d", &n);

	printf("Please enter %d numbers:\n",n);
	for (int i = 0; i < n; i++)
		scanf("%d", &num[i]);
	
	printf("How many positions do you want to move?\n");
	scanf("%d", &m);

	

	for (int i = 0; i < n - m; i++)
		move[i + 3] = num[i];

	for (int i = n - m; i < n; i++)
		move[i - (n - m)] = num[i];


	//打印你输入的数组
	printf("before:\n");
	for (int i = 0; i < n; i++)
		printf("%3d ", num[i]);
	printf("\n");

	//打印滚动后的数组
	printf("after:\n");
	for (int i = 0; i < n; i++)
		printf("%3d ", move[i]);
	printf("\n");

	return 0;
}

/*
How many numbers?
10
Please enter 10 numbers:
0
1
2
3
4
5
6
7
8
9
How many positions do you want to move?
3
before:
  0   1   2   3   4   5   6   7   8   9
after:
  7   8   9   0   1   2   3   4   5   6
*/

实例69

有n个人围成一圈,顺序排号。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

参考

#include <stdio.h>

int main()
{
	int a[50];
	int n, count;
	int flag = 0;

	printf("How many people?\n");
	scanf("%d", &n);
	count = n;

	for (int i = 1; i <= n; i++)
		a[i] = 1;//所有人都在圈内,为1 

	for (int i = 1; ; i++) 
	{
		//如果i超出了n个人,表示已经循环一圈,重回到第1个人 
		if (i == n + 1)
			i = 1;

		if (a[i] != 0)	
			flag++;
		else	
			continue;

		if (flag % 3 == 0)
		{
			a[i] = 0;
			count--;
		}

		if (count == 1)//表示只剩下一个人在圈内 
			break;
	}

	for (int i = 1; i <= n; i++)
		if (a[i] != 0)
			printf("The last people is %d", i);

	return 0;
}


/*
How many people?
8
The last people is 7
*/
//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//
 
#include <stdio.h>
void main()
{
    int num[50],n,*p,j,loop,i,m,k;
    printf("请输入这一圈人的数量:\n");
    scanf("%d",&n);
    p=num;
    //开始给这些人编号
    for (j=0;j<n;j++)
    {
        *(p+j)=j+1;
    }
    i=0;//i用于计数,即让指针后移
    m=0;//m记录退出圈子的人数
    k=0;//k报数1,2,3
    while(m<n-1)//当退出的人数不大于总人数时,即留下的人数至少是一个人
        //这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
        //这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
    {
        if (*(p+i)!=0)//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
        {
            k++;
        }
        if (k==3)
        {    k=0;    //报数清零,即下一个人从1开始报数
            *(p+i)=0;//将报数为3的人编号重置为0
            m++;    //退出人数加1
        }
        i++;      //指针后移
        if (i==n)//这句很关键,如果到了队尾,就要使指针重新指向对头
            //并且它只能放在i++后面,因为只有i++了才有可能i==n
        {
            i=0;
        }
        
        
    }
    printf("现在剩下的人是:");
    for (loop=0;loop<n;loop++)
    {
        if (num[loop]!=0)
        {
            printf("%2d号\n",num[loop]);
        }
    }
    
}

/*
请输入这一圈人的数量:
8
现在剩下的人是: 7号
*/

实例70

写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

#include <stdio.h>

int length(char *str)
{
	int l = 0;

	while (*str != '\0')
	{
		l++;
		str++;
	}
	
	//or
	/*
	for (int i = 0; i < 64; i++)
	{
		if (isprint(str[i]) || ispunct(str[i]))
			l++;
		else
			break;
	}
	*/

	return l;
}

int main()
{
	char str[64];

	printf("Please enter a string:\n");
	scanf("%s", str);

	int len;
	
	len = length(str);
	printf("length = %d\n", len);

	return 0;
}


/*
Please enter a string:
helloworld!
length = 11
*/

实例71

编写input()和output()函数输入,输出5个学生的数据记录。

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

void input();
void output();

typedef struct
{
	char name[20];
	char sex[5];
	int age;
}Stu;

int main()
{
	Stu student[5];

	printf("Please enter informations of 5 students: ");
	printf("(Name Sex Age)\n");
	input(student);

	printf("Informations:\n");
	output(student);

	system("pause");

	return 0;
}

void input(Stu *student)
{
	for (int i = 0; i < 5; i++)
		scanf("%s %s %d", student[i].name, &student[i].sex, &student[i].age);
}

void output(Stu *student)
{
	for (int i = 0; i < 5; i++)
		printf("%3s %3s %3d\n", student[i].name, student[i].sex, student[i].age);
}

/*
Please enter informations of 5 students: (Name Sex Age)
zzn m 20
hll m 19
yxj m 19
xzg m 20
yc m 22
Informations:
zzn   m  20
hll   m  19
yxj   m  19
xzg   m  20
 yc   m  22
*/

实例72-74:链表(暂未学习)

创建一个链表。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//
 
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct LNode
{
    int          data;
    struct LNode *next;
}LNode,*LinkList;
 
LinkList CreateList(int n);
void print(LinkList h);

int main()
{
    LinkList Head=NULL;
    int n;
    
    scanf("%d",&n);
    Head=CreateList(n);
    
    printf("刚刚建立的各个链表元素的值为:\n");
    print(Head);
    
    printf("\n\n");
    system("pause");
    return 0;
}
LinkList CreateList(int n)
{
    LinkList L,p,q;
    int i;
    L=(LNode*)malloc(sizeof(LNode));
    if(!L)return 0;
    L->next=NULL;
    q=L;
    for(i=1;i<=n;i++)
    {
        p=(LinkList)malloc(sizeof(LNode));
        printf("请输入第%d个元素的值:",i);
        scanf("%d",&(p->data));
        p->next=NULL;
        q->next=p;
        q=p;
    }
    return L;
}
void print(LinkList h)
{
    LinkList p=h->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
}

实例75

输入一个整数,并将其反转后输出。

#include <stdio.h>

int main()
{
	int num;
	int reverse = 0;
	int t;

	printf("Integer: ");
	scanf("%d", &num);

	while (num != 0)
	{
		t = num % 10;
		reverse = reverse * 10 + t;
		num = num / 10;
	}

	printf("reverse = %d\n", reverse);

	return 0;
}

/*
Integer: 12345
reverse = 54321
*/

实例76

编写一个函数,
输入n为偶数时,调用函数求1/2+1/4+…+1/n,
当输入n为奇数时,调用函数1/1+1/3+…+1/n(利用指针函数)。

#include <stdio.h>

double even(int n);
double odd(int n);

int main()
{
	int n;
	double sum;
	double(*pfunc)(int);

	printf("Integer: ");
	scanf("%d", &n);

	if (n % 2 == 0)
		pfunc = even;
	else
		pfunc = odd;

	sum = (*pfunc)(n);
	printf("sum = %lf\n", sum);

	return 0;
}

double even(int n)
{
	double s = 0;
	double a = 0;

	for (int i = 2; i <= n; i = i + 2)
	{
		a = (double)1 / i;
		s = s + a;
	}

	return s;
}

double odd(int n)
{
	double s = 0;
	double a = 0;

	for (int i = 1; i <= n; i = i + 2)
	{
		a = (double)1 / i;
		s = s + a;
	}

	return s;
}

实例77

填空练习(指向指针的指针)。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//
 
#include<stdio.h>
#include<stdlib.h>

int main()
{
    const char *s[]={"man","woman","girl","boy","sister"};
    const char **q;
    int k;
    
    for(k=0;k<5;k++)
    {
        q=&s[k];       /*在这里填入内容*/
        printf("%s\n",*q);
    }
    
    return 0;
}

实例78

找到年龄最大的人,并输出。请找出程序中有什么问题。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//

#include<stdio.h>

struct man {
	char name[20];
	int  age;
}

person[3] = { "li",18,"wang",25,"sun",22 };

int main()
{
	struct man *q, *p;
	int i, m = 0;
	p = person;

	q = p->name;
	for (i = 0; i < 3; i++)
	{
		if (m < p->age)
		{
			m = p->age;
			q = p;
		}
		p++;
	}
	printf("%s %d\n", q->name, q->age);

	return 0;
}

实例79

字符串排序。

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
 
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
 
void swap(char*str1,char*str2);

int main()
{
    char str1[20],str2[20],str3[20];
    
    printf("请输入3个字符串,每个字符串以回车结束!:\n");
    
    fgets(str1, (sizeof str1 / sizeof str1[0]), stdin);
    fgets(str2, (sizeof str2 / sizeof str2[0]), stdin);
    fgets(str3, (sizeof str3 / sizeof str3[0]), stdin);
    
    if(strcmp(str1,str2)>0)
    	swap(str1,str2);
    if(strcmp(str2,str3)>0)
    	swap(str2,str3);
    if(strcmp(str1,str2)>0)
    	swap(str1,str2);
    	
    printf("排序后的结果为:\n");
    printf("%s\n%s\n%s\n",str1,str2,str3);
    
    return 0;
}

void swap(char*str1,char*str2)
{
    char tem[20];
    
    strcpy(tem,str1);
    strcpy(str1,str2);
    strcpy(str2,tem);
}

实例80

海滩上有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,
第三、第四、第五只猴子都是这样做的,
问海滩上原来最少有多少个桃子?

#include<stdio.h>

int main()
{
	int x;
	int i = 0;
	int j = 1;

	while (i < 5) 
	{
		x = 4 * j;

		for (i = 0; i < 5; i++)
		{
			if (x % 4 != 0) 
			{ 
				break;
			}

			x = (x / 4) * 5 + 1;
		}
		j++;
	}
	printf("%d\n", x);

	return 0;
}
#include<stdio.h>
#include<stdlib.h>

int calc_peaches(int monkeys)
{
    //猴子总数
    int m = monkeys;
    //猴子每次待分桃子数
    int remain;
    int i = 1;
    
    while(1)
    {
        //最后一只猴子待分配的桃子数一定能被4整除
        remain = 4 * i;
        for (m=monkeys; m>0; m--)
        {
            // 每只猴子待分配的桃子数remain,满足(remain - 1) % 5 = 0
            if ((remain - 1) % 5 != 0) 
                break;
            // 除第一只猴子外,其他猴子待分配的桃子数remain,满足remain % 4 = 0
            if (m > 1 && remain % 4 != 0)
                break;
            // 不是第一只猴子时,计算出上一只猴子待分配的桃子数
            if (m > 1)
                remain = remain*5/4 + 1; 
            else
                break;
        }
        // 待分配的桃子已满足monkeys只猴子的分配要求
        if (m == 1)
            break;
        // 不满足时,则说明最后一只猴子待分配的桃子数不对,更换后再试
        else
            i++;
    }
    return remain;
}


int main(void)
{
    int monkeys;

    printf("请输入猴子的数量: ");
    scanf("%d", &monkeys);

    printf("桃子总数: %d\n", calc_peaches(monkeys));
}
#include <stdio.h>
#define True 1

int main()
{
    int monkeys = 5, remain_peach = 1, i, temp, k;
    for (i = 0; i < monkeys;) // i=0表示第5只猴子
    {
        int flag = 0; // flag=0表示没有间断
        while (True)
        {
            temp = remain_peach * 5 % 4;
            if (temp == 0)
            {
                if (i == 0) // 这里需要注意,只有在计算第五只猴子的时候需要保留现场
                    k = remain_peach;
                remain_peach = remain_peach * 5 / 4 + 1;
                if (i == 0 || (flag == 0 && i != 0)) // 如果当前计算的是第五只猴子,或者不是第五只但是没有间断,就计算前一只猴子
                {
                    i++;
                    break;
                }
            }
            else
            {
                flag = 1;
                if (i != 0) // 表示间断,且不是第五只猴子,那么就需要返回第五只猴子重新计算
                {
                    i = 0;
                    remain_peach = k + 1; // 防止死循环
                    break;
                }
                remain_peach++;
            }
        }
    }
    printf("最少有 %d 个桃子", remain_peach);
}
  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值