文章目录
原题出处
文章目录
前言
3月10号开始准备蓝桥杯,4月13号比赛,仅有C语言语法基础。在此分享学习记录,于君共勉之。
目前第一阶段,结合所学,刷杭电oj基础100题,预计时间:一周。
p2000 ASCII码排序
问题描述
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
输入:
输入数据有多组,每组占一行,有三个字符组成,之间无空格。
输出:
对于每组输入数据,输出一行,字符中间用一个空格分开。
样本输入:
qwe
asd
zxc
示例输出:
e q w
a d s
c x z
解题思路
1.排序问题,首先想到经典冒泡排序
2.多组输入,用循环实现
代码1
int main()
{
char a = 0, b = 0, c = 0, t = 0;
while (scanf(" %c%c%c", &a, &b, &c) != EOF)//EOF是文件结束的标志
{
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("%c %c %c\n", a, b, c);
}
return 0;
}
重点
%c前加空格。
因为%c每次仅读取一个字符(包括enter(回车)、‘\n’、tap(水平制表符)等。)输入第一组数据后需要回车,回车键放入了键盘缓冲区,第二个%c读取的是回车键,导致输出混乱。
代码2
int main()
{
char a = 0, b = 0, c = 0, t = 0;
while (scanf("%c%c%c", &a, &b, &c) != EOF)
{
char c_tmp;
while ((c_tmp = getchar() != '\n') && c_tmp != EOF);//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("%c %c %c\n", a, b, c);
}
return 0;
}
重点
char c_tmp;
while ((c_tmp = getchar() != ‘\n’) && c_tmp != EOF);
C语言基本语法,作用是清空缓存区。
p2001 计算两点间的距离
问题描述
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
输入:
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
输出:
对于每组输入数据,输出一行,结果保留两位小数。
样本输入:
0 0 0 1
0 1 1 0
示例输出:
1.00
1.41
解题思路
简单的计算,联想到两点间的距离公式
代码
int main()
{
double x1, x2, y1, y2, a;
while (scanf("%lf %lf %lf %lf", &x1, &y1, &x2, &y2) != EOF)
{
a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
printf("%.2lf", a);
}
return 0;
p2002 计算球体积
问题描述
根据输入的半径值,计算球的体积。
输入:
输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。
输出:
输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。
样本输入:
1
1.5
示例输出:
4.189
14.137
解题思路
v = 3/4 * pi * pow(r, 3)
代码
int main()
{
const double pi = acos(-1.0);
double r, v;
while (scanf("%lf", &r) != EOF)
{
v = 4 / 3.0 * pi * pow(r, 3);
printf("%.3lf", v);
}
return 0;
}
重点
1.用关键字const声明常量pi
2.acos(-1)是数学上的反余弦函数,值=Π
3.C 库函数 double pow(double x, double y) 返回 x 的 y 次幂
p2003 求绝对值
问题描述
求实数的绝对值。
输入:
输入数据有多组,每组占一行,每行包含一个实数。
输出:
对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。
样本输入:
123
-234.00
示例输出:
123.00
234.00
解题思路
绝对值:分类讨论。
代码
int main()
{
double a;
while (scanf("%lf", &a) != EOF)
{
if (a > 0)
printf("%.2lf", a);
else
printf("%.2lf", -a);
}
return 0;
}
扩展
abs()函数
Y = abs(X) 返回数组 X 中每个元素的绝对值。如果 X 是复数,则 abs(X) 返回复数的模。
p2004 成绩转换
问题描述
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
输入:
输入数据有多组,每组占一行,由一个整数组成。
输出:
对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
样本输入:
56
67
100
123
示例输出:
E
D
A
Score is error!
解题思路
简单运用选择语句
代码
int main() {
int score;
char grade;
while (scanf("%d", &score)!=EOF)
{
if (score < 0 || score>100)
printf("Score is error!\n");
else
{
switch (score / 10) {
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break;
default:
grade = 'E';
break;
}
printf("%c\n", grade);
}
}
return 0;
}
重点
抓住全局变量和局部变量
p2005 第几天
问题描述
给定一个日期,输出这个日期是该年的第几天。
输入:
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
输出:
对于每组输入数据,输出一行,表示该日期是该年的第几天。
样本输入:
1985/1/20
2006/3/12
示例输出:
20
71
解题思路
1.用数组,将各月份的天数存入数组
2.计算前几个月的天数
3.判断闰年,再加减。
代码
int main()
{
int a, b, c, i, days = 0;
int day[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
while (~scanf("%d/%d/%d", &a, &b, &c))
{
for (i = 1; i <= b - 1; i++)
days += day[i];
if (a % 400 == 0 || (a % 4 == 0 && a % 100 != 0))
{
if (b > 2)
days += 1;
}
days += c;
printf("%d", days);
}
return 0;
}
扩展
~scanf()读到输入结尾时循环也结束。
p2006 求奇数的乘积
额,忘写了,下次再补吧!
p2007 平方和与立方和
问题描述
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
输入:
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。
输出:
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。
样本输入:
1 3
2 5
示例输出:
4 28
20 152
解题思路
1.根据样例输入与输出理解题目意思
2.自然想到需要循环、分类;
代码
int main()
{
int m, n, x = 0, y = 0, i;
scanf("%d %d", &m, &n);
for (i = m; i <= n; i++)
{
if (i % 2 == 0)
x += pow(i, 2);
else
y += pow(i, 3);
}
printf("%d %d", x, y);
return 0;
}
p2008 数值统计
问题描述
统计给定的n个数中,负数、零和正数的个数。
输入:
输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。
输出:
对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。
样本输入:
6 0 1 2 3 -1 0
5 1 2 3 4 0.5
0
示例输出:
1 2 3
0 0 5
解题思路
简答选择语句判断正负
代码
int main()
{
double x;
int n, i;
while (scanf("%d", &n) != EOF)
{
int a = 0, b = 0, c = 0;
for (i = 1; i <= n; i++)//==》while(n--)
{
scanf("%lf", &x);
if (x < 0)
a++;
if (x == 0)//粗心,==写成=
b++;
if (x > 0)
c++;
}
printf("%d %d %d", a, b, c);//粗心,将printf放在外面
}
return 0;
}
p2009 求数列的和
问题描述
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
输入:
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
输出:
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
样本输入:
81 4
2 2
示例输出:
94.73
3.41
解题思路
读懂题目,直接用循环作答
代码
int main()
{
int m, i;
double n;
while (~scanf("%lf%d", &n,&m))//注意要改就改全套;
{
double count = 0.0;
for (i = 1; i <= m; i++)
{
//count += sqrt(n);一直重置n,没有改变下一项
count += n;
n = sqrt(n);
}
printf("%.2lf", count);
}
return 0;
}