第01章 程序设计入门

第一章 程序设计入门

学习要求和笔记:

√  熟悉C程序的编译和运行

√  学会编程计算并输出常见的算术表达式的结果

√  掌握整数和浮点数的含义和输出方法、声明和读入方法

√  掌握数学函数的使用方法

√  初步了解变量的含义

》尽量用const关键字声明常数

√  掌握变量交换的三变量法

√ 理解算法竞赛中的程序三步曲:输入、计算、输出

√ 记住算法竞赛的目标及对程序的要求

》在算法竞赛中,输入前不要打印任何提示信息,例如Please input n: 这样会被当做输出数据的一部分

》在算法竞赛中不要使用头文件conio.h,包括getch(),clrscr()等函数

例题学习记录和源代码:

√  Example1-1 圆柱的表面积

√  Example1-2 三位数反转

√  Example1-3 交换变量

》中间变量法

》非中间变量法

》a^=b^=a^=b

√  Example1-4 鸡兔同笼

√  Example1-5 三整数排序

习题学习记录和源代码:

√  Exercise1-1 平均数

√  Exercise1-2 温度

√  Exercise1-3 连续和

√  Exercise1-4 正弦和余弦

√  Exercise1-5 打折

√  Exercise1-6 三角形

√  Exercise1-7 年份

√ Thinking 1-1 计算int型整数的最小值和最大值

//Example1-1 圆柱的表面积:

/**
 * 题目名称:圆柱体的表面积
 * 题目描述:输入底面积半径为r和高h,输出圆柱体的表面积,保留3位小数
 * 样例输入:3.5 9
 * 样例输出:Area = 274.889
 **/

/**学习笔记
 * pi的定义方法double pi = acos(-1.0)
 * double型输入要记得%lf;
 * s = s1*2.0 + s2 要记得把2写成2.0
 **/


#include <stdio.h>
#include <math.h>
int main()
{
	const double pi = acos(-1.0);
	double r, h, s1, s2, s;
	scanf("%lf%lf", &r, &h);
	s1 = pi*r*r;
	s2 = 2*pi*r*h;
	s = s1*2.0 + s2;
	printf("Area = %.3f\n", s);
	return 0;
}

//Example1-2 三位数反转:

/**
 * 题目名称:三位数反转
 * 题目描述:输入一个三位数,分离出它的百位、十位、个位,反转后输出
 * 样例输入:127
 * 样例输出:721
 **/

/**学习笔记
 * 三位数读入变量中,之后分离,百位为n/100,十位为n/10%10,个位为n%10
 * 如果个位数为0时,反转时候就出现第一个数字是0了,这个时候得看清题目
 * printf("%03d\n", m) 不够三位则右对齐,前面加0,如果想要输出字符"%"应该再格式控制字符串连续用两个%表示,printf("%f%%", 1.0/3) 输出0.333333%
 * printf("%d%d%d\n", n%10, n/10%10, n/100);单个分离输出也是一种新的思路
 **/

#include <stdio.h>
int main()
{
	int n,m;
	scanf("%d", &n);
	m = (n%10)*100 + (n/10%10)*10 + (n/100);
	printf("%03d\n", m);
	return 0;
}


//Example1-3 交换变量1间变量法:

/**
 * 题目名称:交换变量
 * 题目描述:输入两个整数a和b,交换两者的值,之后输出
 * 样例输入:824 16
 * 样例输出:16 824
 **/

/**学习笔记
 * 三变量法:比喻成将一瓶酱油和一瓶醋借助一个空瓶子来进行交换
 **/

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

//.cpp
#include <iostream>
using namespace std;
int main()
{
	int a,b,t;
	cin >> a >> b;
	t = a;
	a = b;
	b = t;
	cout << a << b << endl;
	return 0;
}

//Example1-3 交换变量1非中间变量法:

/**
 * 题目名称:交换变量
 * 题目描述:输入两个整数a和b,交换两者的值,之后输出
 * 样例输入:824 16
 * 样例输出:16 824
 **/

/**学习笔记
 * 非三变量法:可以比喻成将硬着头皮把醋倒在酱油瓶子里,之后再分离出酱油倒回醋瓶子
 * 过程:假定输入a0和b0,
 * 执行完a = a + b后:a = a0 + b0, b = b0;
 * 执行完b = a - b后:a = a0 + b0, b = a0;
 * 执行完a = a - b后:a = b0, b = a0;
 **/

