经典c程序100例详解

文章目录

前言

这是我在整理资料时发现的,网上虽然有,但大都不全,且代码有缺省。从csdn中c语言模块问答的问题来看,这里的很多问题都能映射过去。同时利用这次机会把笔记记录下来,温习一遍C语言,其实整个看下来也相当于把c语言的语法知识点也复习了一遍,笔记的话以后在手机上阅读思考也方便,不会的题也能查阅一下。
另外,部分代码我做了修改。

1.01^365 = 37.7834343329
0.99^365 = 0.0255179644523
积跬步以致千里,积怠堕以致深渊

以下代码测试均在vs2017上测试运行

001-010

001 无重复数字的三位数

题目:
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

程序分析:
可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

程序源代码:

#include <stdio.h>
int main()
{
	int i, j, k;
	printf("\n");
	for (i = 1; i < 5; i++) /*以下为三重循环*/
		for (j = 1; j < 5; j++)
			for (k = 1; k < 5; k++)
			{
				if (i != k && i != j && j != k) /*确保i、j、k三位互不相同*/
					printf("%d,%d,%d\n", i, j, k);
			}
	return 0;
}

002 发放奖金总数

题目:
企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

程序分析:
请利用数轴来分界,定位。注意定义时需把奖金定义成长浮点型。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	long int i;
	long double bonus1, bonus2, bonus4, bonus6, bonus10, bonus;
	scanf("%ld", &i);
	bonus1 = 100000 * 0.1; bonus2 = bonus1 + 100000 * 0.75;
	bonus4 = bonus2 + 200000 * 0.5;
	bonus6 = bonus4 + 200000 * 0.3;
	bonus10 = bonus6 + 400000 * 0.15;
	if (i <= 100000)
		bonus = i * 0.1;
	else if (i <= 200000)
		bonus = bonus1 + (i - 100000)*0.075;
	else if (i <= 400000)
		bonus = bonus2 + (i - 200000)*0.05;
	else if (i <= 600000)
		bonus = bonus4 + (i - 400000)*0.03;
	else if (i <= 1000000)
		bonus = bonus6 + (i - 600000)*0.015;
	else
		bonus = bonus10 + (i - 1000000)*0.01;
	printf("bonus=%lf", bonus);
	return 0;
}

003 100和68的完全平方数

题目:
一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

程序分析:
在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。

程序源代码:

#include <stdio.h>
#include <math.h>
int main()
{
	long int i;
	long double x, y;
	for (i = 1; i < 100000; i++)
	{
		x = sqrt(i + 100); /*x为加上100后开方后的结果*/
		y = sqrt(i + 268); /*y为再加上168后开方后的结果*/
		if (x*x == i + 100 && y*y == i + 268)
			/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
			printf("\n%ld\n", i);
	}
	return 0;
}

004 判断这一天是这一年的第几天

题目:
输入某年某月某日,判断这一天是这一年的第几天?

程序分析:
以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int day, month, year, sum, leap;
	printf("\nplease input year,month,day\n");
	scanf("%d,%d,%d", &year, &month, &day);
	switch (month)/*先计算某月以前月份的总天数*/
	{
		case 1:sum = 0; break;
		case 2:sum = 31; break;
		case 3:sum = 59; break;
		case 4:sum = 90; break;
		case 5:sum = 120; break;
		case 6:sum = 151; break;
		case 7:sum = 181; break;
		case 8:sum = 212; break;
		case 9:sum = 243; break;
		case 10:sum = 273; break;
		case 11:sum = 304; break;
		case 12:sum = 334; break;
		default:printf("data error"); return 0;
	}
	sum += day;/*再加上某天的天数*/

	if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))/*判断是不是闰年*/
		leap = 1;
	else
		leap = 0;
	if (leap == 1 && month > 2)/*如果是闰年且月份大于2,总天数应该加一天*/
		sum++;
	printf("It is the %dth day.", sum);
	return 0;
}

005 三个数由小到大输出

题目:
输入三个整数x,y,z,请把这三个数由小到大输出。

程序分析:
我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。

程序源代码:

#include <stdio.h>

int main()
{
	int x, y, z, t;
	scanf("%d%d%d", &x, &y, &z);
	if (x > y)
	{
		t = x; x = y; y = t;
	} /*交换x,y的值*/
	if (x > z)
	{
		t = z; z = x; x = t;
	}/*交换x,z的值*/
	if (y > z)
	{
		t = y; y = z; z = t;
	}/*交换z,y的值*/
	printf("small to big: %d %d %d\n", x, y, z);
	return 0;
}

006 用*号输出字母C的图案

题目:
用*号输出字母C的图案。

程序分析:
可先用’*'号在纸上写出字母C,再分行输出。

程序源代码:

#include <stdio.h>

int main()
{
	printf("Hello C-world!\n");
	printf(" ****\n");
	printf(" *\n");
	printf(" * \n");
	printf(" ****\n");
	return 0;
}

007 输出特殊图案

题目:
输出特殊图案,请在c环境中运行,看一看,Very Beautiful!

程序分析:
字符共有256个。不同字符,图形不一样。 
     
程序源代码:

#include <stdio.h>

int main()
{
	char a = 176, b = 219;
	printf("%c%c%c%c%c\n", b, a, a, a, b);
	printf("%c%c%c%c%c\n", a, b, a, b, a);
	printf("%c%c%c%c%c\n", a, a, b, a, a);
	printf("%c%c%c%c%c\n", a, b, a, b, a);
	printf("%c%c%c%c%c\n", b, a, a, a, b);
	return 0;
}

008 输出9*9口诀

题目:
输出9*9口诀。

程序分析:
分行与列考虑,共9行9列,i控制行,j控制列。

程序源代码:

#include <stdio.h>

int main()
{
	int i, j, result;
	printf("\n");
	for (i = 1; i < 10; i++)
	{
		for (j = 1; j < 10; j++)
		{
			result = i * j;
			printf("%d*%d=%-3d", i, j, result); /*-3d表示左对齐,占3位*/
		}
		printf("\n");/*每一行后换行*/
	}
	return 0;
}

009 输出国际象棋棋盘

题目:
要求输出国际象棋棋盘。

程序分析
用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。

程序源代码:

#include <stdio.h>

int main()
{
	int i, j;
	for (i = 0; i < 8; i++)
	{
		for (j = 0; j < 8; j++)
			if ((i + j) % 2 == 0)
				printf("%c%c", 219, 219);
			else
				printf(" ");
		printf("\n");
	}
	return 0;
}

010 打印楼梯

题目:
打印楼梯,同时在楼梯上方打印两个笑脸。

程序分析:
用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。

程序源代码:

#include <stdio.h>

int main()
{
	int i, j;
	printf("\1\1\n");/*输出两个笑脸*/
	for (i = 1; i < 11; i++)
	{
		for (j = 1; j <= i; j++)
			printf("%c%c", 219, 219);
		printf("\n");
	}
	return 0;
}

011-020

011 兔子总数

题目:
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

程序分析:
兔子的规律为数列1,1,2,3,5,8,13,21…

程序源代码:

#include <stdio.h>

int main()
{
	long f1, f2;
	int i;
	f1 = f2 = 1;
	for (i = 1; i <= 20; i++)
	{
		printf("%12ld %12ld", f1, f2);
		if (i % 2 == 0) printf("\n"); /*控制输出,每行四个*/
		f1 = f1 + f2; /*前两个月加起来赋值给第三个月*/
		f2 = f1 + f2; /*前两个月加起来赋值给第三个月*/
	}
	return 0;
}

012 101-200之间有多少个素数

题目:
判断101-200之间有多少个素数,并输出所有素数。

程序分析:
判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

程序源代码:

#include <stdio.h>
#include <math.h>

int main()
{
	int m, i, k, h = 0, leap = 1;
	printf("\n");
	for (m = 101; m <= 200; m++)
	{
		k = sqrt(m + 1);
		for (i = 2; i <= k; i++)
			if (m%i == 0)
			{
				leap = 0; break;
			}
		if (leap) {
			printf("%-4d", m); h++;
			if (h % 10 == 0)
				printf("\n");
		}
		leap = 1;
	}
	printf("\nThe total is %d", h);
	return 0;
}

013 水仙花数

题目:
打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

程序分析:
利用for循环控制100-999个数,每个数分解出个位,十位,百位。

程序源代码:

#include <stdio.h>
#include <math.h>

int main()
{
	int i, j, k, n;
	printf("'water flower'number is:");
	for (n = 100; n < 1000; n++)
	{
		i = n / 100;/*分解出百位*/
		j = n / 10 % 10;/*分解出十位*/
		k = n % 10;/*分解出个位*/
		if (i * 100 + j * 10 + k == i * i*i + j * j*j + k * k*k)
		{
			printf("%-5d", n);
		}
	}
	printf("\n");
	return 0;
}

014 正整数分解质因数

题目:
将一个正整数分解质因数。例如:输入90,打印出90=233*5。

程序分析:
对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int n, i;
	printf("\nplease input a number:\n");
	scanf("%d", &n);
	printf("%d=", n);
	for (i = 2; i <= n; i++)
	{
		while (n != i)
		{
			if (n%i == 0)
			{
				printf("%d*", i);
				n = n / i;
			}
			else
				break;
		}
	}
	printf("%d", n);
	return 0;
}

