学弟学妹们就要到了,被老师安排让准备一些内容适合给新生小白讲课的,这里内容我给精简了一部分,希望对大家有所帮助,错误之处多大指正。

C语言是什么

C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。

C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。

当前最新的 C 语言标准为 C18 ,在它之前的 C 语言标准有 C17、C11...C99 等。

如何学C语言

那肯定得是撸代码,学习编程没有什么捷径的。

学习编程有速成的吗

这个肯定是没有的,学习编程是很枯燥的的以恶搞过程,自己一个人对着电脑屏幕敲代码。身边如果只有一个人那实在是太孤独了,在学习编程的过程当中,大环境是直观重要的,你需要不断和他人交流编程当中的问题,解答他人的问题。学而不思则罔,思而不学则殆。

我的大学期间,宿舍室友都是热爱学习的那种,几个人学习代码,敲代码,偶尔出去喝个酒啥的,小日子还算是比较惬意的。在学习编程的时候,我们经常也会因为一些问题产生争吵,但是整体的情况下,还是在学习。学习的氛围很重要,如果你的室友是天天大声音打游戏到凌晨的那种,我觉得你需要加入一些技术交流社区或者技术群来就行交流,哪怕作为小白的你在里面水群都是可以的,水着水着就成大牛的存在。

同时也有几个不同专业的同学,相互在一起学习编程,主要还是交流,遇到问题不要闭门造车。

学习编程有什么核心要诀吗

这个是有的,首先是你需要知道编程是什么,他们作什么,你为什么要学编程。在编程的学习当中,数学和英语是必须的,数学是重中之重,没有一个好的数学逻辑,学代码会很吃力,但是英语差的情况下,看代码、看bug是比较吃力的。当然也有一种特殊的存在,数学很好,英语很差,但是能写代码。在看代码和排bug的时候,只认识这些的编程的关键词,英文类的报告书和任务书都可以看懂,英语口语也可以(关于代码的),但是只要碰到英语考试,成绩铁定凉凉那种。

在学习编程的时候,你一定要有自身的见解和思想。很多同学学习编程的时候喜欢直接看教程,看了一遍下来知道什么是什么,但是写代码就是写不出来,这是无效的。学习编程的英文不可怕,在我看来,歇息编程你需要先聊城程序的执行是什么的,程序的三大结构,程序的逻辑该怎么去设计,然后是了解函数、数组、指针等相关概念,然后是结构体、数据结构。如果这时候你学习到了面向对象的编程,那你一定要对照结构体类,在它们两个之间寻找异同之处。

这样差不多你已经有自己的编程思想了。遇到编程,首先想的不是代码怎么写,而是这个逻辑是什么样的,我该怎么去通过代码来设计这个逻辑。

编程时将数学问题转成代码来处理的,如何让将数学公式转成代码,通过编程来求解这个问题,那么你已经算是编程的小牛。

知道什么是编程——程序执行的流程——三大结构——编程的逻辑——数组函数指针——结构体——数据结构

这一条在融会贯通的情况下,你已经是大牛。你所缺少的就是实战,用实际的项目来验证自己的所学所想,学以致用。以战养战,百战不殆。

最后祝愿大家在程序猿的道路上持之以恒,越奋越勇。

用什么来写C语言

工欲善其事,必先利其器。我们在学习编程语言之前,必须得先学会使用编程软件。C语言的编程软件有很多,以下我为大家介绍几款

啊哈C

我在出学C语言的时候使用的就是啊哈C的编译器,同时我的C语言入门书籍也是《啊哈C语言》。这是一本少儿编程读物,尽管我当时已经20岁,但是丝毫不影响我学习的积极性。

这个是啊哈C语言编译器启动的界面。

可以看到这个界面相对很简单很简洁的,它不需要新建项目的,敲代码直接撸就完事。在这里也推荐初学者去购买一本《啊哈C语言》来进行真正“零基础”的入门。

啊哈C编译适用的那些对电脑没有接触的萌新们,萌新的起步从这了开始。安装过程实在是台过于小白,所以笔者在此不介绍了,大家下载后一路双击就完事了。

VC++6.0