#include <stdio.h> 
int main()
{
	int a, b, t;
	scanf("%d%d", &a, &b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("%d %d\n",a,b);
	return 0;
}

//.cpp
#include <iostream>
using namespace std;
int main()
{
	int a,b,t;
	cin >> a >> b;
	a = a + b;
	b = a - b;
	a = a - b;
	cout << a << b << endl;
	return 0;
}

//Example1-4 鸡兔同笼:

/**
 * 题目名称:鸡兔同笼
 * 题目描述:已知鸡和兔的总数量为n,总腿数为m。输入n和m依次输出鸡的数目和兔的数目。  如果无解,则输出 No answer
 * 样例输入: 14 32 
 * 样例输出: 12 2 
 * 样例输入: 10 16 
 * 样例输出: No answer 
 **/

/**学习笔记与题目分析
 * 题目分析: 
 *     此题可以理解为解二元一次方程的数学题,鸡的数目为a, 兔的数目为b。 
 * 则: 4*b+2*a= m, a+b=n,解得:a=(4n-m)/2, b=n-a. 
 * 此外:考虑无解的情况,1:总腿数需要满足为偶数,2:鸡兔数目为正数。 
 **/ 

#include <stdio.h>
int main()
{
	int a,b,n,m;
	scanf("%d%d", &n, &m);
	a = (4*n - m)/2;
	b = n - a;
	if(m % 2 == 1 || a < 0 || b < 0)
		printf("No answer\n");
	else
		printf("%d %d\n", a, b);
	return 0;
}


//.cpp
#include <iostream>
using namespace std;
int main()
{
	int a,b,n,m;
	while(cin >> n >> m)
	{
		int a,b;
		a = (4*n - m)/2;
		b = n - a;
		if(m % 2 == 1 || a < 0 || b < 0)
		cout << "No answer" << endl;
		else
		cout << a << " " << b << endl;
	}
		return 0;
}

//Example1-5 三整数排序情况列举法:

/** 
 * 题目名称:三整数排序 
 * 题目描述:输入3个整数,从小到大排序后输出。 
 * 样例输入:26 78 12 
 * 样例输出:12 26 78 
 **/

/**学习笔记与题目分析
 * 如果有多个并列、情况不交叉的条件需要一一处理,可以用else if语句。
 * 题目分析: 
 * 排序方法,逐情况列举,这种方法有点笨,不过也是很容易想出的方法。 
 * 如果有三个整数,那么,它就会有3*2*1+1种情况, 
 * 第一个数可取3种情况,最大,最小,中等。 
 * 那么第二个数就是,剩下的2种情况。 
 * 第三个数,没有其它可选,剩下1种情况。 
 **/  

#include <stdio.h>

int main()
{
	int a,b,c;
	scanf("%d%d%d", &a, &b, &c);
	if(a <= b && b <= c) printf("%d %d %d\n", a, b, c);
	else if(a <= c && c <= b) printf("%d %d %d\n", a, c, b);
	else if(b <= c && c <= a) printf("%d %d %d\n", b, c, a);
	else if(b <= a && a <= c) printf("%d %d %d\n", b, a, c);
	else if(c <= a && a <= b) printf("%d %d %d\n", c, a, b);
	else if(c <= b && b <= a) printf("%d %d %d\n", c, b, a);
	return 0;
}

//Example1-5 三整数排序比较交换法:

/** 
 * 题目名称:三整数排序 
 * 题目描述:输入3个整数,从小到大排序后输出。 
 * 样例输入:26 78 12 
 * 样例输出:12 26 78 
 **/

/**学习笔记与题目分析
 * 题目分析: 
 * 排序方法,比较交换法
 * 首先检查a和b的值,如果a>b,则交换a和b(利用前面说的三变量交换法)
 * 之后检查a和c,同理交换法
 * 最后检查b和c
 **/ 

//.cpp
#include <iostream>

using namespace std;

int main()
{
	int a,b,c,t;
	cin >> a >> b >> c;
	if(a > b) {t = a; a = b; b = t;}
	if(a > c) {t = a; a = c; c = t;}
	if(b > c) {t = b; b = c; c = t;}
	cout << a << " " << b << " " << c << endl;
	return 0;
}

//.c
#include <stdio.h>

int main()
{
	int a,b,c,t;
	scanf("%d%d%d", &a, &b, &c);
	if(a > b) {t = a; a = b; b = t;}
	if(a > c) {t = a; a = c; c = t;}
	if(b > c) {t = b; b = c; c = t;}
	printf("%d %d %d\n", a, b, c);
	return 0;

}

// Exercise1-1 平均数(average)
  
/** 
 * 题目要求:输入3个整数,输出它们的平均值,保留3位小数。
 * 学习笔记:c中可以采用printf("%.3f", data);来保留小数点位数;
 * 在C++中需要用格式控制符或者成员函数precision,格式控制符需要加上头文件#include<iomanip>
 * 格式控制符setprecision(n) 设置显示小数精度为n位,setiosflags(ios::fixed) 固定的浮点显示搭配使用
 * C语言中输入输出double要用lf 
 **/

//.cpp
#include <iostream>
#include <iomanip>

using namespace std;
int main()
{
	double a,b,c;
	cin >> a >> b >> c;
	cout << setiosflags(ios::fixed) << setprecision(3) << (a + b + c)/3 << endl;
	return 0;
}

//.c
#include <stdio.h>

int main()
{
	double a, b, c;
	scanf("%lf%lf%lf", &a, &b, &c);
	printf("%.3f\n", (a + b + c)/3); //这里需要注意一个小细节,就是实际上这里应该左对齐的,变成%-.3f
	return 0;
}

// Exercise1-2 温度(temperature) 
  
/** 
 * 题目要求:输入华氏温度f,输出对应的摄氏温度c,保留3位小数。 
 * 提示:c = 5 * (f - 32) / 9; 
 **/  

//.cpp
/*
#include <iostream>
#include <iomanip>

using namespace std;
int main()
{
	double f;
	cin >> f;
	cout << setiosflags(ios::fixed) << setprecision(3) << 5 * (f - 32) /9 << endl;
	return 0;
}
*/
//.c
#include <stdio.h>

int main()
{
	double f;
	scanf("%lf", &f);
	printf("%.3lf\n", 5 * (f - 32) /9);
	return 0;
}

// Exercise1-3 连续和(sum)
/** 
 * 题目要求:输入正整数n,输出 1+2+...+n的值。 
 * 题目分析:可以采用循环来处理,也可以利用数学知识n*(n+1)/2来直接计算
 * 学习笔记,这里要防止溢出了,所以用long long型
 **/

//.cpp
#include <iostream>

using namespace std;

int main()
{
	long long n;
	cin >> n;
	cout << n*(n+1)/2 << endl;
	return 0;
}

//.c
#include <stdio.h>

int main()
{
	long long n;
	scanf("%d", &n);
	printf("%d\n", n*(n+1)/2);
	return 0;
}

// Exercise1-4_正弦和余弦(sincos) 
  
/** 
 * 题目要求:输入正整数n(n<360),输出n度的正弦、余弦函数值。 
 * 学习笔记:sin,cos可以调用数学函数,但必须记得头文件#include<cmath.h>;math.h是C语言的头文件。
 * 其实在C++中用math.h也是可以的,C++是兼容C的。
 * 或者命名const double pi = acos(-1.0) 之后再把角度转换为n/180.0 * pi
 **/


//.cpp
#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	double n;
	const double pi = acos(-1.0);
	cin >> n;
	cout << sin(n/180*pi) << " " << cos(n/180*pi) << endl;
	return 0;
}

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