015 成绩分等

题目:
利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

程序分析:
(a>b)?a:b这是条件运算符的基本例子。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int score;
	char grade;
	printf("please input a score\n");
	scanf("%d", &score);
	grade = score >= 90 ? 'A' : (score >= 60 ? 'B' : 'C');
	printf("%d belongs to %c", score, grade);
	return 0;
}

016 最大公约数和最小公倍数

题目:
输入两个正整数m和n,求其最大公约数和最小公倍数。

程序分析:
利用辗除法。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a, b, t, r;
	printf("请输入两个数字:\n");
	scanf("%d %d", &a, &b);
	if (a < b)
	{
		t = b;
		b = a;
		a = t;
	}
	r = a % b;
	int n = a * b;
	while (r != 0)/*利用辗除法,直到r为0为止*/
	{
		a = b;
		b = r;
		r = a % b;
	}
	printf("这两个数的最大公约数为%d,最小公倍数为%d\n", b, n / b);
	return 0;
}

017 统计字符个数

题目:
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

程序分析:
利用while语句,条件为输入的字符不为’\n’.
    
程序源代码:

#include<stdio.h>
int main()
{
	char c;
	int letters = 0, space = 0, digit = 0, others = 0;
	printf("please input some characters\n");
	while ((c = getchar()) != '\n')
	{
		if (c >= 'a'&&c <= 'z' || c >= 'A'&&c <= 'Z')
			letters++;
		else if (c == ' ')
			space++;
		else if (c >= '0'&&c <= '9')
			digit++;
		else
			others++;
	}
	printf("all in all:char=%d space=%d digit=%d others=%d\n", letters, space, digit, others);
	return 0;
}

018 a+aa+aaa+aaaa+aa…a

题目:
求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

程序分析:
关键是计算出每一项的值。此处注意,若不使用double而使用int,则最多输出到10位数的整数。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main() {
	printf("input a, n:");
	long double a, n;
	scanf("%lf%lf", &a, &n);

	long double i, k = a;  // 保留a的初值
	long double sum = 0;
	for (i = 1; i <= n; i++) {
		printf("a = %lf\n", a);
		sum += a;      // sum = a + aa + aaa + aaaa..........
		a = a * 10 + k;  // 依次为a, aa, aaa, aaaa, aaaaa........ 
	}
	printf("sum = %lf\n", sum);

	return 0;
}

019 完数

题目:
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

程序分析:
遍历1000以内所有数,判断是否满足

程序源代码:

#include<stdio.h>

void main()
{
	int i, j;

	j = 1;

	for (i = 3; i < 1000; i++)
	{
		int sum = 0;
		while (j < i)
		{
			if (i % j == 0)
				sum = sum + j;
			j++;
		}
		j = 1;
		if (sum == i)
			printf("%d是完数\n", i);

	}

}

020 自由落体

题目:
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

程序分析:
见注释

程序源代码:

#include<stdio.h>

int main()
{
	float sn = 100.0, hn = sn / 2;
	int n;
	for (n = 2; n <= 10; n++)
	{
		sn = sn + 2 * hn;/*第n次落地时共经过的米数*/
		hn = hn / 2; /*第n次反跳高度*/
	}
	printf("the total of road is %f\n", sn);
	printf("the tenth is %f meter\n", hn);
	return 0;
}

021-030

021 猴子吃桃问题

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

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

程序源代码:

#include<stdio.h>

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

022 三队赛手的名单

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

程序分析:
判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。  
     
程序源代码:

#include<stdio.h>

int main()
{
	char i, j, k; /*i是a的对手,j是b的对手,k是c的对手*/
	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("order is a--%c\tb--%c\tc--%c\n", i, j, k);
					}
				}
		}
	return 0;
}

023 打印(菱形)

题目:
打印出如下图案(菱形)
在这里插入图片描述

程序分析:
先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重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;
}

024 2/1,3/2,5/3,8/5,13/8,21/13…前20项和

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

程序分析:
请抓住分子与分母的变化规律。

程序源代码:

#include<stdio.h>

int main()
{
	int n, t, number = 20;
	float a = 2, b = 1, s = 0;
	for (n = 1; n <= number; n++)
	{
		s = s + a / b;
		t = a; a = a + b; b = t;/*这部分是程序的关键,请读者猜猜t的作用*/
	}
	printf("sum is %9.6f\n", s);
	return 0;
}

025 求1+2!+3!+…+20!的和

题目:
求1+2!+3!+…+20!的和

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

程序源代码:

main()
{
float n,s=0,t=1;
for(n=1;n<=20;n++)
 {
 t*=n;
 s+=t;
 }
printf("1+2!+3!...+20!=%e\n",s);
}

026 递归方法求5!

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

程序分析:
递归公式:fn=fn_1*4!

程序源代码:

#include<stdio.h>

int main()
{
	int i;
	int fact(int j);
	for (i = 0; i < 6; i++)
		printf("\40:%d!=%d\n", i, fact(i));
}

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

027 5个字符逆序输出

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

程序源代码:

#include<stdio.h>

int main()
{
	int i = 5;
	void palin(int n);
	printf("\40:");
	palin(i);
	printf("\n");
	return 0;
}
void palin(int n)
{
	char next;
	if (n <= 1)
	{
		next = getchar();
		printf("\n\0:");
		putchar(next);
	}
	else
	{
		next = getchar();
		palin(n - 1);
		putchar(next);
	}
}

028 第五个人多大岁数

题目:
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

程序分析:
利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

程序源代码:

#include<stdio.h>

int age(int n)
{
	int c;
	if (n == 1) c = 10;
	else c = age(n - 1) + 2;
	return(c);
}
int main()
{
	printf("%d", age(5));
	return 0;
}

029 正整数是几位数

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

程序分析: 学会分解出每一位数,如下解释:

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	long a, b, c, d, e, x;
	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("there are 5, %ld %ld %ld %ld %ld\n", e, d, c, b, a);
	else if (b != 0) printf("there are 4, %ld %ld %ld %ld\n", e, d, c, b);
	else if (c != 0) printf(" there are 3,%ld %ld %ld\n", e, d, c);
	else if (d != 0) printf("there are 2, %ld %ld\n", e, d);
	else if (e != 0) printf(" there are 1,%ld\n", e);
	return 0;
}

030 回文数

题目: 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

程序分析: 同29例

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	long ge, shi, qian, wan, x;
	scanf("%ld", &x);
	wan = x / 10000;
	qian = x % 10000 / 1000;
	shi = x % 100 / 10;
	ge = x % 10;
	if (ge == wan && shi == qian)/*个位等于万位并且十位等于千位*/
		printf("this number is a huiwen\n");
	else
		printf("this number is not a huiwen\n");
	return 0;
}

031-040

031 根据字母来判断一下是星期几

题目:
请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

程序分析:
用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。

程序源代码:

#include<stdio.h>
#include<conio.h>
int main()
{
	char letter;
	printf("please input the first letter of someday\n");
	while ((letter = _getch()) != 'Y') /*当所按字母为Y时才结束*/
	{
		switch (letter)
		{
		case 'S':printf("please input second letter\n");
			if ((letter = _getch()) == 'a')
				printf("saturday\n");
			else if ((letter = _getch()) == 'u')
				printf("sunday\n");
			else printf("data error\n");
			break;
		case 'F':printf("friday\n"); break;
		case 'M':printf("monday\n"); break;
		case 'T':printf("please input second letter\n");
			if ((letter = _getch()) == 'u')
				printf("tuesday\n");
			else if ((letter = _getch()) == 'h')
				printf("thursday\n");
			else printf("data error\n");
			break;
		case 'W':printf("wednesday\n"); break;
		default: printf("data error\n");
		}
	}
	return 0;
}

032 change color

题目:
Press any key to change color, do you want to try it. Please hurry up!

程序源代码:

#include <conio.h>
#include <stdio.h>
#include <windows.h>

int textbackground(short iColor)
{
	HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbInfo;
	GetConsoleScreenBufferInfo(hd, &csbInfo);
	return SetConsoleTextAttribute(hd, (iColor << 4) | (csbInfo.wAttributes&~0xF0));
}
int main(void)
{
	int color;
	for (color = 0; color < 8; color++)
	{
		textbackground(color);//设置文本的背景颜色
		_cprintf("this is color%d\r\n", color);
		_cprintf("press any key to continue\r\n");
		_getch();//输入的字符看不见
	}
	return 0;
}

在这里插入图片描述

033 gotoxy()与clrscr()函数

题目:
学习gotoxy()与clrscr()函数

程序源代码:

#include <conio.h>
#include <stdio.h>
#include <windows.h>

void clrscr(void);
void gotoxy(int, int);

int textbackground(short iColor)
{
	HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbInfo;
	GetConsoleScreenBufferInfo(hd, &csbInfo);
	return SetConsoleTextAttribute(hd, (iColor << 4) | (csbInfo.wAttributes&~0xF0));
}
int main(void)
{
	clrscr(); /*清屏函数*/
	textbackground(2);
	gotoxy(1, 5); /*定位函数*/
	_cprintf("Output at row 5 column 1\n");
	textbackground(3);
	gotoxy(20, 10);
	_cprintf("Output at row 10 column 20\n");
	return 0;
}