这个也曾经是一代神器的存在,我刚上大学的编程课用的还是这款编译器,很实用,但是随着C语言的升级,这块你编译器也逐渐有些跟不上脚步。使用相比啊哈C较为复杂一些,但是比较贴近于项目,每次写代码需要新建项目、新建源文......乌七八糟的一大堆。

由于VC++6.0过于老,大家有兴趣的可以参考如下的教程进行下载。哆啦A梦的传送门

整体界面是这样的。

(PS:不考虑功能的前提下,这个颜色+英文让初学程序的我很不爽QAQ~)

DEV C++

这个和VC++也是处于同一级别的存在,使用难度中等,功能方面比VC++6.0要强,就目前C语言的版本来说,还是比较适合的。安装教程:哆啦A梦的传送门

界面如下所示。

VC++2010

我大一下学期参加了计算机等级考试,当时报名考的是二级C语言。当时学校教的是VC++6.0,然后考试前信心百倍,考试时候突然发现最后的编程答题用的VC++2010,瞬间内心慌得一批。幸好之前玩过Visual Stdio,勉勉强强通关,学编程一定要戒骄戒躁,这是我最深刻的体会。

VC++2010的安装:哆啦A梦的传送门,同时配图一张。

Visual Stdio

Visual Stdio简称VS,根据不同的年限版本有着不同的名称。我目前所使用的是Visual Stdio 2019版本,简称VS2019。这是一代神奇,大多数程序猿对在使用它进行编程。VS不仅仅可以写C语言,只要你环境配置的好,C++、Java、Python、C#等,都可以运行。当然这个你要是全装的话,很庞大。我第一此在安装VS的时候,全装,结果给C盘装了小60GB的文件,当时真是说不出的酸爽。VS安装之后想彻底卸载干净比较麻烦,所以大家一定要仔细斟酌。

Visual Stdio的安装大家可以去官网下载。

最最最后

关于这里提到的编程软件,大家可以根据自身的情况来选择。其中涉及的安装包大家可以自行下载,也可以从我们的官网的资源部位进行下载,同时配套的安装视频我们也会在随后同步上线。我们的C语言课程涉及使用啊哈C编译器进行讲解,用什么编译器一样的,学编程你需要掌握的是这个逻辑,这个思维。

大道三千,殊归同途。编程思想是互通的,不同的是你敲出来的代码和你使用的软件。诸君共勉。

我的第一个C语言程序

#include <stdio.h>  //调用stdio.h文件
#include <stdlib.h> //调用stdlib.h文件

int main()
{

printf("Hello World!\n"); //屏幕显示Hello World!并换行
   
system("pause"); //等待,按下任意键继续
return 0;
}

这个是我们要写的代码。

我们将代码输入,点击运行按键,它会让你先保存一下代码,然后出现提示你编译成功(前提是你的代码没错误的情况下),我们再点击弹出来的“确定”按键就可以看到执行效果的。

下面的黑黑的显示的就是程序的执行效果,在屏幕显示了Hello World!,然后换行输出了请按任意键继续,然后按下任意键关闭程序。

程序的构成

  1. 程序的第一行 #include <stdio.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。

  2. 下一行 #include <stdlib.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdlib.h 文件。

  3. 下一行 int main() 是主函数,程序从这里开始执行。

  4. 下一行 printf(...) 是 C 中另一个可用的函数,会在屏幕上显示消息 "Hello, World!"。

  5. 下一行 system(“pause”) 是 Windows系统的指令,等待操作的方式,按下任意键擦灰继续操作。

  6. 下一行 return 0; 终止 main() 函数,并返回值 0。

  7. 任何程序的执行从main开始,由上向下,依次执行逐条语句(顺序结构)。

框架

这里给写到的是C语言的一个框架格式,所以的C语言代码的格式都是这样的。面对一个现实生活中的问题,我们通过写代码的方式让计算机帮我们解决掉,这就是编程!

X和Y的世界——变量常量

我们在小学阶段就已经开始通过方程的概念来接触变量和常量的问题,我们在方程式Y=kX+b的方程式当中,Y是随着X的变化二变化,所以我们称X为自变量,Y为因变量