int main()
{
	double n;
	scanf("%lf", &n);
	const double pi = acos(-1.0);
	printf("%lf %lf\n", sin(n/180*pi),cos(n/180*pi));
	return 0;
}

// Exercise1-5_打折(discount).cpp  
  
/** 
 * 题目要求:一件衣服95元,若消费满300元,可打八五折。 
 * 输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。 
 **/ 
/*
//.cpp
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
	const double singleConsume = 95.0;
	const double discount = 0.85;
	const double sumConsume = 300.0;

	double number;
	cin >> number;
	double sum = number * singleConsume;
	if(sumConsume < sum)
	{
		sum *= discount;
	}
	cout << setiosflags(ios::fixed) << setprecision(2) << sum << endl;
	return 0;
}
*/

//.c
#include <stdio.h>

int main()
{
	const double singleConsume = 95.0;
	const double discount = 0.85;
	const double sumConsume = 300.0;

	double number;
	scanf("%lf", &number);
	double sum = number * singleConsume;
	if(sumConsume < sum)
	{
		sum *= discount;
	}
	printf("%-.2f\n", sum);
	return 0;
}

// Exercise1-6 三角形(triangle).cpp  
  
/** 
 * 题目要求:输入三角形三边长度值(均为正整数),判断它是否能为直角三角形的三个边长。 
 * 如果可以,则输出“yes”,如果不能,则输出“no”。 
 * 如果根本无法构成三角形,则输出“not a triangle”。 
 **/  
  