void clrscr(void)
{
	CONSOLE_SCREEN_BUFFER_INFO    csbiInfo;
	HANDLE    hConsoleOut;
	COORD    Home = { 0,0 };
	DWORD    dummy;
	hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo);
	FillConsoleOutputCharacter(hConsoleOut, ' ', csbiInfo.dwSize.X * csbiInfo.dwSize.Y, Home, &dummy);
	csbiInfo.dwCursorPosition.X = 0;
	csbiInfo.dwCursorPosition.Y = 0;
	SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition);
}


void gotoxy(int x, int y)
{
	CONSOLE_SCREEN_BUFFER_INFO    csbiInfo;
	HANDLE    hConsoleOut;
	hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo);
	csbiInfo.dwCursorPosition.X = x;
	csbiInfo.dwCursorPosition.Y = y;
	SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition);
}

034 练习函数调用

题目: 练习函数调用

程序源代码:

#include <stdio.h>

void hello_world(void)
{
	printf("Hello, world!\n");
}
void three_hellos(void)
{
	int counter;
	for (counter = 1; counter <= 3; counter++)
		hello_world();/*调用此函数*/
}
void main(void)
{
	three_hellos();/*调用此函数*/
}

035 文本颜色设置

题目: 文本颜色设置

程序源代码:

#include <stdio.h>
#include <conio.h>
#include <windows.h>

void color(int c)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
int main()
{
	color(0);
	printf("这是0号颜色\n");
	color(1);
	printf("这是1号颜色\n");
	color(2);
	printf("这是2号颜色\n");
	color(3);
	printf("这是3号颜色\n");
	color(4);
	printf("这是4号颜色\n");
	color(5);
	printf("这是5号颜色\n");
	color(6);
	printf("这是6号颜色\n");
	color(7);
	printf("这是7号颜色\n");
	color(8);
	printf("这是8号颜色\n");
	color(9);
	printf("这是9号颜色\n");
	color(10);
	printf("这是10号颜色\n");
	color(11);
	printf("这是11号颜色\n");
	color(12);
	printf("这是12号颜色\n");
	color(13);
	printf("这是13号颜色\n");
	color(14);
	printf("这是14号颜色\n");
	color(15);
	printf("这是15号颜色\n");//数值超过15改变的就不是文本的颜色了改变的是背景色
	return 0;
}

在这里插入图片描述

036 求100之内的素数

**题目:**求100之内的素数

程序源代码:

#include <stdio.h>
#include <math.h>
#define N 101
int main()
{
	int i, j, line, a[N];
	for (i = 2; i < N; i++) a[i] = i;
	for (i = 2; i < sqrt(N); i++)
		for (j = i + 1; j < N; j++)
		{
			if (a[i] != 0 && a[j] != 0)
				if (a[j] % a[i] == 0)
					a[j] = 0;
		}
	printf("\n");
	for (i = 2, line = 0; i < N; i++)
	{
		if (a[i] != 0)
		{
			printf("%5d", a[i]);
			line++;
		}
		if (line == 10)
		{
			printf("\n");
			line = 0;
		}
	}
	return  0;
}

对10个数进行排序

题目:
对10个数进行排序

程序分析:
可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。  
     
程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 10
int main()
{
	int i, j, min, tem, a[N];
	/*input data*/
	printf("please input ten num:\n");
	for (i = 0; i < N; i++)
	{
		printf("a[%d]=", i);
		scanf("%d", &a[i]);
	}
	printf("\n");
	for (i = 0; i < N; i++)
		printf("%5d", a[i]);
	printf("\n");
	/*sort ten num*/
	for (i = 0; i < N - 1; i++)
	{
		min = i;
		for (j = i + 1; j < N; j++)
			if (a[min] > a[j]) min = j;
		tem = a[i];
		a[i] = a[min];
		a[min] = tem;
	}
	/*output data*/
	printf("After sorted \n");
	for (i = 0; i < N; i++)
		printf("%5d", a[i]);
	return 0;
}

038 求一个3*3矩阵对角线元素之和

题目: 求一个3*3矩阵对角线元素之和

程序分析: 利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

程序源代码:

#include <stdio.h>
#define N 10
int main()
{
	float a[3][3], sum = 0;
	int i, j;
	printf("please input rectangle element:\n");
	for (i = 0; i < 3; i++)
		for (j = 0; j < 3; j++)
			scanf("%f", &a[i][j]);
	for (i = 0; i < 3; i++)
		sum = sum + a[i][i];
	printf("duijiaoxian he is %6.2f", sum);
	return 0;
}

039 数组插入数

题目:
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

程序分析:
首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 10
int main()
{
	int a[11] = { 1,4,6,9,13,16,19,28,40,100 };
	int temp1, temp2, number, end, i, j;
	printf("original array is:\n");
	for (i = 0; i < 10; i++)
		printf("%5d", a[i]);
	printf("\n");
	printf("insert a new number:");
	scanf("%d", &number);
	end = a[9];
	if (number > end)
		a[10] = number;
	else
	{
		for (i = 0; i < 10; i++)
		{
			if (a[i] > number)
			{
				temp1 = a[i];
				a[i] = number;
				for (j = i + 1; j < 11; j++)
				{
					temp2 = a[j];
					a[j] = temp1;
					temp1 = temp2;
				}
				break;
			}
		}
	}
	for (i = 0; i < 11; i++)
		printf("%6d", a[i]);
	return 0;
}

040 将一个数组逆序输出

题目: 将一个数组逆序输出。

程序分析: 用第一个与最后一个交换。

程序源代码:

#include <stdio.h>
#define N 5
int main()
{
	int a[N] = { 9,6,5,4,1 }, i, temp;
	printf("\n original array:\n");
	for (i = 0; i < N; i++)
		printf("%4d", a[i]);
	for (i = 0; i < N / 2; i++)
	{
		temp = a[i];
		a[i] = a[N - i - 1];
		a[N - i - 1] = temp;
	}
	printf("\n sorted array:\n");
	for (i = 0; i < N; i++)
		printf("%4d", a[i]);
	return 0;
}

041-050

041 static定义静态变量

题目: 学习static定义静态变量的用法

程序源代码:

#include <stdio.h>

void varfunc()
{
	int var = 0;
	static int static_var = 0;
	printf("\40:var equal %d \n", var);
	printf("\40:static var equal %d \n", static_var);
	printf("\n");
	var++;
	static_var++;
}
int main()
{
	int i;
	for (i = 0; i < 3; i++)
		varfunc();
	return 0;
}

042 使用auto定义变量

题目: 学习使用auto定义变量的用法

程序源代码:


#include <stdio.h>

int main()
{
	int i, num;
	num = 2;
	for (i = 0; i < 3; i++)
	{
		printf("\40: The num equal %d \n", num);
		num++;
		{
			auto num = 1;
			printf("\40: The internal block num equal %d \n", num);
			num++;
		}
	}
	return 0;
}

043 static的另一用法

题目: 学习使用static的另一用法。

程序源代码:

#include <stdio.h>

int main()
{
	int i, num;
	num = 2;
	for (i = 0; i < 3; i++)
	{
		printf("\40: The num equal %d \n", num);
		num++;
		{
			static int num = 1;
			printf("\40:The internal block num equal %d\n", num);
			num++;
		}
	}
	return 0;
}

044 学习使用external的用法

题目: 学习使用external的用法。

程序源代码:

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

int x = 0;
int y = 5;
int func1()
{
	extern int p, q;
	printf("p is %d, q is %d\n", p, q);
	return 0;
}

int p = 8;
int q = 10;
int main()
{
	func1();
	printf("x is %d, y is %d\n", x, y);
}

045 使用register定义变量

题目: 学习使用register定义变量的方法。

程序源代码:

#include <stdio.h>

int main()
{
	register int i;
	int tmp = 0;
	for (i = 1; i <= 100; i++)
		tmp += i;
	printf("The sum is %d\n", tmp);
	return 0;
}

046 宏#define命令练习(1)

**题目:**宏#define命令练习(1)

程序源代码:

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

#define TRUE 1
#define FALSE 0
#define SQ(x) (x)*(x)
void main()
{
	int num;
	int again = 1;
	printf("\40: Program will stop if input value less than 50.\n");
	while (again)
	{
		printf("\40:Please input number==>");
		scanf("%d", &num);
		printf("\40:The square for this number is %d \n", SQ(num));
		if (num >= 50)
			again = TRUE;
		else
			again = FALSE;
	}
}

047 宏#define命令练习(2)

**题目:**宏#define命令练习(2)

程序源代码:

#include <stdio.h>
/*宏定义中允许包含两道衣裳命令的情形,此时必须在最右边加上"\"*/
#define exchange(a,b){ \
int t = a; \
a = b; \
b = t; \
}
int main(void)
{
	int x = 10;
	int y = 20;
	printf("x=%d; y=%d\n", x, y);
	exchange(x, y);
	printf("x=%d; y=%d\n", x, y);
	return 0;
}

048 宏#define命令练习(3)

题目: 宏#define命令练习(3)

程序源代码:

#include <stdio.h>

#define LAG >
#define SMA <
#define EQ ==