在面对现实当中的问题,我们通过编程的方式来解决这个问题,这就是编程。那什么叫做编程的方式呢?

对于一个问题,必定存在输入和输出。输入的是解决这个问题需要的参数,输出的是这个问题处理的结果。举个例子,我们现在想要做大量的加减乘除计算,但是人为手动的来计算实在是关于麻烦,十几条还好,一旦超出了几千条几万条,我们就需要来借助计算器来解决这个问题。

我们可以购买以购买计算器来进行计算,我们也可以通过编程来解决这个计算。在这里,我们需要解决的问题是大量的计算,输入的是需要计算的数据,输出的是这些数据计算的结果。

对于现在我来说,我可能会在建立Excel表格,然后编程读取文件,计算后保存数据到这个表格等等(虽然Excel自身就有加减乘除计算的能力)。

我们在编程当中,对于这些需要输入输出的内容,我们称为变量常量。

我们先来聊一聊变量常量的数据类型。

数据类型

类型 介绍
int 整型,只能保存整数
float 单精度浮点型,只能保存小数,小数精度较低
double 双精度浮点型,只能保存小数,小数精度较高
char 字符型,用于保存符号,比如字母

C语言的数据类型远远不止这几种,在此次教程里面,我们做到循序渐进,一点点的进阶。上程序,

#include <stdio.h>  //导入stdio.h文件
#include <stdlib.h> //导入stdlib.h文件

int main()
{

int a = 1; //定义变量a,初始化赋值1
  int b = 1; //定义变量b,初始化赋值1
  int c = a + b; //定义变量c,将a+b的结果赋值给c
  printf("%d",c); //屏幕打印变量c的数值
   
system("pause"); //等待操作
return 0; //返回值为0
}

这个程序给大家计算了1+1等于2,我们定义了一个变量a并初始化赋值为1,我们定义了一个变量b并初始化赋值为1,我们定义了一个变量并将a+b的结果赋值给了c,最后我们在屏幕输出了c。a和b就是我们的输入,而c就是我们的输出。

我们这个问题是需要来计算1+1的结果,我们输入了两个变量a和b,我们输出了一个结果c。这就是数学问题代码解决。我初学编程是在高中阶段,当时的数学题实在是让人头大不管是函数,又或者是什么计算类的数学题,实在是头大。但是学了编程之后,稍微复杂点的数学计算都可以通过编程来计算。在数学的函数图像问题,很多函数图像我们画不出来或者研究不出来,我就可以通过编程来做一个函数图像生成器,输入函数式,输出这个函数的曲线,这就是编程。

我们再来一个程序,我们来计算下圆的周长和面积。在这个问题当中,我们需要解决的问题是通过输入以一个圆的半径,计算得到圆的周长和面积。

我们来回顾下,圆的周长和面积公式。

​ 圆的周长:l=2Πr

​ 圆的面积:s=Πr*r

现在我们来上代码。


#include <stdio.h> //导入stdio.h文件
#include <stdlib.h> //导入stdlib.h文件

int main()
{
float PI = 3.1415926; //定义单精度浮点类型变量PI,初始化赋值为3.1415926
   
int r = 5; //定义整型变量r,初始化赋值为5
  float l = 2*PI*r; //定义单精度浮点类型变量l,初始化赋值为2*PI*r
  float s = PI*r*r; //定义单精度浮点类型变量s,初始化赋值为PI*r*r
printf("圆的周长是%f\n",l); //屏幕输出周长
  printf("圆的面积是%f\n",s); //屏幕输出面积
   
system("pause"); //等待操作
return 0; //返回值为0
}

这里的介绍大家可以参考1+1的问题,也欢迎大家在我们的QQ群提出自己的见解以及看法。

左值右式定则

在我们程序里面,关于变量或是常量,我们都按照“左值右式”的原则来定义。

左值右式——左边是数值,右边是算式。

在编程里面,我们的数值是保存在变量里面的,所在等号的左边,是变量,用于存储计算的结果。对数据的计算,是一个算式,这个算式在等号的右边。

int r = 5;//r是变量,是数值;5是算式,常量式

float l = 2*PI*r;l是变量,是数值;2*PI*r是算式,变量式

