第一章 介绍:程序设计与C语言

第一章 介绍:程序设计与C语言

计算机和编程语言

计算机是怎么做事情的,编程语言是什么

同一件事情,不同对象需要的方式不同:

  • 当面对的对象是时,需要告诉 What to do 。
  • 当面对的对象是计算机时,需要告诉 How to do 。

程序是用特殊的编程语言写出来表达如何让计算机解决问题的。不是用编程语言来和计算机交谈,而是描述要求计算机如何做事情的过程或方法。

 
辗转相除法,是指用于计算两个非负整数a,b的最大公约数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

假如需要求 1997 和 615 两个正整数的最大公约数,用辗转相除法,是这样进行的:
 1997 ÷ 615 = 3 (余 152)
 615 ÷ 152 = 4(余7)
 152 ÷ 7 = 21(余5)
 7 ÷ 5 = 1 (余2)
 5 ÷ 2 = 2 (余1)
 2 ÷ 1 = 2 (余0)
至此,最大公约数为1

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

如下就是使用C语言编写的计算32与26的最大公约数程序

int u = 32;
int v = 26;
while(v != 0){
	int temp = u % v;
	u = v;
	v = temp;
}
printf("%d",u);

对应的算法就是:
1、如果v等于0,计算结束,u就是最大公约数;
2、如果v不等于0,那么计算u除以v的余数,让u等于v,而v等于那个余数;
3、回到第一步;

这段程序对应在计算机中的内容是:
在这里插入图片描述

算法

  • 我们要让计算机做计算,就需要像这样找出计算的步骤,然后用编程语言写出来。
  • 计算机做的所有的事情都叫做计算
  • 计算的步骤就是算法。

计算机的思维方式:重复是计算机最擅长的

程序的执行方式有以下两种:
1、解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行。
2、编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂的语言-----机器语言-----写的程序,然后这个机器语言写的程序就能直接执行了。

解释语言 VS 编译语言
对于编程语言来说本身并无 解释、编译 之分。任何一种编程语言即可解释执行,也可编译执行;只是传统与习惯的问题,只是这种语言常用的程序执行方式。经常听到说C语言是编译型语言,因为一般写完C语言程序之后需要先编译,然后再运行;但是也有人做了C语言的解释器。一般说Python是解释型语言,因为一般写完Python程序之后不需要编译,直接可以用源代码执行;但是如果愿意的话也可以做Python语言的编译器。

解释型语言有特殊的计算能力。(因为源代码在执行的过程中不断地被解读,有可能可以做一些特殊的事情;比如运行过程中源代码是否可以被修改)

过去会觉得解释型语言运行的比较慢,因为解释型语言并不是直接在计算机上运行的,需要借助一个程序运行。但是随着计算机的发展,解释型语言的运行效率和编译型语言的运行效率已经不是重要的问题,因为计算机的运行速度已经到了非常高的层次上面。

编译型语言有确定的运算性能

所以在今天来说,这两种程序执行方式已经没有非常大的本质上区别,这只是传统与习惯的问题。

C语言

为什么是C:C语言地位重要,很多领域无可替代

可以在tiobe官网查看编程语言排行榜:https://www.tiobe.com/tiobe-index/
在这里插入图片描述
在这里插入图片描述

其他语言比如Java,都有其他语言可以代替。而在一些场合中C语言是唯一的选择,比如做操作系统、嵌入式系统,这些只能选择使用C语言(有时可以使用C++)

其他语言:

  • 现代的编程语言在语法上的差异很小
    • 几乎都是C-like语言(语法上与C语言差不多)
  • 语言的能力/适用领域主要是由 库和传统 所决定的

简单历史:C语言和版本的历史

C语言历史

  • C语言是从B语言发展而来的,B语言是从BCPL发展而来的,BCPL是从FORTRAN发展而来的(FORTRAN是人类第一个高级程序设计语言)
  • BCPL和B都支持指针间接方式,所以C也支持了(指针是C语言的灵魂)
  • C语言还受到 PL/I 的影响,还和 PDP-II 的机器语言有很大的关系(在高级语言中C语言是一种比较底层的语言)
  • 1973.3 ,第三版的Unix上出现了C语言的编译器
  • 1973.11 ,第四版的Unix(System Four)发布了,这个版本是完全用C语言重新写的