/** 
 * 题目分析: 
 * 对于这题,可以先判断是否三角形,然后再进行下一步的判断,判断是否能构成直接三角形。 
 * 判断三角形:两边之和大于第三边即可判断。 
 * 判断是否直角三角形:可以用勾股定理,不过前提得先利用交换的思想判断出最大边是哪一条。 
 **/  
/*
//.cpp
#include<iostream>

using namespace std;
int main()
{
	int a,b,c;
	cin >> a >> b >> c;
	if(a > b + c || b > a + c || c > a + b)
		cout << "not a triangle" << endl;

	int t;
	if(a > b) {t = a; a = b; b = t;}
	if(a > c) {t = a; a = c; c = t;}
	if(b > c) {t = b; b = c; c = t;}

	if(c*c == a*a + b*b)
		cout << "yes" << endl;
	else
		cout << "no" << endl;
	return 0;
}
*/

//.c
#include<stdio.h>

int main()
{
	int a,b,c;
	scanf("%d%d%d", &a, &b, &c);
	if(a > b + c || b > a + c || c > a + b)
		printf("not a triangle");

	int t;
	if(a > b) {t = a; a = b; b = t;}
	if(a > c) {t = a; a = c; c = t;}
	if(b > c) {t = b; b = c; c = t;}

	if(c*c == a*a + b*b)
		printf("yes");
	else
		printf("no");
	return 0;
}

// Exercise1-7 闰年(leapYear).cpp  
  
/** 
 * 题目要求:输入年份,判断是否闰年。 
 * 如果是,则输出“yes”,否则输出“no”。 
 **/  
  
/** 
 * 题目分析:首先得知道常识是:平年365天,闰年366天。 
 * 计算方法:公历闰年的精确计算方法(按一回归年365天5小时48分45.5秒)    
 * ① 普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年) 
 * ② 世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)    

 * 程序编写思路:  
 * ① 再判断数值是否满足第2个条件(世纪年),判断是否闰年。 
 * ② 最后使用普通年的判断方法以判断是否闰年。 
 **/  
/*
//.cpp
#include<iostream>
using namespace std;

int main()
{
	int n;
	cin >> n;
	if(n % 400 == 0)
		cout << "yes" << endl;
	else if(n % 4 == 0 && n % 100 != 0)
		cout << "yes" << endl;
	else
		cout << "no" << endl;
	return 0;

}
*/

//.c
#include <stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	if(n % 400 == 0)
		printf("yes\n");
	else if(n % 4 == 0 && n % 100 != 0)
		printf("yes\n");
	else if
		printf("no\n");
	return 0;

}

// Thinking1-1 计算int型整数的最小值和最大值.cpp  
  
/** 
 * 计算方法: 
 * 最小值:当int型的数据到了最小值时,然后再减1(即越界时),它会变成正数, 
 * 如果此时再将此数值加1,就可以知道这最小值是多少了。 
 * 最大值:同理,当int型的数据到了最大值时,然后再加1(即越界时),它会变成负数, 
 * 如果此时再将此数值减1,就可以知道这最大值是多少了。
 * 运行结果:-2147483648 2147483647
 **/ 


//.cpp
#include <iostream>
using namespace std;

int int_min()
{
	int n = 0;
	while(n <= 0)
	{
		n--; 
	}
	n++;
	return n;
}

int int_max()
{
	int n = 0;
	while(n >= 0)
	{
		n++;
	}
	n--;
	return n;
}

int main()
{
	int min=0,max=0;
	cout << int_min() << " " << int_max() << endl;
	return 0;
}

                                                                                                                                                                                ——To_捭阖_youth  2014.6.27

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值