变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边

什么是变量,什么是常量

什么是变量,什么是常量。

在程序执行的过程当中,数据可变的我们称为变量,数据不可变的我们称为常量。

常量长用于定义一些固定的量,比如圆周率Π;变量是程序在执行过程当中,用于临时存储和计算的量。

输入和输出

在一个程序当中,人和电脑的交互(人机交互)是很必要。我们需要从键盘输入内容,同时在屏幕输出内容,在这里的输入和输出,就是我们人机交互的接口。

我们在程序开头有#include <stdio.h>和#include <stdlib.h>两个文件的导入。

include的英文意思是包含的意思,这里是将stdio.h文件和stdlib.h文件加载到当前的程序当中,这两个文件是编译系统内部的文件,我们用到的int、float、printf等等都是定义在这些文件里面。

stdio,Standard Input Output,标准化输入输出

stdlib,Standard Library,标准库

在C语言当中,我们使用scanf获得键盘的输入;使用printf在屏幕输出显示。


#include <stdio.h>
#include <stdlib.h>

int main()
{
float PI = 3.1415926;
   
int r;

printf("请输入圆的半径:");
scanf("%d",&r);
   
  float l = 2*PI*r;
  float s = PI*r*r;
printf("圆的周长是%f\n",l);
  printf("圆的面积是%f\n",s);
   
system("pause");
return 0;
}

在这里我们可以通过键盘输入一个数字,通过scanf,这个数字会保存到整型变量r里面,在下面的程序当中,在调用r的同时,r就是我们输入的的数字,代入计算。(PS:关于scanf和printf的内容会在后面开一章详细讲解)

结语

把实际生活中的问题,通过代码来告知电脑,电脑给我们处理之后,告知我们结果的这一过程,就是编程。

身为程序猿的我们,写代码就是我们在和电脑进行沟通、进行告知的一个过程。在这里,“数学公式代码化”这一思想尤为的重要。

三大结构——顺序结构和选择结果

顺序结构

在程序执行的过程当中,程序从main'函数开始,由上向下逐行语句依次执行,这就是顺序结构。**

程序的逻辑感很强,严格、一行不差的执行,如果程序计算的结果和你预测的结果存在偏差,那么这就是你的问题。要么你预测错误,要么你代码逻辑错误。

#include <stdio.h>
#include <stdlib.h>
int main()
{

printf("Hello World!\n");

system("pause");
return 0;
}

对于这个程序来说,程序在执行的时候,先是加载stdio.h和stdlib.h两个文件,然后进入到main函数,main函数内的第一行是printf("Hello World!\n");,这行执行后,会在屏幕输出个“Hello World!”同时加一个换行;然后执行的是system(“pause”);,这一是等待操作,它会提示你按下任意键继续,这里主要是用来停止程序,方便大家观看程序的执行效果,我们在调试程序的时候,想看到程序逐条执行的效果时,也可以使用这个语句;最后的是return 0,是程序的结束标示。

顺序结构在所有的编程语言都是通用的,不仅仅是在C语言。

选择结构

我们解决问题的时候,经常也会碰到需要选择的界面,根据当前的情况,我们来做出下一步如何执行的决定。

在程序里面,我们称为选择结构。选择结构有以下几种。

单分支选择结构


if(判定体)
{
//执行体
}

我们来看个实例程序。

#include <stdio.h>
#include <stdlib.h>
int main()
{

int a;
  scanf("%d",&a);
   
  if(a<10)
  {
printf("您输入的数小于10\n");
  }
   
system("pause");
return 0;
}

我在这里输入了5,通过scanf,我把5赋值给了a,此时a=5。接下来进入到了我们的if位置,我们此时的判定体为a<10。在a=5的情况下,这个判定肯定是成立的,所以下面大括号的内容printf("您输入的数小于10\n");得到执行。那么如果我输入的比10大会怎么样呢?那肯定是条件不成立,不会执行的。

双分支选择结构


if(判定体)
{
//执行体1
}else{
//执行体2
}

我们来看个实例程序。


