C语言学习心得(阶段:小白中的小白)

美图镇楼

之所以大一结束之后的暑假才开始博客的写作,其实是做了一番思想斗争的。

我业余是打比赛的,并非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之类的简单程序

如果想学的更加深入,欢迎关注此系列的下一篇文章

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值