美图镇楼
之所以大一结束之后的暑假才开始博客的写作,其实是做了一番思想斗争的。
我业余是打比赛的,并非cs和ee专业,但一直在自学软硬件。这一年里,笔记写了不少,比赛做了不少,东西也学了一些,终于觉得自己算是可以在不误导别人的前提下输出一些自己的经验。于是我决定开始更新博客,也和csdn上的大佬们交流一下,记录自己的成长。
---------------------------------------------------------------------------------
选择C语言作为我的第一篇博客,其实是因为C语言对于软硬件的学习都起到了举足轻重的作用。正所谓“勿在浮沙筑高台”,对于软件,这个面向过程的语言可以让人从底层理解算法,操作系统,内存调用等知识,也可以触类旁通理解其他的旁支语言;硬件则可以直接从C语言取道嵌入式。
大家都说指针才是C语言的灵魂,难点所在,可我一个小白知道,对于我们这种零基础的人而言,C语言中的所有东西都是难点,稍不注意printf和scanf都容易辨别不好,所以本系列博客就是
帮小白扫雷的(里面都是我自己犯过的错误)
----------------------------------------------------------------------------------
1.C语言一开始不要追求“语法全会,编写流畅”
正确的做法是先学一遍大框,后往里填充内容
2.一开始学习,不管多短的代码,都要敲出来
就算是一个hello world,也可能成为你坚持下来的勇气
3.printf是输出文本的,scanf是输入某某数字的
printf输出时不带地址符,直接引用就行;scanf是把这个数字存储到变量的地址中
#include <stdio.h>
int main()
{
int a, b, c, temp, min;
scanf("%d,%d,%d", &a, &b, &c);
temp = (a < b) ? a : b;
min = (temp < c) ? temp : c;
printf("min=%d\n", min);
}
4.putchar()一次输出一个字符
getchar() 使程序停顿(原理:enter用于清空缓冲区字符。如果没有getchar(),当按下Enter键时,缓冲区内容被清空,后面按下的enter立即显示出来,程序不停顿;有getchar()时,enter保留在缓冲区,程序停顿)
这个阶段的小白最好别用这两个函数,容易被绕迷糊
5.while(),这个括号中的东西是判断条件
括号中没有东西,程序就一直执行
6.for(起始值;最终值;递增值)
7.=是赋值,==是等于
#include <stdio.h>
int main()
{
int x = 0, y = 0, a = 1, b = 1, c = 2, d = 2,z;
z = (x = a == b) || (y = c == d);
printf("%d,%d", x, y);
}
8.千万别怕自己写程序,即使程序有一堆错误也要鼓励自己,自己debug代码是进步最快的方式,不会改就去问
9.作为一名小白,敲别人的代码是自身学习的必经之路。最好不要把别人的代码全部复制并粘贴,要明白人家写代码的思路,最好照着敲下来,不久之后它就会成为你自己写代码时的思路。
10.一开始写不出程序很正常,写出来才不正常
11.在比较多个数的大小时(这个时候的你还不会排序算法),比较数要用自己写的函数两两比较大小。
#include <stdio.h>
int min(int a, int b)
{
int temp;
if (a < b)
temp = a;
else
temp = b;
return temp;
}
int main()
{
int x, y, z,temp=0,jieguo=0;
scanf("%d %d %d", &x, &y, &z);
temp=min(x, y);
jieguo=min(temp, z);
printf("三个数中的最小值为:%d", jieguo);
}
当然,以下的这段程序也可以用于比较大小,这种方式不需要自己设函数
#include <stdio.h>
int main()
{
int a, b, c, temp, min;
scanf("%d,%d,%d", &a, &b, &c);
temp = (a < b) ? a : b;
min = (temp < c) ? temp : c;
printf("min=%d\n", min);
}
12.C语言中数组元素是从0开始的
13.一定要弄清for循环时到底循环了几次,比如说下面的这个案例,i从2就开始循环了,一直到10结束。如果换为++i,i就从3开始循环。
//用数组求一下斐波那契数列的前十项
/*#include <stdio.h>
int main()
{
int a[10] = { 1,1 }, i;
for (i = 2; i <10; i++) {
a[i] = a[i - 1] + a[i - 2];
}
for (i = 0; i <10; i++)//数组元素是从零开始的
printf("%6ld\n", a[i]);
}
下面这个程序a=i,接收的是i的返回值,所以结果是0,1,2,3,4
#include <stdio.h>
int main()
{
int a, i;
for (i = 0; i < 5;i++ )
{
a = i;
printf("%d", a);
}
}
这样输出结果是1,2,3,4,5
#include <stdio.h>
int main()
{
int a, i;
for (i = 0; i < 5; )
{
i++;
printf("%d", i);
}
}
结果是0,1,2,3,4
#include <stdio.h>
int main()
{
int a, i;
for (i = 0; i < 5;i++ )
{
printf("%d", i);
}
}
14.\n只能用于单个字符的换行,如果printf中输出了多个字符,\n则会原样输出
#include <stdio.h>
int main()
{
int a = 9, b = 3;
float x = 5.5, y = 1.1, z;
z = a / 2 + b * x / y + 1 / 3;
printf("%5.2f\n", z);//单个字符可以这么写来换行,多个字符就会原样输出
}
15.有些时候短路定理也可以派上用场
当&&的左边为0时,右边不再执行,被赋的值直接落下来
当||的左边为一时,右边不再执行,被赋的值直接落下来
下面这段程序就是例子,||左边为1,右边不再执行,y直接落下来,结果为1,0
#include <stdio.h>
int main()
{
int x = 0, y = 0, a = 1, b = 1, c = 2, d = 2,z;
z = (x = a == b) || (y = c == d);
printf("%d,%d", x, y);
}
16. 学到这里,我想你应该可以用C语言完成一些简单的程序,并且推测出一些程序的结果,他们会为你今后的程序乃至算法学习打下坚实的基础。
例一:判断闰年的程序
#include <stdio.h>
int main()
{
int year;
printf("Please input a year:");
scanf("%d", &year);
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
printf("%d年是闰年!\n", year);
else
printf("%d年不是闰年!\n", year);
}
例二:判断一下这个程序的结果,想想它是为什么
#include <stdio.h>
int main()
{
int x = 2, y = 3;
printf("%d\n", --x + y, --y + x);
}
此题的结果为三
例三:判断一下这个程序的结果,想想它是为什么
#include <stdio.h>
void main()
{
int i, j, sum;
for (i = 1; i <= 3; i++)
{
sum = 0;
for (j = 1; j <= i; j++)
sum = sum + i * j;
}
printf("%d", sum);
}
此题的结果为18,如果可以的话,你可以拿上面的循环打印*,并形成一些图案。
(提示:可以画流程图辅助理解)
例四:判断一个数是否为素数
(别想着网上也有相关的程序,要自己把程序写完再看讲解)
而且,素数程序对于小白来说,其实并没有那么简单。所以即使程序编译出了一堆问题也不要放弃。只有勇于面对问题才能进步,加油!
#include <stdio.h>
int main()
{
int a, i, m;
printf("Please input a number:");
scanf("%d", &a);
m = 0;
for (i = 2; i < a; i++) {
if (a % i == 0) {
m++;
}
}
if (m == 0)
printf("%d是素数", a);
else
printf("%d不是素数", a);
return a;
}
你可能会出现如下的问题:
这程序也太繁琐了,为什么要用m的值来判断是否为素数呢,直接判断不行吗
你可以用下面的程序编译一下,事实证明直接判断的确不太行
#include <stdio.h>
int main()
{
int a, i;
printf("Please input a number:");
scanf("%d", &a);
if (a == 1)
printf("1是素数");
for (i = 2; i < a; i++) {
if (a % i == 0) {
printf("%d不是素数\n", a);
continue;
//把break换成continue后虽然不会出错,但还是会一直循环,所以最好还是多加一个因数
}
if(a%i!=0)
{
printf("%d是素数", a);
continue;
}
}
return a;
}
如果你能坚持着学到这里,你就基本与小白中的小白告别了
如果你是复习C的老程序员,应该也记起了很多C的基础知识,写些简单的小程序还是没有问题的
如果你是打比赛的,现在学的这些知识足够你去调试arduino之类的简单程序
如果想学的更加深入,欢迎关注此系列的下一篇文章