#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
scanf("%d",&a);
   
  if(a<10)
  {
printf("您输入的数字小于10!\n");
  }else{
printf("您输入的数字大于10!\n");
  }
   
system("pause");
return 0;
}

条件体成立,执行一个内容,条件体不成立,执行另外一个内容。这就是双支选择结构。大家可以自行构想下逻辑。

多分支选择结构


if(判定体1)
{
//执行体1
}else if(判定体2){
//执行体2
}else if(判定体3){
//执行体3
}else{
//执行体4
}

我i们来看个实例程序。


#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
  scanf("%d",&a);
   
  if(a<10)
  {
printf("您输入的数字小于10!\n");
  }else if(a>10)
  {
printf("您输入的数字大于10!\n");
  }else{
printf("您输入的数字等于10!\n");
  }
   
system("pause");
return 0;
}

多分支选择结构用于处理选项较多的情况,这里的逻辑大家自行理解一下,可以参考上面的介绍,也欢迎大家在QQ群进行讨论交流。

选项选择结构

如果出现可供选择少的情况下,我们可以通过if else的方式来处理,那么如果有几十种几百种选项呢?麻烦的很!

这个时候我们就要用到选项选择结构switch...case...default。


switch(判定的内容)
{
case 选项1:
执行体1;
break;
case 选项2:
执行体2;
break;
case 选项3:
执行体3;
break;
case 选项4:
执行体4;
break;
......
default:默认执行体;
}

我们来看下实例代码。


#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
  printf("input integer number: ");
  scanf("%d",&a);
  switch(a)
  {
      case 1:
printf("Monday\n");
break;
      case 2:
printf("Tuesday\n");
break;
      case 3:
printf("Wednesday\n");
break;
      case 4:
printf("Thursday\n");
break;
      case 5:
printf("Friday\n");
break;
      case 6:
printf("Saturday\n");
break;
      case 7:
printf("Sunday\n");
break;
      default:printf("error\n");
  }

system("pause");
return 0;
}

我们通过键盘输入一个数字存储在变量a当中,通过switch...case来判定a的数值,从而选择对应的语句执行;而最后的default是在所有的case都不行的情况来执行default的内容。


当所有的case都不适合switch的时候别害怕,你还有有个default。
当所有的人都爱你的时候别担心,你还有我。
————隔壁老王

结语

三大结构是任何编程的组成核心,不管你学习哪一门编程语言。关于break的内容,我们会在后面详细讲到,敬请期待!

三大结构——循环结构

我们可以完成的任务,为什么要让机器来做,要让电脑来处理?

因为机器人可以不知疲倦、不厌其烦的进行无聊的、重复性极强的、危险的工作。

程序的执行从main函数开始,由上向下的执行;在碰到条件的时候,我们让其判定进行一个选择执行;那么对于需要重复性的工作,则需要通过循环来进行。

循环结构有以下四种。我们均以1到99的和为例,向大家展示。

for循环

for(初始化;判定体;自变体)
{
//执行体;
}

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i; //定义整型变量i
  int sum = 0; //定义整型变量sum,用于存储累加的和
   
  //for循环实现累加计算
  for(i=0;i<100;i++)
  {
sum = sum + i; //将每次i的值加到sum
  }
   
  printf("Sum = %d\n",sum); //输出累加的结果
   
system("pause");
return 0;
}

在我们的这组实例代码当中,初始化i=0,判定i是否小于100,每次执行语句后i的值加1;在执行体的部位我们执行了sum = sum+1即把每次i的值加到了sum变量上面,根据“左值右式”,注意左边的sum和右边的sum含义是完全不一样的。

while循环

初始化;

while(判定体)

{

//执行体

//自变体

}

#include <stdio.h>
#include <stdlib.h>
int main()
{

int i;
  int sum = 0;
   
  i = 0; //初始化
  while(i<100) //判定体
  {
sum = sum + i; //执行体
      i++; //自变体
  }
   
  printf("sum = %d\n",sum);
   
system("pause");
return 0;
}

这个是while循环实现1到99累加和的计算,逻辑大家先自行理解,可在我们交流群就行讨论。

do...while循环


初始化
do
{
执行体;
自变体;
}while(判定体);

