提示
- 整数值用%d输出,实数用%f输出。
- 整数/整数=整数, 浮点数/浮点数=浮点数
- scanf中的占位符和变量的数据类型应一一对应,且每个变量前需加"&"符号。
- 在算法竞赛中,输入前不需要打印提示信息。输入完毕后应立即终止程序,不要等待用户按键,因为输入输出过程都是自动的,没有人工干预。
- 在算法竞赛中不要使用头文件conio.h,包括getch(), clrscr()等函数
- 在算法竞赛中,每行输出均应以回车符结束,包括最后一行。除非特别说明,每行的行首不应有空格,但行末通常可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。
- 尽量用const关键字声明常数。
- 赋值是个动作,先计算右边的值,在赋给左边的值,覆盖它原来的值。
- printf的格式字符串中可以包含其他可打印字符,打印时原样输出。
- 算法竞赛的题目应当是严密的,各种情况下的输出均应有严格规定。如果在比赛发现题目有漏洞,应向相关人员询问,尽量不要自己随意假定。
- 赋值a = b之后,变量a原来的值被覆盖,而b的值不变。
- 可以通过手工模拟的方法理解程序的执行方式,重点在于记录每条语句的执行之后的每个变量的值。
- 交换两个变量的三变量法适用范围更广,推荐使用。
- 算法竞赛是在比谁能更好地解决问题,而不是在比谁写的程序看上去更高级。
- if语句的基本格式为:if(条件) 语句1; else 语句2;
- if语句的条件是一个逻辑表达式,它的值可能为真,也可能为假。单个整数值也可以表示真假,其中0为假,其他值为真。
- C语言中的逻辑运算符都是短路运算符。一旦能够确定整个表达式的值,就不再继续计算。
- 算法竞赛的目标是编程对任意输入均得到正确的结果,而不仅是样例数据。
- 如果有多个并列,情况不交叉的条件需要一一处理,可以用else if语句。
- 适当在程序中编写注释不仅能让其他用户更快的搞懂你的程序,还能帮你自己理清思路。
- 可以用花括号把若干个语句组合成一个整体。这些语句仍然按照顺序执行。
算术表达式
程序1-1 计算并输出1+2的值
#include <stdio.h>
int main()
{
printf("%d\n", 1+2);
return 0;
}
实验1
#include <stdio.h>
int main()
{
printf("%d\n", 3-4);
return 0;
}
实验2
#include <stdio.h>
int main()
{
printf("%d\n", 5*6);
return 0;
}
实验3
#include <stdio.h>
int main()
{
printf("%d\n", 8/4);
return 0;
}
实验4
#include <stdio.h>
int main()
{
printf("%d\n", 8/5);
return 0;
}
程序1-2 计算并输出8/5的值,保留小数点后一位
#include <stdio.h>
int main()
{
printf("%.1f\n", 8.0/5.0);
// printf("%.1f\n", 8/5);
return 0;
}
实验5
#include <stdio.h>
int main()
{
printf("%.1f\n", 8.0/5.0);
printf("%.2f\n", 8.0/5.0);
printf("%f\n", 8.0/5.0);
return 0;
}
默认为六位小数,小数点后的数字表示小数位数。
实验6
#include <stdio.h>
int main()
{
printf("%.1f\n", 8/5);
return 0;
}
warning: format '%f' expects argument of type 'double', but argument 2 has type 'int' [-Wformat=]|
实验7
#include <stdio.h>
int main()
{
printf("%d\n", 8.0/5.0);
return 0;
}
warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=]|
程序1-3 复杂的表达式计算
#include <stdio.h>
#include <math.h>
int main()
{
printf("%.8f\n",1+2*sqrt(3)/(5-0.1));
return 0;
}
变量及其输入
程序1-4 a+b问题
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", a+b);
return 0;
}
程序1-5 圆柱体的表面积
要求输入底面半径r和高h,输出圆柱体的表面积,保留三位小数
#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;
}
顺序结构程序设计
程序1-6 三位数反转(1)
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
printf("%d%d%d\n", n%10, n/10%10, n/100);
return 0;
}
问题:如果个位是0,Ex:520,反转后如何输出?
程序1-7 三位数反转(2)
#include <stdio.h>
int main()
{
int n, m;
scanf("%d", &n);
m = (n%10)*100 + (n/10%10)*10 + (n/100);
//输出三位整数,不足位的用0补全
printf("%03d\n", m);
return 0;
}
程序1-8 交换变量(1)
#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;
}
程序1-9 变量交换(2)
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
a = a+b;
b = a-b;
a = a-b;
printf("%d %d\n", a, b);
return 0;
}
程序1-10 变量交换(3)
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d %d\n", b, a);
return 0;
}
并没有实际改变a,b的值。
分支结构程序设计
程序1-11 鸡兔同笼
分析:联立a+b=n, 2a+4b=m, 解得a=(4n-m)/2,b=n-a,
a,b均为整数且非负
可通过if(m%2 == 1 || a<0 || b<0)
限定
#include <stdio.h>
int main()
{
// a--鸡的数量 b--兔的数量
// m-- 头 n-- 脚
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!");
}else{
printf("%d %d\n", a, b);
}
return 0;
}
程序1-14 三整数排序(1)
#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;} //确保a<=b
if(a>c) {t = a; a = c; c = t;} //确保a<=c
if(b>c) {t = b; b = c; c = t;} //确保b<=c
// 以上运算结束后有a<=b<=c
printf("%d %d %d\n", a, b, c);
return 0;
}
注解与习题
数据类型实验
#include <stdio.h>
#include <math.h>
int main()
{
// 32位整型的范围是-2^31~2^31-1
printf("%d\n", 11111*11111);
// 溢出
// warning: integer overflow in expression [-Woverflow]|
printf("%d\n", 111111*111111);
printf("%d\n", 111111111*111111111);
// 换成浮点数
printf("%f\n", 11111.0*11111);
printf("%f\n", 111111.0*111111.0);
printf("%f\n", 111111111.0*111111111);
//warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=]|
printf("%d\n", sqrt(-10));
printf("%f\n", sqrt(-10));
// warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=]|
printf("%d\n", 1.0/0.0);
// 不会报错
printf("%f\n", 1.0/0.0);
// printf("");
// warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=]
printf("%d\n", 0.0/0.0);
// 不会报错
printf("%f\n", 0.0/0.0);
// warning: division by zero [-Wdiv-by-zero]
printf("%d\n", 1/0);
return 0;
}
输入格式实验
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
return 0;
}
- 在同一行中输入12和2,并以空格分隔,达到预期效果
-
在不同的两行输入12, 2
-
在实验B1和实验B2中在B1和B2的前面和后面加入大量的空格和制表符
把2换成字符s
相关资料
printf 格式化输出符号详细说明
习题1-1
输入三个整数,输出它们的平均值,保留三位小数
#include <stdio.h>
int main()
{
int a;
int b;
int c;
scanf("%d%d%d", &a, &b, &c);
double average = (a+b+c)/3.0;
printf("%.3f\n", average);
return 0;
}
习题 1-2
输入华氏温度f,输出对应的摄氏温度c,保留三位小数,c=5(f-32)/9
#include <stdio.h>
int main()
{
double f = 0.0;
scanf("%lf", &f);
double c = 5*(f-32)/9;
printf("%.3f\n", c);
return 0;
}
习题1-3 连续和
输入正整数n,输出1+2+3+...+n的值
分析:直接套用等差数列公式
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", n*(n+1)/2);
return 0;
}
习题1-4 正弦和余弦
#include <stdio.h>
#include <math.h>
int main()
{
// 定义pi的值
const double PI = acos(-1.0);
int n = 0;
scanf("%d", &n);
// 数学函数使用弧度
printf("%.3f\n%.3f\n", sin(n/180.0*PI), cos(n/180.0*PI));
return 0;
}
习题1-5 打折
#include <stdio.h>
int main()
{
// 单件衣服价格
const int PRICE = 95;
// 购买衣服的件数
int n = 0;
scanf("%d", &n);
double sum = (double)(PRICE * n);
if(sum>300)
{
sum *= 0.85;
}
printf("%.2f\n", sum);
return 0;
}
习题1-6 三角形
输入三角形三条边的长度值(正整数)判断是否能成为直角三角形
yes -- no
not a triangle
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
// 可以构成三角形的条件
if(a+b>c && a+c>b && b+c>a){
// 判断直角三角形
if(a*a + b*b == c*c || a*a+ c*c == b*b || b*b+c*c == a*a){
printf("yes\n");
}
else{
printf("no\n");
}
}
else{
printf("Not a triangle\n");
}
return 0;
}
习题1-7 年份
四年一闰,百年不闰,四百年再闰
if((n%4 == 0 && n%100 != 0) || n %400 == 0)
#include <stdio.h>
int main()
{
int year;
scanf("%d", &year);
if((year%4==0 && year%100!=0) || year%400==0){
printf("yes\n");
}
else{
printf("no\n");
}
return 0;
}