int main()
{
	int i = 10;
	int j = 20;
	if (i LAG j)
		printf("\40: %d larger than %d \n", i, j);
	else if (i EQ j)
		printf("\40: %d equal to %d \n", i, j);
	else if (i SMA j)
		printf("\40:%d smaller than %d \n", i, j);
	else
		printf("\40: No such value.\n");
	return 0;
}

049 #if #ifdef和#ifndef的综合应用

题目:#if #ifdef和#ifndef的综合应用。

程序源代码:

#include <stdio.h>

#define MAX
#define MAXIMUM(x,y) (x>y)?x:y
#define MINIMUM(x,y) (x>y)?y:x

int main()
{
	int a = 10, b = 20;
#ifdef MAX
	printf("\40: The larger one is %d\n", MAXIMUM(a, b));
#else
	printf("\40: The lower one is %d\n", MINIMUM(a, b));
#endif
#ifndef MIN
	printf("\40: The lower one is %d\n", MINIMUM(a, b));
#else
	printf("\40: The larger one is %d\n", MAXIMUM(a, b));
#endif
#undef MAX
#ifdef MAX
	printf("\40: The larger one is %d\n", MAXIMUM(a, b));
#else
	printf("\40: The lower one is %d\n", MINIMUM(a, b));
#endif
#define MIN
#ifndef MIN
	printf("\40: The lower one is %d\n", MINIMUM(a, b));
#else
	printf("\40: The larger one is %d\n", MAXIMUM(a, b));
#endif
	return 0;
}

050 #include 的应用练习

题目:#include 的应用练习

程序源代码:

//test.h 文件如下:
#define LAG >
#define SMA <
#define EQ ==
//#include "test.h" /*一个新文件50.c,包含test.h*/
#include <stdio.h>
int main()
{
	int i = 10;
	int j = 20;
	if (i LAG j)
		printf("\40: %d larger than %d \n", i, j);
	else if (i EQ j)
		printf("\40: %d equal to %d \n", i, j);
	else if (i SMA j)
		printf("\40:%d smaller than %d \n", i, j);
	else
		printf("\40: No such value.\n");
	return 0;
}

051-060

051 学习使用按位与 &

题目: 学习使用按位与 & 。

程序分析: 0&0=0; 0&1=0; 1&0=0; 1&1=1

程序源代码:

#include <stdio.h>
int main()
{
	int a, b;
	a = 077;
	b = a & 3;
	printf("\40: The a & b(decimal) is %d \n", b);
	b &= 7;
	printf("\40: The a & b(decimal) is %d \n", b);
	return 0;
}

052 学习使用按位或 |

题目: 学习使用按位或 | 。

程序分析: 0|0=0; 0|1=1; 1|0=1; 1|1=1

程序源代码:

#include <stdio.h>
int main()
{
	int a, b;
	a = 077;
	b = a | 3;
	printf("\40: The a & b(decimal) is %d \n", b);
	b |= 7;
	printf("\40: The a & b(decimal) is %d \n", b);
	return 0;
}

053 学习使用按位异或 ^

题目: 学习使用按位异或 ^ 。

程序分析: 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("\40: The a & b(decimal) is %d \n", b);
	b ^= 7;
	printf("\40: The a & b(decimal) is %d \n", b);
	return 0;
}

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

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

程序分析: 可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。可用(0<<4)
(3)将上面二者进行&运算。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
int main()
{
	unsigned a, b, c, d;
	scanf("%o", &a);
	b = a >> 4;
	c = ~(~0 << 4);
	d = b & c;
	printf("%o\n%o\n", a, d);
	return 0;
}

055 按位取反~

题目: 学习使用按位取反~。

程序分析:~0=1; ~1=0;

程序源代码:

#include <stdio.h>
int main()
{
	int a, b;
	a = 234;
	b = ~a;
	printf("\40: The a's 1 complement(decimal) is %d \n", b);
	a = ~a;
	printf("\40: The a's 1 complement(hexidecimal) is %x \n", a);
	return 0;
}

056 circle画圆形

题目: 画图,学用circle画圆形。

程序分析: 需要安装graphics https://blog.csdn.net/weixin_41586634/article/details/89554355

程序源代码:

#include <stdio.h>
#include <graphics.h> /*circle*/
int main()
{
	int driver, mode, i;
	float j = 1, k = 1;
	driver = VGA; mode = VGAHI;
	initgraph(&driver, &mode, (char*)"");
	setbkcolor(YELLOW);
	for (i = 0; i <= 25; i++)
	{
		setcolor(WHITE);
		circle(310, 250, k);
		k = k + j;
		j = j + 0.3;
	}
	system("pause");
	return 0;
}

057 学用line画直线

题目: 画图,学用line画直线。

程序源代码:

#include <stdio.h>
#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, (char*)"");
	setbkcolor(BLUE);
	x0 = 263; y0 = 263; y1 = 275; x1 = 275;
	for (i = 0; i <= 18; i++)
	{
		setcolor(YELLOW);
		line(x0, y0, x0, y1);
		x0 = x0 - 5;
		y0 = y0 - 5;
		x1 = x1 + 5;
		y1 = y1 + 5;
		j = j + 10;
	}
	x0 = 263; y1 = 275; y0 = 263;
	for (i = 0; i <= 20; i++)
	{
		setcolor(WHITE);
		line(x0, y0, x0, y1);
		x0 = x0 + 5;
		y0 = y0 + 5;
		y1 = y1 - 5;
	}
	system("pause");
	return 0;
}

058 学用rectangle画方形

题目: 画图,学用rectangle画方形。

程序分析: 利用for循环控制100-999个数,每个数分解出个位,十位,百位。这里需要注意outtextxy的乱码问题,强转或者直接定义都不行。需使用MultiByteToWideChar方法去避免。

程序源代码:

#include <graphics.h> 
#include <conio.h>

void CharToTCHAR(const char* _char, TCHAR* tchar)
{
	int iLength = MultiByteToWideChar(CP_UTF8, 0, _char, strlen(_char) + 1, NULL, 0);
	MultiByteToWideChar(CP_UTF8, 0, _char, strlen(_char) + 1, tchar, iLength);
}

int main()
{
	int x0, y0, y1, x1, driver, mode, i;
	driver = VGA; mode = VGAHI;
	initgraph(&driver, &mode, (char*)"");
	setbkcolor(BLUE);
	x0 = 263; y0 = 263; y1 = 275; x1 = 275;
	for (i = 0; i <= 18; i++)
	{
		setcolor(WHITE);
		rectangle(x0, y0, x1, y1);
		x0 = x0 - 5;
		y0 = y0 - 5;
		x1 = x1 + 5;
		y1 = y1 + 5;
	}
	settextstyle(0, 0, NULL);

	const char* content = "How beautiful it is!";
	TCHAR content_t[21];
	CharToTCHAR(content, content_t);
	outtextxy(150, 40, content_t);
	line(130, 60, 480, 60);
	setcolor(2);
	circle(269, 269, 137);
	system("pause");
	return 0;
}

059 画图,综合例子(1)

题目: 画图,综合例子(1)

程序分析: 这里需要注意outtextxy的乱码问题,强转或者直接定义都不行。需使用MultiByteToWideChar方法去避免。

程序源代码:


#include <graphics.h>
#include <math.h>
#include <conio.h>

# define PAI 3.1415926
# define B 0.809

void CharToTCHAR(const char* _char, TCHAR* tchar)
{
	int iLength = MultiByteToWideChar(CP_UTF8, 0, _char, strlen(_char) + 1, NULL, 0);
	MultiByteToWideChar(CP_UTF8, 0, _char, strlen(_char) + 1, tchar, iLength);
}


int main()
{
	int i, j, k, x0, y0, x, y, driver, mode;
	float a;
	driver = CGA; mode = CGAC0;
	initgraph(&driver, &mode, (char*)"");
	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 */
	/*
	DEFAULT_FONT               0         8 * 8点阵字型(缺省字体)

	TRIPLEx_FONT                1         笔划式三倍字型(三倍字体)

	SMALL_FONT                  2         笔划式小字型(小字体)

	SANS_SERIF_FONT             3         笔划式字(Sanserif字体)

	GOTHIC_FONT                 4         笔划黑体字型(哥特体)


	HORIZ_DIR               0        从左到右显示(水平方向)
    VERT_DIR                1        从底向上显示(垂直方向)
	*/

	settextstyle(0, 0, 0);

	const char* content = "press a key:";
	TCHAR content_t[13];
	CharToTCHAR(content, content_t);
	outtextxy(10, 170, content_t);
	
	_getch();

	/*
	EMPTy_FILL               0         用背景色填充区域(空填)

	SOLID_FILL               1         用实填充色填充(实填)

	LINE_FILL                2         ----填充

	LTSLASH_FILL             3         ///填充

	SLASH_FILL               4         ///用粗线填充

	BKSLASH_FILL             5         用粗线填充

	LTBKSLASH_FILL           6         填充

	HATCH_FILL               7         网格线填充

	xHATCH_FILL              8         斜网格线填充

	INTEREAVE_FILL           9         间隔点填充

	WIDE_DOT_FILL            10        大间隔点填充

	CLOSE_DOT_FILL           11        小间隔点填充

	USER_FILL                12        用户定义图样填充
	*/

	setfillstyle(7, 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);
		}
	}
	system("pause");
	return 0}