#include <stdio.h>
#include <stdlib.h>

int main()
{

int i;
  int sum = 0;
   
  i = 0;
  do
  {
sum = sum + i;
      i++;
  }while(i<100);
   
  printf("sum = %d\n",sum);
   
system("pause");
return 0;
}

这个是do...while循环的结构,实现0到99的累加和,同样可以参考上面的内容。

三个循环的异同与“栏杆问题”

for循环,又称为“计数循环“。我们可以在for循环里面指定这个循环内容执行执行多少次。

while循环,又称为”条件循环“。满足while的条件循环的内容就执行,否则循环内容不执行。

程序的三大结构,顺序结构、选择结构、循环结构,我们先用顺序结构来解读下着两个循环的相同之处。程序的执行从main'’函数开始,从上向下的执行。

到了for循环和while循环这里,先执行的是初始化,然后是判定,判定符合条件后,执行相关的语句,最后经过自变体来修改判定变量。两种循环的逻辑是相同的,但是在写法和用途方面存在不同。

do...while循环当中,先是执行了初始化,然后是执行需要执行的语句,然后是执行自变体修改判定变量,最后才来判定。

也就是说,for循环和while循环是先判定,后执行;而do...while循环是先执行,后判定。这两个有什么问题呢?

我在学校的时候经常需要去菜鸟驿站去快递,每次都是排队去的,到取快递快递前的时候,他会先问我是不是xxx,如果是,他才把快递给我,然后继续下一个同学。但是有一次情况,他先把快递给我了,然后问我是不是xxx,但是我不叫xxx,这个时候他已经把快递给我了的,是不是就出现错误了呢?

在现实的世界当中,快递员给错了快递可以要回,但是在程序的世界当中,这就是bug!

先判定后执行,先执行后判定。这个逻辑大家一定要理解。

我们再来聊聊什么是”栏杆问题“。

我们计数喜欢是从1开始计数,但是在程序的世界里,计数是从0开始的。

在for(i=0;i<100;i++)这个过程里面,循环是执行了100次,是0到99,这个也是初学者比较迷惑的一个问题。建议大家去购买《编程珠玑》一书,里面对于这些细节讲解的十分详细。

死亡循环——goto

我纠结了再三,决定还是来聊聊死亡循环的问题,这个循环不建议大家来玩。


A:
执行语句
goto A

#include <stdio.h>
#include <stdlib.h>
int main()
{

A: printf("Hello World!\n");
   
  goto A;
   
system("pause");
return 0;
}

这个循环就是通过goto跳转到执行的位置,然后执行。goto循环时一个执行的存在,我们在学校上机课的时候实验过,用goto循环来不停的创建线程,成功把电脑噎死(大概几秒钟的时间)。goto循环了解即可,不要使用,使用后需要电脑重装系统的童鞋可以在我们的QQ群寻求技术帮助(QAQ)。

break和continue

break,打破,击破,打碎。

continue,继续。

我们在循环过程当中,我们碰到了一个结果想要提前跳出循环的时候,可以直接使用break语句。例如,


#include <stdio.h>
#include <stdlib.h>
int main()
{

int i;
  for(i = 0;i<10;i++) //循环
  {
printf("i = %d\n",i);
      if(i == 5) //如果i等于5
      {
break; //提前结束循环
      }
  }
   
system("pause");
return 0;
}

在这里循环只执行了5次就被break掉了的。

在程序执行的过程当中,我们想跳过某个执行,继续循环可以使用continue。例如,


#include <stdio.h>
#include <stdlib.h>
int main()
{

int i;
  for(i = 0;i<10;i++)
  {
if(i == 5)
      {
continue;
      }
printf("i = %d\n",i);
  }
   
system("pause");
return 0;
}

在执行到i等于5的时候,我直接给给continue掉,直接开始了新一轮的循环。、

高中时候的体育课上,老师让我们跑十圈热热身身,当我跑到第五圈的时候,同学告诉我班主任找我,那我就只能break掉跑圈的循环。老师有时候会在操场计着圈数,由此我跑过去了老师没看到,直接就把我continue,好家伙,最后评定我只跑了9圈,再加一圈。(QAQ)