❤️学姐教你 10 道题搞定 c 语言❤️(推荐收藏)
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️学姐教你 10 道题搞定 c 语言❤️(推荐收藏)相关的知识,希望对你有一定的参考价值。
一、前言
本文适合对 c c c 语言感兴趣的初学者,文字浅显易懂,没有太多晦涩的言语,也是作者的亲(瞎)身(编)经(乱)历(造),希望对刚入大学,想在程序方面有所建树的有志青年有所帮助。
当然, c c c 语言大佬也可以当成是茶余饭后的调味剂前来消遣,作者在此不做阻止。
二、追忆前尘
- 我刚进入大学的时候,那时候学
c
c
c 语言,全靠有一位学姐带我。
- 可惜由于年代太过久远,她的样子我早已记不得了。
- 咦?
- 前面那位女子好像就是我的学姐!!!
- 额!那个那个… 学姐你不要东张西望了,我在这里……
- em……,可能这么多年过去不认识我了,不过,这不重要!
- 那一年,她告诉我只要做完她的这 10 道题,
c
c
c 语言就算入门了。
- 于是我开始了我的切题生涯,不知不觉切到了 100 题。
- 然后,我发现我爱上了切题,陆陆续续的切,当我切到 1000 题的时候,学姐毕业了,由于我沉迷切题,早就把她 抛之脑后 了。
- 但是,依稀回想起当年她带我的情景,还是意犹未尽……
- 当年的往事如泉涌般涌上心头,恍如隔世……
- 此时,突然耳边传来她的声音……
三、初出茅庐
第一题
- 当时的我是 零基础,也没有上过课,所以学姐说的第一个词我就已经懵逼了。
- INOUT ??? OUTPUT ???
- 于是,这就成了我有生以来做的第一个题:
【例题1】给定 A 和 B , 输出 A 和 B 的和。
- 经过 两个小时 的研究,终于做出来了,代码长这样:
#include <stdio.h> // (1)
int main() {
int a, b;
while ( scanf("%d %d", &a, &b) != EOF) { // (2)
printf("%d\\n", a + b); // (3)
};
return 0;
}
- 1)
stdio.h
是最基本的头文件,需要用到的一些输入输出的函数都是在这里声明的,所以需要把它包含进来; - 2)
scanf
就是输入函数,因为计算机不知道你要输入的是数字还是字符串还是别的什么东西,所以需要规定输入的格式化类型,%d
代表整数,%f
代表小数,%s
代表字符串等等;因为计算机不知道什么时候结束输入,所以还有个返回值来告诉你不需要再输入了,即如果返回EOF
,代表不会再有输入了。这里的EOF
其实就是个数字,值为 -1; - 3)
printf
就是输出函数,这里就是把a + b
的值通过给定的格式输出出来;
- 然后,她开始教我一些简单的语句,例如:分支,循环 等等。
第二题
- 学姐突然说了一堆很奇怪的话,我感觉她在侮辱我!
- 后来一问,才知道,原来这是第二道题。
【例题2】输入一个百分制的成绩 t t t,将其转换成对应的等级,具体转换规则如下:90 ~ 100为 A; 80 ~ 89为 B; 70 ~ 79为 C; 60 ~ 69为 D; 0 ~ 59为 E;
- 查了一下 c 语言课本,发现可以用 i f e l s e if \\ else if else 来做,于是我就开始敲代码,两个小时过去后,代码长这样:
#include <stdio.h>
int main() {
int v;
while (scanf("%d", &v) != EOF) {
if (v < 0 || v > 100) {
printf("Score is error!\\n"); // (1)
}
else {
if (v >= 0 && v <= 59) {
printf("E\\n"); // (2)
}
else if (v == 100) {
printf("A\\n"); // (3)
}
else{ // (4)
char c = 'D' - (v - 60) / 10;
printf("%c\\n", c);
}
}
}
return 0;
}
- 1)分数不在给定范围内;
- 2)分数在 [ 0 , 59 ] [0,59] [0,59],直接输出 ‘E’;
- 3)分数等于 100 100 100,直接输出 ‘A’;
- 4)这时候,我发现 B C D 的范围和字符的关系呈线性,于是稍微玩了一点技巧,因为字符也是有运算的,
'B' + 1 = 'C'
以及'C' + 1 = 'D'
,所以分数和等级的关系可以表示成: - l e v e l = D − v − 60 10 level = D - \\frac {v - 60} {10} level=D−10v−60
- 通过这道题,我了解了 ASCII 码,你不了解就去百度吧,我那时还没有百度,全靠自己领悟(瞎编)的。
四、小试牛刀
- 你想的没错,学姐应该要给我布置下一道题了 ……
第三题
- 然而… …
- 学姐尴尬的笑了笑,于是又给我布置了一个题:
- 啊? 刚上大学,对这些都没什么概念,于是我就去一家一家酒店跑,并且计算走过的路程。
- 我把方圆 5 公里的酒店都跑遍了。
- 然后学姐告诉我,不是让我真的去找酒店,就是做这个题。
- 我 TM 直呼神奇!
【例题3】给定 n ( n ≤ 1000 ) n(n \\le 1000) n(n≤1000),然后给出 n n n 个整数坐标 ( x i , y i ) (x_i, y_i) (xi,yi),坐标范围 ( − 100 < x i , y i < 100 ) (-100 < x_i, y_i < 100) (−100<xi,yi<100) 求距离学校最近的坐标的距离,精确到小数点后 3 位(假设 学校的位置在原点)。
- 然后,又过了两个小时,我简直就是天才,两个小时就能做一题,一天 24 小时,也就是一天 12 题,365天就是快 4380 题,是的,当时的菊花还是菊花,当时的我也还比较天真。
- 忘了说代码了,代码长这样:
#include <stdio.h>
#include <math.h> // (1)
const int maxd = 1e9;
int distSqr(int x, int y) {
return x * x + y * y;
}
int main() {
int n, x, y;
while (scanf("%d", &n) != EOF) {
int minD = maxd;
for (int i = 0; i < n; ++i) { // (2)
scanf("%d %d", &x, &y);
int d = distSqr(x, y);
if (d < minD)
minD = d;
}
printf("%.3lf\\n", sqrt(minD + 0.0)); // (3)
}
return 0;
}
- 1)计算距离需要用到开方,所以需要引用数学库
math.h
; - 2)
for(init; condition; action)
是 c c c 中基础的循环遍历语句,init
部分一般写一些变量初始化;condition
是循环得以继续维持的条件判断;action
一般是对循环变量进行改变,从而改变condition
的真假。循环遍历输入,对输入的坐标选择距离平方最小的。 - 3)由于开方函数比较耗时,不应该放在循环内,所以只需要最后利用
sqrt
函数进行一次取值。例如:sqrt(9.0)=3
。
第四题
【例题4】给定 n ( 2 ≤ n ≤ 1000 ) n(2 \\le n \\le 1000) n(2≤n≤1000),然后给出 n n n 个整数坐标 ( x i , y i ) (x_i, y_i) (xi,yi),坐标范围 ( − 100 < x i , y i < 100 ) (-100 < x_i, y_i < 100) (−100<xi,yi<100),求任意两个坐标中距离最小的,精确到小数点后 3 位。
- 这次我变聪明了,只用了一个小时就做出来了,我真是天才啊!小说都不敢这么写!
- 代码长这样:
#include <stdio.h>
#include <math.h>
const int maxn = 1024;
const int maxd = 1e9;
int distSqr(int x, int y) {
return x * x + y * y;
}
int x[maxn], y[maxn];
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int minD = maxd;
for (int i = 0; i < n; ++i) {
scanf("%d %d", &x[i], &y[i]); // (1)
}
for(int i = 0; i < n; ++i) { // (2)
for(int j = i + 1; j < n; ++j) {
int d = distSqr(x[i], y[i]);
if (d < minD)
minD = d;
}
}
printf("%.3lf\\n", sqrt(minD + 0.0));
}
return 0;
}
- 1)由于要计算任意两点间的距离,所以需要把每个点事先存下来,于是引入了一种新的结构,
c
c
c 语言中,我们称之为 ‘数组’ ,也就是数学意义上的 数列。下标从 0 开始,
a[i]
代表第i+1
个元素。 - 2)两层循环,计算任意两点间的距离,然后取最小值。
- 我觉得我这个代码很完美,但是学姐却不以为然。
第五题
- 后来我翻了一下书,发现有一种更加好的结构,在
c
c
c 语言里面,它叫 结构体
struct
。
【例题5】给定 n ( 2 ≤ n ≤ 1000 ) n(2 \\le n \\le 1000) n(2≤n≤1000),然后给出 n n n 个整数坐标 ( x i , y i ) (x_i, y_i) (xi,yi),坐标范围 ( − 100 < x i , y i < 100 ) (-100 < x_i, y_i < 100) (−100<xi,yi<100),求任意两个坐标间距离最小的,精确到小数点后 3 位(利用结构体存储坐标)。
于是代码可以进行如下修改:
1)可以定义一个结构体叫Point
,然后把x,y
这两个变量放在这个结构体里;
2)两个Point
的距离可以定义结构体函数来实现;
- 修改后的代码如下:
#include <stdio.h>
#include <math.h>
const int maxn = 1024;
const int maxd = 1e9;
int Sqr(int x) {
return x * x;
}
struct Point {
int x, y;
void read() {
scanf("%d %d", &x, &y); // (1)
}
int distSqr(const Point& o) { // (2)
return Sqr(x - o.x) + Sqr(y - o.y);
}
}P[maxn];
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int minD = maxd;
for (int i = 0; i < n; ++i) {
P[i].read();
}
for(int i = 0; i < n; ++i) {
for(int j = i + 1; j < n; ++j) {
int d = P[i].distSqr(P[j]); // (3)
if (d < minD)
minD = d;
}
}
printf("%.3lf\\n", sqrt(minD + 0.0));
}
return 0;
}
- 1)将输入的过程抽成
read
函数,放在结构体中进行定义; - 2)将计算距离的过程抽成
distSqr
函数,放在结构体中进行定义; - 3)典型的结构体成员函数的调用;
当时的我,感觉自己已经是能闭上眼睛手撕十行代码的大神了。
五、初窥门径
- 我傻了!排序是个啥啊??
- 网上搜了下(哦,那时候还没网,聊爆了。。。)
- 我猜 排序,可能是和 排球 差不多的东西吧。
- 然后学姐说:
第六题
【例题6】给定 n (
以上是关于❤️学姐教你 10 道题搞定 c 语言❤️(推荐收藏)的主要内容,如果未能解决你的问题,请参考以下文章
清华学姐教你:Linux下查看日志用到的常用命令赶快学起来!