补充:网上有很多综合性的画法,有兴趣可以研究下。
https://blog.csdn.net/ssAfterHard/article/details/80779344
在这里插入图片描述

https://blog.csdn.net/zggzgw/article/details/75070894
在这里插入图片描述

061-070

061 打印出杨辉三角形

题目: 打印出杨辉三角形(要求打印出10行如下图)

程序分析:
       1
      1  1
      1  2  1
      1  3  3  1
      1  4  6  4  1
      1  5  10 10 5  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");
	}
	system("pause");
	return 0;
}

062 学习putpixel画sin曲线

题目: 学习putpixel画sin曲线。
在这里插入图片描述

程序源代码:

#include<math.h> 
#include<graphics.h>
#include<conio.h>
int main()
{
	initgraph(640, 480);
	/*sin函数曲线*/
	int i, j, n;
	for (j = 200; j >= 100; j--) // 用100 - 200代替sin值的0 - 1,相当于放大
	{
		i = 200 + 20 * asin(double(200 - j) / 100);//预先右移200(只是为了位置清晰)
		n = i;
		putpixel(i,j,RED);//color可根据RGB自行选择
		putpixel(400 + 40 * asin(1) - i,j,RED);//对称画点,坐标计算即可得到
	}
	for (j = 200; j <= 300; j++)
	{
		i = 20 * asin(1) + n + 20 * asin(double(j - 200) / 100);
		putpixel(i, j, RED);
		putpixel(2 * n + 80 * asin(1) - i, j, RED);
	}
	_getch();
	closegraph();
	return 0;
}

063 画椭圆ellipse

题目: 画椭圆ellipse

程序源代码:

#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, (char*)"");
	top = y - 30;
	bottom = y - 30;
	for (i = 0; i < num; i++)
	{
		ellipse(0,top, 360, bottom);
		top -= 5;
		bottom += 5;
	}
	_getch();
	return 0;
}

064 ellipse and rectangle 画图

题目: 利用ellipse and rectangle 画图。

程序源代码:

#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, (char*)"");
	top = y - 30;
	bottom = y - 30;
	for (i = 0; i < num; i++)
	{
		ellipse(0,top, 360, bottom);
		top -= 5;
		bottom += 5;
	}

	int x0 = 263, y0 = 263, y1 = 275, x1 = 275;
	for (i = 0; i <= 18; i++)
	{
		setcolor(WHITE);
		rectangle(x0, y0, x1, y1);
		x0 = x0 - 5;
		y0 = y0 - 5;
		x1 = x1 + 5;
		y1 = y1 + 5;
	}


	_getch();
	return 0;
}

065 一个最优美的图案。

题目: 一个最优美的图案。

程序源代码:

#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;
	h = 400;
	w = 800;
	xcenter = w / 2 -100; /* Determine the center of circle */
	ycenter = h / 2 +50;
	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, (char*)"");
	setcolor(WHITE);
	setbkcolor(GREEN);
	LineToDemo();
	system("pause");
	return 0;
}

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

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

程序分析: 利用指针方法。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	int n1, n2, n3;
	int *pointer1, *pointer2, *pointer3;
	printf("please input 3 number:n1,n2,n3:");
	scanf("%d,%d,%d", &n1, &n2, &n3);
	pointer1 = &n1;
	pointer2 = &n2;
	pointer3 = &n3;
	void swap(int * p1, int *p2);
	if (n1 > n2) swap(pointer1, pointer2);
	if (n1 > n3) swap(pointer1, pointer3);
	if (n2 > n3) swap(pointer2, pointer3);
	printf("the sorted numbers are:%d,%d,%d\n", n1, n2, n3);
}
void swap(int * p1, int *p2)
{
	int p;
	p = *p1; *p1 = *p2; *p2 = p;
}

067 数组交换

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

程序分析: 谭浩强的书中答案有问题。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#define N 10
//输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
int main()
{
	int array[N];
	int i, j;
	int nin, max, n = 0, m = 0;
	for (i = 0; i < N; i++)
	{
		scanf("%d", &array[i]);
	}
	nin = max = array[0];
	for (i = 0; i < N; i++)
	{
		if (array[i] < nin)
		{
			n = i;
			nin = array[i];
		}
		if (array[i] > max)
		{
			m = i;
			max = array[i];
		}
	}
	int temp;
	temp = array[n]; array[n] = array[0]; array[0] = temp;
	int temp1;
	temp1 = array[m]; array[m] = array[N - 1]; array[N - 1] = temp1;
	printf("After:");
	for (i = 0; i < N; i++)
	{
		printf("%d  ", array[i]);
	}
	return 0;
}

068 m个数变成最前面的n个数

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

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	int number[20], n, m, i;
	printf("the total numbers is:");
	scanf("%d", &n);
	printf("back m:");
	scanf("%d", &m);
	
	for (i = 0; i < n; i++)
	{
		printf("number[%d]:\n",i);
		scanf("%d,", &number[i]);
	}

	void move(int array[], int n, int m);
	move(number, n, m);
	for (i = 0; i < n - 1; i++)
		printf("%d,", number[i]);
	printf("%d", number[n - 1]);
	return 0;
}
void move(int array[], int n,int m)
{
	int *p, array_end;
	array_end = *(array + n - 1);
	for (p = array + n - 1; p > array; p--)
		*p = *(p - 1);
	*array = array_end;
	m--;
	if (m > 0) move(array, n, m);
}

069 最后留下的是原来第几号的那位

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

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#define nmax 50
int main()
{
	int i, k, m, n, num[nmax], *p;
	printf("please input the total of numbers:");
	scanf("%d", &n);
	p = num;
	for (i = 0; i < n; i++)
		*(p + i) = i + 1;
	i = 0;
	k = 0;
	m = 0;
	while (m < n - 1)
	{
		if (*(p + i) != 0) k++;
		if (k == 3)
		{
			*(p + i) = 0;
			k = 0;
			m++;
		}
		i++;
		if (i == n) i = 0;
	}
	while (*p == 0) p++;
	printf("%d is left\n", *p);
	return 0;
}

070 高度优化的strlen

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

程序分析: 高度优化的strlen

程序源代码:

#include <stdio.h>

int main()
{
	const char* p = "qwerasdfkalkdsfjoqkf12314sdfs";
	unsigned int strlen(const char *str);
	printf("%u", strlen(p));
	return 0;
}
unsigned int strlen(const char *str) {
	const char *char_ptr;
	const unsigned long int *longword_ptr;
	unsigned long int longword, himagic, lomagic;
	for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof(longword) - 1)) != 0; ++char_ptr)
		if (*char_ptr == '\0')
			return char_ptr - str;
	longword_ptr = (unsigned long int *) char_ptr;
	himagic = 0x80808080L;
	lomagic = 0x01010101L;
	if (sizeof(longword) > 4) {
		himagic = ((himagic << 16) << 16) | himagic;
		lomagic = ((lomagic << 16) << 16) | lomagic;
	}
	for (;;) {
		longword = *longword_ptr++;
		if (((longword - lomagic) & ~longword & himagic) != 0) {
			const char *cp = (const char *)(longword_ptr - 1);
			if (cp[0] == 0) return cp - str;
			if (cp[1] == 0) return cp - str + 1;
			if (cp[2] == 0) return cp - str + 2;
			if (cp[3] == 0) return cp - str + 3;
			if (sizeof(longword) > 4) {
				if (cp[4] == 0) return cp - str + 4;
				if (cp[5] == 0) return cp - str + 5;
				if (cp[6] == 0) return cp - str + 6;
				if (cp[7] == 0) return cp - str + 7;
			}
		}
	}
}

071-080

071 输出5个学生的数据记录

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

程序源代码

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#define N 5
struct student
{
	char num[6];
	char name[8];
	int score[4];
} stu[N];

void input(struct student stu[])
{ 
	int i, j;
	for (i = 0; i < N; i++)
	{
		printf("\n please input %d of %d\n", i + 1, N);
		printf("num: ");
		scanf("%s", stu[i].num);
		printf("name: ");
		scanf("%s", stu[i].name);
		for (j = 0; j < 3; j++)
		{
			printf("score %d.", j + 1);
			scanf("%d", &stu[i].score[j]);
		}
		printf("\n");
	}
}
void print(struct student stu[])
{ 
	int i, j;
	printf("\nNo. Name Sco1 Sco2 Sco3\n");
	for (i = 0; i < N; i++)
	{
		printf("%-6s%-10s", stu[i].num, stu[i].name);
		for (j = 0; j < 3; j++)
			printf("%-8d", stu[i].score[j]);
		printf("\n");
	}
}
int main()
{
	input(stu);
	print(stu);
	return 0;
}

072 创建一个链表

题目: 创建一个链表。

程序源代码:

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

struct list
{
	int data;
	struct list *next;
};

typedef struct list node;
typedef node *link;