C的发展与版本
K&R:

  • 经典C,又被叫做 “K&R the C”

标准:

  • 1989年ANSI发布了一个标准-----ANSI C
  • 1990年ISO接受了ANSI的标准-----C89
  • C的标准在1995年和1999年两次更新-----C95和C99
  • 所有的当代编译器都支持C99了

后面的学习都是基于C99进行的。

编程软件:这里使用Dev C++

C语言是一种工业语言,主要用于:

  • 操作系统
  • 嵌入式系统
  • 驱动程序
  • 底层驱动
    • 图形引擎、图像处理、声音效果

一般来说C语言主要用于编写底层内容。一些在做基础性工作的人使用C语言。

C语言作为一种工业语言,其:

  • 开发效率 >> 学习过程
  • 开发效率 >> 开发乐趣
  • 日常应用很少直接用C语言编写
  • 学习C的过程主要是写练习代码,而非真实软件

C语言需要被编译才能运行,所以需要:

  • 编辑器
  • 编译器

或者使用IDE(集成开发环境。将这两个东西做成一个软件,集成在一起)。

这里学习C语言使用的编程软件是Dev C++(4.9 for Win7, 5.0 for Win8)。Dev C++的优点:免费、安装简单、不用建工程。

其他编程软件选择:

  • Visual Studio (Windows)
  • Xcode (MacOS)
  • Eclipse-CDT

一些轻量级的IDE,有编辑器功能(但该功能很丰富,如有语法高亮、自动对齐等),然后可以调用外部的编译器,编译完成后运行显示结果。

  • Geany(和MinGW一起)【Geany提供编辑器功能,可以调用MinGW的编译器】
  • Sublime(和MinGW一起)
  • vim/emacs(和MinGW一起)

MinGW(Minimalist GNU on Windows , Windows上最小的GNU编译器)。【Geany提供编辑器功能,可以调用MinGW的编译器。Geany不仅可以写C,还能写很多其他语言如C++、Java、Python…,只需要进行相应配置即可】

轻量级的编程软件,如Geany+MinGW或Sublime Text+MinGW,与专门的IDE如Dev C++相比,什么功能没有了 (A):
A、单步调试
B、源代码编辑时的语法高亮
C、编译程序
D、运行程序

解析:正确答案A。Geany这些具有编辑器功能,且有语法高亮、自动对齐等功能;MinGW提供GNU编译器;编译后便可以运行。专门的IDE具有单步调试功能,而诸如Geany等轻量级编程软件不提供该功能。

第一个程序

第一个C程序:在Dev C++中编辑,编译和运行程序

学习其他的编程语言可选的 IDE(包括其中的编译器) 比较少(比如Java用的编辑器就是Oracle下面的JDK),因为这些语言的诞生伴随着相对较强势的团队在支撑该语言。

C语言诞生已久,在这么长的时间内,有很多人按照C语言的标准做东西。所以这就造成了C语言的编程软件很多,编译器很多。虽然有C语言的标准,但不同厂家制作的编译器还是有细微差异。现在公认比较好的C语言编译器是 GNU 下面的 gcc。Dev C++的编译器使用的就是gcc。

下面使用Dev C++编写第一个C程序:
打开Dev C++,文件 - 新建 - 源代码。然后在右边代码区编写代码。
在这里插入图片描述

#include <stdio.h>

int main()
{
	printf("Hello World!\n");

	return 0;
}

 

可在Dev C++中选择代码风格(括号风格不影响编写代码和代码的运行,关键在个人习惯。由于Dev C++中编译器使用的是GNU中的gcc,这里先选择GNU的括号风格)。
在这里插入图片描述

 
源代码写完之后,在编译运行之前需要先保存源代码(由于Dev C++可以运行C++的代码,因此Dev C++会默认为C++的源代码。我们这里是在学习C语言,因此这里选择C的源代码):
在这里插入图片描述

编译、运行:
在这里插入图片描述

点击 编译 按钮:
在这里插入图片描述

编译没有出错,说明编译成功,程序可以运行。点击 运行 按钮(就会在 终端/命令行/黑窗口 中显示程序运行结果):
在这里插入图片描述
 
