发布于 

我打算开始学一会C语言了,不知道能不能触类旁通

来自大学课程的一封启示。

在专攻硬件这条路上算是越走越远了啊,硬件会不会要走得更远一点?因为要接触底层,那么更需要学会一些强类型的语言。C,我来了

在一切的最初

近距离神魔打架
近距离神魔打架

言归正传

编写C++的一些IDE一般有 Dev-Cpp, CLion, Visual Studio

Microsoft Visual Studio 应该算是比较熟悉的了,当然不是 Visual Studio Code

小项目使用 Dev-Cpp
大项目使用 CLion

在学习一门语言的时候我们总是习惯去输出他。

main.cpp
1
2
3
4
5
6
7
#include <iostream>
int main() {
float a,b,c,d,e,f,g;
scanf("%f %f %f %f %f %f %f", &a,&b,&c,&d,&e,&f,&g);
printf("%.2f",(a+b+c+d+e+f+g)/7);
return 0;
}

这其实就是一个简单的均值求法。

每一个语言都有它的魅力,比如C++,令人难以理解的运算速度是超越其他语言的绝对优势。

语言经典的循环

每一个语言必不可少的东西,进阶后就是迭代器,遍历的算法在大型项目中非常常见(结论来自我做过的其他项目)

for()

main.cpp
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
int main() {
int a;
scanf("%d", &a);
for (int i = 0;i < 5;i++){
printf("%d", a);
if (i < 4) printf(" ");
a = 2 * a + 1;
}
return 0;
}

求这个分数序列的前n项之和

题目:有一个分数序列 q1/p1,q2/p2,q3/p3,q4/p4,q5/p5,…. ,其中qi+1= qi+ pi, pi+1=qi, p1= 1, q1= 2。比如这个序列前6项分别是2/1,3/2,5/3,8/5,13/8,21/13。求这个分数序列的前n项之和。

样例输入
2
样例输出
3.5000

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main() {
int n;
float p[100], q[100], s = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
p[i] = (i > 0) ? q[i - 1] : 1;
q[i] = (i > 0) ? p[i - 1] + q[i - 1] : 2;
s += q[i] / p[i];
}
printf("%.4f", s);
return 0;
}

从键盘输入5个数,找出其最大数并输出

样例输入
2 3 4 7 5
样例输出
7

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}

int main() {
int m = 5, a[m], t = 0;
scanf("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]);
for (int n = 0; n < m; n++) {
t = max(a[n], t);
}
printf("%d", t);
return 0;
}

求n的正整数的阶乘的和

样例输入
5
样例输出
153

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main() {
long long int n, s = 0;
scanf("%lld", &n);
for (int i = 1; i <= n; i++) {
int c = 1;
for (int v = 1; v <= i; v++) {
c *= v;
}
s += c;
}
printf("%lld", s);
return 0;
}

绕啊绕绕啊绕绕啊绕

描述

请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。
比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。

样例输入
2 22
样例输出
6

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int count(int n) {
int i;
for (i = 0; n > 0; n /= 10)
{
if (n % 10 == 2) i++;
}
return i;
}

int main() {
int a, b, c = 0;
scanf("%d %d", &a, &b);
for (int i = a; i <= b; i++)
{
c += count(i);
}
printf("%d", c);
return 0;
}

你真的懂语法吗?

do while()

根据条件来循环语句。
阶乘相加的算法。

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 题目:求1!+2!+3!+4!+…+n!的结果。n!=n*(n-1)*(n-2)*...2*1
#include <iostream>
int main() {
int a;
while(scanf("%d", &a) != EOF) {
int d = 0;
for (int b = 1; b <= a; b++) {
int e = 1;
for (int c = 1; c <= b; c++) {
e *= c;
}
d += e;
}
printf("%d\n", d);
}
return 0;
}

库和包(我习惯的叫法)

OJ平台上并不允许引用其他的包,所以使用基础方法去解决一些问题的时候会很头疼(平常倒也不用那么死脑筋,有轮子不用是**,不过学习的时候就得好好学)

math.h stdio.h …

在哪里?自动生成在程序目录里面吗?
其它库函数标准文件呢?
那为什么,生成目录没有这文件、、却可以运行?

不完全统计,C语言标准库中的头文件有15个之多,所以我主要介绍常用的这四个头文件stdio.h,string.h,math.h,stdlib.h。

他们都被存放于用户所带的C:\Program Files\Microsoft Visual Studio\VC98\Include

他们各个被定义的方法都不同,已经有很多教材对这些进行了整理。(那么这里就不多做赘述了)

scanf()有什么特点

如果要单独拿一个字符(数字)

main.cpp
1
2
3
4
5
6
7
8
#include <iostream>

int main() {
int a, b;
scanf("%1d%1d", &a, &b); // 38
printf("%d和%d", a, b); // 3和8
return 0;
}

函数

不同于数学中的函数的是,他将步骤进行分开,主要放大了其中的运行逻辑。

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
// 下面有所体现
#include <iostream>

void fn() {
// 这里定义了一个 fn() 函数
return;
}

int main() {
fn(); // 这里调用了fn()
return 0;
}

其中,能看出 void fn() “fn”是函数名, “void”是函数将要返回的类型。

int main(void) 是标准形式,这么写时,结尾要加 return 0; 其实怎么写都可以,主要是看你的编译器。(来自“百度”)

指针

还没搞明白。