int main()
{
	link ptr = NULL;
	link head = (link)malloc(sizeof(node));
	int num, i;
	ptr = head;
	printf("please input 5 numbers==>\n");
	for (i = 0; i <= 4; i++)
	{
		scanf("%d", &num);
		ptr->data = num;
		ptr->next = (link)malloc(sizeof(node));
		if (i == 4) ptr->next = NULL;
		else ptr = ptr->next;
	}
	ptr = head;
	while (ptr != NULL)
	{
		printf("The value is ==>%d\n", ptr->data);
		ptr = ptr->next;
	}
	return 0;
}

073 反向输出一个链表

题目: 反向输出一个链表。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

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

struct list
{
	int data;
	struct list *next;
};
typedef struct list node;
typedef node *link;
int main()
{
	link ptr, head, tail;
	int num, i;
	tail = (link)malloc(sizeof(node));
	tail->next = NULL;
	ptr = tail;
	printf("\nplease input 5 data==>\n");
	for (i = 0; i <= 4; i++)
	{
		scanf("%d", &num);
		ptr->data = num;
		head = (link)malloc(sizeof(node));
		head->next = ptr;
		ptr = head;
	}
	ptr = ptr->next;
	while (ptr != NULL)
	{
		printf("The value is ==>%d\n", ptr->data);
		ptr = ptr->next;
	}
	return 0;
}

074 连接两个链表

题目: 连接两个链表。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

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

struct list
{
	int data;
	struct list *next;
};
typedef struct list node;
typedef node *link;

link delete_node(link pointer, link tmp)
{
	if (tmp == NULL) /*delete first node*/
		return pointer->next;
	else
	{
		if (tmp->next->next == NULL)/*delete last node*/
			tmp->next = NULL;
		else /*delete the other node*/
			tmp->next = tmp->next->next;
		return pointer;
	}
}
void selection_sort(link pointer, int num)
{
	link tmp, btmp;
	int i, min;
	for (i = 0; i < num; i++)
	{
		tmp = pointer;
		min = tmp->data;
		btmp = NULL;
		while (tmp->next)
		{
			if (min > tmp->next->data)
			{
				min = tmp->next->data;
				btmp = tmp;
			}
			tmp = tmp->next;
		}
		printf("\40: %d\n", min);
		pointer = delete_node(pointer, btmp);
	}
}
link create_list(int array[], int num)
{
	link tmp1, tmp2, pointer;
	int i;
	pointer = (link)malloc(sizeof(node));
	pointer->data = array[0];
	tmp1 = pointer;
	for (i = 1; i < num; i++)
	{
		tmp2 = (link)malloc(sizeof(node));
		tmp2->next = NULL;
		tmp2->data = array[i];
		tmp1->next = tmp2;
		tmp1 = tmp1->next;
	}
	return pointer;
}
link concatenate(link pointer1, link pointer2)
{
	link tmp;
	tmp = pointer1;
	while (tmp->next)
		tmp = tmp->next;
	tmp->next = pointer2;
	return pointer1;
}
int main(void)
{
	int arr1[] = { 3,12,8,9,11 };
	link ptr;
	ptr = create_list(arr1, 5);
	selection_sort(ptr, 5);
	return 0;
}

075 一道简单的题目

题目: 放松一下,算一道简单的题目。

程序源代码:

#include <stdio.h>

int main()
{
	int i, n;
	for (i = 1; i < 5; i++)
	{
		n = 0;
		if (i != 1)
			n = n + 1;
		if (i == 3)
			n = n + 1;
		if (i == 4)
			n = n + 1;
		if (i != 4)
			n = n + 1;
		if (n == 3)
			printf("zhu hao shi de shi:%c", 64 + i);
	}
	return 0;
}

076 函数指针

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

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

typedef float(*funp)(int n);

int main()
{
	float peven(int n); 
	float podd(int n);
	float dcall(funp fp, int n);

	float sum;
	int n;
	while (1)
	{
		scanf("%d", &n);
		if (n > 1)
			break;
	}
	if (n % 2 == 0)
	{
		printf("Even=");
		sum = dcall(peven, n);
	}
	else
	{
		printf("Odd=");
		sum = dcall(podd, n);
	}
	printf("%f", sum);
	return 0;
}
float peven(int n)
{
	float s;
	int i;
	s = 1;
	for (i = 2; i <= n; i += 2)
		s += 1 / (float)i;
	return(s);
}
float podd(int n)
{
	float s;
	int i;
	s = 0;
	for (i = 1; i <= n; i += 2)
		s += 1 / (float)i;
	return(s);
}

float dcall(funp fp, int n)
{
	float s;
	s = (*fp)(n);
	return(s);
}

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

题目: 填空练习(指向指针的指针)

程序分析: 将q直接指向字符串数组,然后通过p后移去指向s[]中的元素,从而使用*p获取里面的值。

程序源代码:

int main()
{
	char *s[] = { (char *)"man",(char *)"woman",(char *)"girl",(char *)"boy",(char *)"sister" };
	char **q = NULL;
	int k;
	for (k = 0; k < 5; k++)
	{
		q = s + k;/*这里填写什么语句*/
		printf("%s\n", *q);
	}
}

078 找到年龄最大的人

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

程序源代码

#include <stdio.h>
#define N 4

static struct man
{
	char name[20];
	int age;
} person[N] = { "li",18,"wang",19,"zhang",20,"sun",22 };
int main()
{
	struct man *q=NULL, *p=NULL;
	int i, m = 0;
	p = person;
	for (i = 0; i < N; i++)
	{
		if (m < p->age)
			q = p++;
		m = q->age;
	}
	printf("%s,%d", (*q).name, (*q).age);
	return 0;
}

079 字符串排序

题目: 字符串排序。

程序分析: 比较并交换

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[20], str2[20], str3[20];
	void swap(char *p1, char *p2);
	printf("please input three strings\n");
	scanf("%s", str1);
	scanf("%s", str2);
	scanf("%s", str3);
	if (strcmp(str1, str2) > 0) swap(str1, str2);
	if (strcmp(str1, str3) > 0) swap(str1, str3);
	if (strcmp(str2, str3) > 0) swap(str2, str3);
	printf("after being sorted\n");
	printf("%s\n%s\n%s\n", str1, str2, str3);
}
void swap(char *p1, char *p2)
{
	char p[20];
	strcpy(p, p1); strcpy(p1, p2); strcpy(p2, p);
}

080 海滩上原来最少有多少个桃子

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

程序源代码:

#include <stdio.h>

int main()
{
	int i, m, j, k, count;
	for (i = 4; i < 10000; i += 4)
	{
		count = 0;
		m = i;
		for (k = 0; k < 5; k++)
		{
			j = i / 4 * 5 + 1;
			i = j;
			if (j % 4 == 0)
				count++;
			else
				break;
		}
		i = m;
		if (count == 4)
		{
			printf("%d\n", count);
			break;
		}
	}
	return 0;
}

081-090

081 809*??=800*??+9*??+1

题目:
809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。

程序源代码:

#include <stdio.h>

void output(long b, long i)
{
	printf("\n%ld/%ld=809*%ld+%ld", b, i, i, b%i);
}
int main()
{
	long int a, b, i;
	a = 809;
	for (i = 10; i < 100; i++)
	{
		b = i * a + 1;
		if (b >= 1000 && b <= 10000 && 8 * i < 100 && 9 * i >= 100)
			output(b, i);
	}
	return 0;
}

082 八进制转换为十进制

**题目:**八进制转换为十进制

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <math.h>

long long convertOctalToDecimal(int octalNumber);
int main()
{
	int octalNumber;

	printf("输入一个八进制数: ");
	scanf("%d", &octalNumber);

	printf("八进制数 %d  转换为十进制为 %lld", octalNumber, convertOctalToDecimal(octalNumber));

	return 0;
}

long long convertOctalToDecimal(int octalNumber)
{
	int decimalNumber = 0, i = 0;

	while (octalNumber != 0)
	{
		decimalNumber += (octalNumber % 10) * pow(8, i);
		++i;
		octalNumber /= 10;
	}

	i = 1;

	return decimalNumber;
}

083 求0—7所能组成的奇数个数

题目: 求0—7所能组成的奇数个数。

程序源代码:

#include <stdio.h>


int main()
{
	long sum = 4, s = 4;
	int j;
	for (j = 2; j <= 8; j++)/*j is place of number*/
	{
		printf("\n%ld", sum);
		if (j <= 2)
			s *= 7;
		else
			s *= 8;
		sum += s;
	}
	printf("\nsum=%ld", sum);
	return 0;
}

084 一个偶数总能表示为两个素数之和

**题目:**一个偶数总能表示为两个素数之和。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <math.h>

int main()
{
	int a, b, c, d;
	printf("请输入一位偶数:\n");
	scanf("%d", &a);
	for (b = 3; b <= a / 2; b += 2)
	{
		for (c = 2; c <= sqrt(b); c++)
			if (b%c == 0) break;
		if (c > sqrt(b))
			d = a - b;
		else
			break;
		for (c = 2; c <= sqrt(d); c++)
			if (d%c == 0) break;
		if (c > sqrt(d))
			printf("%d=%d+%d\n", a, b, d);
	}
	return 0;
}

085 判断一个素数能被几个9整除

题目: 判断一个素数能被几个9整除

程序分析: 需解决整形溢出的问题,因为即使是long long整形也无法表示18位数,即使换成long double也会随着我们输入溢出,但这里我们仅仅是训练思想,至于溢出的问题可以自己去了解。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <math.h>