或者直接点击 编译运行 按钮,会先编译后运行。

程序一旦编译完成后,便可以多次运行。

详解第一个C程序:程序框架、printf、出错怎么办

程序框架

#include <stdio.h>

int main()
{
	//代码段
	
	return 0;
}

本课程中所有的程序都需要这一段,直到学函数之前,我们的代码都只是在这个框架中间。

输出

  • printf(“Hello World!\n”);
  • ""里面的内容叫做“字符串”,printf会把其中的内容原封不动地输出
  • \n表示需要在输出的结果后面换一行

程序中的错误

  • 编译的时候发现错误的地方会以红色的底表示出来
  • 具体的错误原因列在下方的窗口里(是英文的)
  • C的编译器给出的错误提示往往不那么好“猜”
    在这里插入图片描述

注意
程序中的括号、引号、分号等都必须是英文的。因为计算机实际上只认识数字,英文字符都会转换为对应的ASCII码,而中文字符没有在ASCII码中。

做点计算:如何让计算机输出算术结果

做计算

  • printf(“%d\n”,23+43)
    • %d说明后面有一个整数要输出在这个位置上
  • printf(“23+43=%d\n”,23+43)

占位符: %d说明后面有一个整数要输出在这个位置上

在这里插入图片描述
在这里插入图片描述

四则运算

四则运算C符号意义
++
--
×*
÷/
%取余
()()括号

运算符 % :表示取两个数相除以后的余数。

选学:MacOS或Linux如何在命令行编辑、编译、运行C

在MacOS上推荐使用的IDE工具是Xcode。也可以使用轻量级的编程软件Sublime,但是在Sublime中无法执行输入程序,因此具有局限性。

也可以在命令行中编辑(vim编辑器)、编译、运行C程序:
在这里插入图片描述

章节总结

讨论一:GCC是什么?

常听到有人说他学的是Visual C,有人学的是Turbo C,不是我们学的什么Dev C,是他们的比我们的高级吗?还有GCC到底是什么?

答:GCC最早是GNU的C语言编译器,如今已是GNU一系列编译器的集合。Visual C,Turbo C,Dev C是不同的IDE(集成开发环境),内置了不同的C语言编译器,其对C标准的实现不同。一般认为Dev C内置GCC的编译器与C标准更贴切。可能Dev C调试程序没有VC舒服,界面没有VC好看,但是编译效果毫不逊色。

讨论二:main()的样子

为什么看到有的书上的main()是void main(),而我们课件上是int main()?还有main()里面那句return 0;是必须的吗?

答:C语言发展历史过程中,void main()int main()这两种形式都是被允许的(或者曾经被允许的)。到了C90,main()函数被要求声明为:

int main()
int main(int argc,char **argv)

或者其等价的形式,比如int main(int argc,char *argv[])。且int返回类型是默认的,所以在写法上可以被忽略,比如写成main()

而到了C99,main()前面的int变成是必须的了。另外对于C99,如果main()执行到最后没有return,那默认会返回0。

再另外,可以用以下命令做个小实验:

$ gcc -std=c99 file.c # 使用C99标准来编译file.c
$ ./a.out # 执行编译后的程序
$ echo $? # 输出该程序的返回值

如果在编译时不指定要输出成的文件名,那么编译生成的文件名就是a.out。命令./a.out运行编译生成的文件a.out ,前面的 ./ 是Unix为了安全的一种手段。

这里命令的含义可参考目录 “选学:MacOS或Linux如何在命令行编辑、编译、运行C” 部分。

【return后跟返回值,void声明为空返回值,int声明函数返回int类型返回值,依次类推float、bool、double等。因为程序中函数的作用经常是处理一些数据,或进行某种运算,而其处理结果需要被返回调用(或表明该函数是否正常完成预期处理过程)。main函数是一个程序主程序入口,其他函数可以在main函数内调用

补充:
int main()表示可以带任意参数;int main(void)表示无参数。

获取输入的程序

#include <stdio.h>

int main()
{
	int price = 0;
	printf("请输入金额(元):");
	scanf("%d",&price);
	
	int change = 100 - price;
	printf("找您%d元。\n",change);

	return 0;
}

在这里插入图片描述

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值