bool isprime(int a)
{
	for (int i = 2; i <= sqrt(a); i++)
		if (a%i == 0)
			return false;
	return true;
}

int main()
{
	int p, i;
	long double sum = 9;
	printf("请输入一个数:\n");
	scanf("%d", &p);
	if (isprime(p)) {
		printf("%d isprime\n",p);
		for (i = 1;; i++) {
			if (fmodl(sum, p) == 0)
				break;//能被9整除,跳出循环
			else
				sum = sum * 10 + 9;//累加
		}
		printf("素数 %d 能整除 %d 个9组成的数 %lf", p ,i,sum);
	}
	return 0;
}


086 两个字符串连接

题目: 两个字符串连接程序

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[100], str2[100];
	int i, n;
	i = n = 0;
	printf("请输入您的第一个字符串:\n");
	gets_s(str1);
	printf("请输入您的第二个字符串:\n");
	gets_s(str2);
	printf("通过strcat函数串接结果为:\n%s", strcat(str1, str2));
	while (str1[n] != '\0') {
		n++;
	}
	while (str2[i] != '\0') {
		str1[++n] = str2[i++];
	}
	printf("\n不通过strcat函数串接结果为:\n%s", str1);
	return 0;
}

087 回答结果(结构体变量传递)

题目: 回答结果(结构体变量传递)

程序源代码:


#include <stdio.h>
#include <string.h>

struct student
{
	int x;
	char c;
} a;
int main()
{
	a.x = 3;
	a.c = 'a';
	void f(struct student b);
	f(a);
	printf("%d,%c", a.x, a.c);
	return 0}
void f(struct student b)
{
	b.x = 20;
	b.c = 'y';
}

088 读取7个数(1—50)的整数值

题目: 读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。

程序源代码:

#include <stdio.h>

int main()
{
	int i, a, n = 1;
	while (n <= 7)
	{
		do {
			scanf("%d", &a);
		} while (a < 1 || a>50);
		for (i = 1; i <= a; i++)
			printf("*");
		printf("\n");
		n++;
	}
	
	return 0;
}

089 电话传递数据加密

题目: 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

程序源代码:

#include <stdio.h>

int main()
{
	int a, i, aa[4], t;
	scanf("%d", &a);
	aa[0] = a % 10;
	aa[1] = a % 100 / 10;
	aa[2] = a % 1000 / 100;
	aa[3] = a / 1000;
	for (i = 0; i <= 3; i++)
	{
		aa[i] += 5;
		aa[i] %= 10;
	}
	for (i = 0; i <= 3 / 2; i++)
	{
		t = aa[i];
		aa[i] = aa[3 - i];
		aa[3 - i] = t;
	}
	for (i = 3; i >= 0; i--)
		printf("%d", aa[i]);
	return 0;
}

090 专升本一题,读结果。

题目: 专升本一题,读结果。

程序源代码:

#include <stdio.h>
#include <conio.h>
#define M 5
int main()
{   /*专升本一题:读结果*/
	int a[M] = { 1,2,3,4,5 };
	int i, j, t;
	i = 0; j = M - 1;
	while (i <= j)
	{
		t = *(a + i);
		*(a + i) = *(a + j);
		*(a + j) = t;
		i++; j--;
	}
	for (i = 0; i < M; i++)
	{
		printf("%d", *(a + i));
	}
	printf("\n");
	_getch();
	return 0;
}//54321

091-100

091 时间函数举例1

题目: 时间函数举例1

程序源代码:

#include <stdio.h>
#include <time.h>

int main()
{   
	time_t lt; /*define a longint time varible*/
	lt = time(NULL);/*system time and date*/
	printf(ctime(&lt)); /*english format output*/
	printf(asctime(localtime(&lt)));/*tranfer to tm*/
	printf(asctime(gmtime(&lt))); /*tranfer to Greenwich time*/
	return 0;
}

092 时间函数举例2

题目: 时间函数举例2

程序源代码:

#include <stdio.h>
#include <time.h>

int main()
{
	time_t start, end;
	int i;
	start = time(NULL);
	for (i = 0; i < 3000; i++)
	{
		printf("\1\1\1\1\1\1\1\1\1\1\n");
	}
	end = time(NULL);
	printf("\1: The different is %6.3f\n", difftime(end, start));
	return 0;
}

093 时间函数举例3

题目: 时间函数举例3

程序源代码:

#include <stdio.h>
#include <time.h>

int main()
{
	clock_t start, end;
	int i;
	double var;
	start = clock();
	for (i = 0; i < 10000; i++)
	{
		printf("\1\1\1\1\1\1\1\1\1\1\n");
	}
	end = clock();
	printf("\1: The different is %6.3f\n", (double)(end - start));
	return 0;
}

094 时间函数举例4 猜数游戏

题目: 时间函数举例4(一个猜数游戏,判断一个人反应快慢)。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

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

int main()
{
	char c;
	clock_t start, end;
	time_t a, b;
	double var;
	int i, guess;
	srand(time(NULL));
	printf("do you want to play it.('y' or 'n') \n");
loop:
	while ((c = getchar()) == 'y')
	{
		i = rand() % 100;
		printf("\nplease input number you guess:\n");
		start = clock();
		a = time(NULL);
		scanf("%d", &guess);
		while (guess != i)
		{
			if (guess > i)
			{
				printf("please input a little smaller.\n");
				scanf("%d", &guess);
			}
			else
			{
				printf("please input a little bigger.\n");
				scanf("%d", &guess);
			}
		}
		end = clock();
		b = time(NULL);
		printf("\1: It took you %6.3f seconds\n", var = (double)(end - start) / 18.2);
		printf("\1: it took you %6.3f seconds\n\n", difftime(b, a));
		if (var < 15)
			printf("\1\1 You are very clever! \1\1\n\n");
		else if (var < 25)
			printf("\1\1 you are normal! \1\1\n\n");
		else
			printf("\1\1 you are stupid! \1\1\n\n");
		printf("\1\1 Congradulations \1\1\n\n");
		printf("The number you guess is %d", i);
	}
	printf("\ndo you want to try it again?(\"yy\".or.\"n\")\n");
	if ((c = _getch()) == 'y')
		goto loop;
}

095 家庭财务管理小程序

题目: 家庭财务管理小程序

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <dos.h>
#include <time.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
void clrscr(void)
{
	CONSOLE_SCREEN_BUFFER_INFO    csbiInfo;
	HANDLE    hConsoleOut;
	COORD    Home = { 0,0 };
	DWORD    dummy;
	hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo);
	FillConsoleOutputCharacter(hConsoleOut, ' ', csbiInfo.dwSize.X * csbiInfo.dwSize.Y, Home, &dummy);
	csbiInfo.dwCursorPosition.X = 0;
	csbiInfo.dwCursorPosition.Y = 0;
	SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition);
}


void gotoxy(int x, int y)
{
	CONSOLE_SCREEN_BUFFER_INFO    csbiInfo;
	HANDLE    hConsoleOut;
	hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo);
	csbiInfo.dwCursorPosition.X = x;
	csbiInfo.dwCursorPosition.Y = y;
	SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition);
}

int main()
{
	FILE *fp;
	
	float sum, chm = 0.0;
	int len, i, j = 0;
	int c;
	char ch[4] = "", ch1[16] = "", chtime[12] = "", chshop[16], chmoney[8];
pp: clrscr();
	sum = 0.0;
	gotoxy(1, 1); printf("|---------------------------------------------------------------------------|");
	gotoxy(1, 2); printf("| money management system(C1.0) 2000.03 |");
	gotoxy(1, 3); printf("|---------------------------------------------------------------------------|");
	gotoxy(1, 4); printf("| -- money records -- | -- today cost list -- |");
	gotoxy(1, 5); printf("| ------------------------ |-------------------------------------|");
	gotoxy(1, 6); printf("| date: -------------- | |");
	gotoxy(1, 7); printf("| | | | |");
	gotoxy(1, 8); printf("| -------------- | |");
	gotoxy(1, 9); printf("| thgs: ------------------ | |");
	gotoxy(1, 10); printf("| | | | |");
	gotoxy(1, 11); printf("| ------------------ | |");
	gotoxy(1, 12); printf("| cost: ---------- | |");
	gotoxy(1, 13); printf("| | | | |");
	gotoxy(1, 14); printf("| ---------- | |");
	gotoxy(1, 15); printf("| | |");
	gotoxy(1, 16); printf("| | |");
	gotoxy(1, 17); printf("| | |");
	gotoxy(1, 18); printf("| | |");
	gotoxy(1, 19); printf("| | |");
	gotoxy(1, 20); printf("| | |");
	gotoxy(1, 21); printf("| | |");
	gotoxy(1, 22); printf("| | |");
	gotoxy(1, 23); printf("|---------------------------------------------------------------------------|");
	i = 0;

	for (;;)
	{
		time_t rawtime;
		struct tm * timeinfo = NULL;
		time(&rawtime);
		timeinfo = localtime(&rawtime);

		sprintf(chtime, "%4d.%02d.%02d %02d:%02d:%02d", timeinfo->tm_year + 1990, timeinfo->tm_mon, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
		timeinfo = NULL;

		gotoxy(3, 24); printf(" Tab __browse cost list Esc __quit");
		gotoxy(13, 10); printf(" ");
		gotoxy(13, 13); printf(" ");
		gotoxy(13, 7); printf("%s", chtime);
		j = 18;
		ch[0] = _getch();
		if (ch[0] == 27)
			break;
		strcpy(chshop, "");
		strcpy(chmoney, "");
		if (ch[0] == 9)
		{
		mm:i = 0;
			fp = fopen("home.dat", "r+");
			gotoxy(3, 24); printf(" ");
			gotoxy(6, 4); printf(" list records ");
			gotoxy(1, 5); printf("|-------------------------------------|");
			gotoxy(41, 4); printf(" ");
			gotoxy(41, 5); printf(" |");
			while (fscanf(fp, "%10s%14s%f\n", chtime, chshop, &chm) != EOF)
			{
				if (i == 36)
				{
					_getch();
					i = 0;
				}
				if ((i % 36) < 17)
				{
					gotoxy(4, 6 + i);
					printf(" ");
					gotoxy(4, 6 + i);
				}
				else
					if ((i % 36) > 16)
					{
						gotoxy(41, 4 + i - 17);
						printf(" ");
						gotoxy(42, 4 + i - 17);
					}
				i++;
				sum = sum + chm;
				printf("%10s %-14s %6.1f\n", chtime, chshop, chm);
			}
			gotoxy(1, 23); printf("|---------------------------------------------------------------------------|");
			gotoxy(1, 24); printf("| |");
			gotoxy(1, 25); printf("|---------------------------------------------------------------------------|");
			gotoxy(10, 24); printf("total is %8.1f$", sum);
			fclose(fp);
			gotoxy(49, 24); printf("press any key to....."); _getch(); goto pp;
		}
		else
		{
			while (ch[0] != '\r')
			{
				if (j < 10)
				{
					strncat(chtime, ch, 1);
					j++;
				}
				if (ch[0] == 8)
				{
					len = strlen(chtime) - 1;
					if (j > 15)
					{
						len = len + 1; j = 11;
					}
					strcpy(ch1, "");
					j = j - 2;
					strncat(ch1, chtime, len);
					strcpy(chtime, "");
					strncat(chtime, ch1, len - 1);
					gotoxy(13, 7); printf(" ");
				}
				gotoxy(13, 7); printf("%s", chtime); ch[0] = _getch();
				if (ch[0] == 9)
					goto mm;
				if (ch[0] == 27)
					exit(1);
			}
			gotoxy(3, 24); printf(" ");
			gotoxy(13, 10);
			j = 0;
			ch[0] = _getch();
			while (ch[0] != '\r')
			{
				if (j < 14)
				{
					strncat(chshop, ch, 1);
					j++;
				}
				if (ch[0] == 8)
				{
					len = strlen(chshop) - 1;
					strcpy(ch1, "");
					j = j - 2;
					strncat(ch1, chshop, len);
					strcpy(chshop, "");
					strncat(chshop, ch1, len - 1);
					gotoxy(13, 10); printf(" ");
				}
				gotoxy(13, 10); printf("%s", chshop); ch[0] = _getch();
			}
			gotoxy(13, 13);
			j = 0;
			ch[0] = _getch();
			while (ch[0] != '\r')
			{
				if (j < 6)
				{
					strncat(chmoney, ch, 1);
					j++;
				}
				if (ch[0] == 8)
				{
					len = strlen(chmoney) - 1;
					strcpy(ch1, "");
					j = j - 2;
					strncat(ch1, chmoney, len);
					strcpy(chmoney, "");
					strncat(chmoney, ch1, len - 1);
					gotoxy(13, 13); printf(" ");
				}
				gotoxy(13, 13); printf("%s", chmoney); ch[0] = _getch();
			}
			if ((strlen(chshop) == 0) || (strlen(chmoney) == 0))
				continue;
			if ((fp = fopen("home.dat", "a+")) != NULL);
			fprintf(fp, "%10s%14s%6s", chtime, chshop, chmoney);
			fputc('\n', fp);
			fclose(fp);
			i++;
			gotoxy(41, 5 + i);
			printf("%10s %-14s %-6s", chtime, chshop, chmoney);
		}
	}
	return 0;
}

096 计算字符串中子串出现的次数

题目: 计算字符串中子串出现的次数

程序源代码:

#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
	char str1[20], str2[20], *p1, *p2;
	int sum = 0;
	printf("please input two strings\n");
	scanf("%s%s", str1, str2);
	p1 = str1; p2 = str2;
	while (*p1 != '\0')
	{
		if (*p1 == *p2)
		{
			while (*p1 == *p2&&*p2 != '\0')
			{
				p1++;
				p2++;
			}
		}
		else
			p1++;
		if (*p2 == '\0')
			sum++;
		p2 = str2;
	}
	printf("%d", sum);
	_getch();
	return 0;
}

097 字符串输入文件直到#为止

题目: 从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。

程序源代码:

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

int main()
{
	FILE *fp;
	char filename[10];
	char ch;
	scanf("%s", filename);
	if ((fp = fopen(filename, "wt+")) == NULL) {
		printf("Cannot open file strike any key exit!");
		_getch();
		exit(1);
	}
	printf("input a string:\n");

	ch = getchar();			// 此语句用来接收在执行scanf语句时最后输入的回车符
	printf("请输入一个准备存储到磁盘的字符串(以#结束):");
	ch = getchar();			// 接收从键盘输入的第一个字符
	while (ch != '#')
	{
		fputc(ch, fp);		// 向磁盘文件输出一个字符
		putchar(ch);		// 将输出的字符显示在屏幕上
		ch = getchar();		// 再接收从键盘输入的一个字符 
	}
	fclose(fp);				// 关闭文件 
	putchar(10);            // 向屏幕输出一个换行符,换行符的ASCII代码为10
	return 0;
}

098 小写字母全部转换成大写字母输出到文件

题目: 从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以!结束。

程序源代码:

#define _CRT_SECURE_NO_WARNINGS

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

int main()
{
	FILE *fp;
	char ch, filename[10];
	printf("please input the name of the file:\n");
	scanf("%s", filename);
	if ((fp = fopen(filename, "w")) == NULL)
	{
		printf("can't open file!\n");
		exit(0);
	}
	ch = getchar();
	printf("please a string:\n");
	ch = getchar();
	if (ch >= 'a'&&ch <= 'z')
	{
		ch = ch - 32;
	}
	while (ch != '!')
	{
		fputc(ch, fp);
		putchar(ch);
		ch = getchar();
		if ('a' <= ch && ch <= 'z')
		{
			ch = ch - 32;
		}
	}
	fclose(fp);
	putchar(10);
	return 0;
}

099 合并两个文件到一个新文件

题目: 有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。

程序分析: 此处是要求字母,若要求合并文件内容,需要注意中文乱码问题。

程序源代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	FILE*fa, *fb, *fc;
	int i, j, k;
	char str[100], str1[100];
	char tem;
	if ((fa = fopen("A.txt", "r")) == NULL) // A.txt 文件需要存在
	{
		printf("error: cannot open A file!\n");
		exit(0);
	}
	fgets(str, 99, fa);
	fclose(fa);
	if ((fb = fopen("B.txt", "r")) == NULL)  // B.txt 文件需要存在
	{
		printf("error: cannot open B file!\n");
		exit(0);
	}
	fgets(str1, 100, fb);
	fclose(fb);
	strcat(str, str1);
	for (i = strlen(str) - 1; i > 1; i--)
		for (j = 0; j < i; j++)
			if (str[j] > str[j + 1])
			{
				tem = str[j];
				str[j] = str[j + 1];
				str[j + 1] = tem;
			}

	if ((fc = fopen("C.txt", "w")) == NULL)  // 合并为 C.txt
	{
		printf("error: cannot open C file!\n");
		exit(0);
	}
	fputs(str, fc);
	fclose(fc);
	system("pause");
	return 0;
}

100 学生信息写入文件

题目: 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中。

程序源代码:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct {
	int ID;
	int math;
	int English;
	int C;
	int avargrade;
	char name[20];
}Stu;
int main()
{
	FILE*fp;
	Stu stu[5];
	int i, avargrade = 0;
	printf("请输入5个同学的信息:学生号,姓名,3门成绩:\n");
	for (i = 0; i < 5; i++)
	{
		printf("请输入第%d个同学的信息:学生号,姓名,3门成绩:\n",i+1);
		scanf("%d %s %d %d %d", &(stu[i].ID), stu[i].name, &(stu[i].math), &(stu[i].English), &(stu[i].C));
		stu[i].avargrade = (stu[i].math + stu[i].English + stu[i].C) / 3;
	}

	if ((fp = fopen("stud", "w")) == NULL)
	{
		printf("error :cannot open file!\n");
		exit(0);
	}
	for (i = 0; i < 5; i++)
		fprintf(fp, "%d %s %d %d %d %d\n", stu[i].ID, stu[i].name, stu[i].math, stu[i].English,
			stu[i].C, stu[i].avargrade);

	fclose(fp);
	system("pause");
	return 0;
}
  • 5
    点赞
  • 25
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

bostonAlen

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值