第一周:简单的计算程序

1.1 第一个程序 Hello World!

集成开发环境(IDE)

下载Dev C++的地方是:

http://sourceforge.net/projects/orwelldevcpp/?source=directory

提示:Dev C++只能在windows操作系统下安装

由于做c语言的编译软件的厂家很多,不同的厂家又有不同的方言。

因此我们统一用Dev C++软件(集成开发环境),在上面的地址下载默认安装即可。

提示:Dev C+= 是一款集成开发环境的软件,包括编辑器、编译器、调试器和图形用户界面等功能。

程序框架

#include <stdio.h>

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

输出

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

第一个Hello World程序

#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}

执行结果:

Hello World!

程序语句及符号

  • c语言每条语句以英文输入状态下的分号结束
  • 大括号、小括号等其他的符号也是需要在英文状态下输入,换句话说只有双引号里可以输入中文或中文状态下的各种符号。
  • 分号和语句间可以隔空格字符或者换行等空白字符,编译器一样可以识别,但是不能缺少分号,否则程序就会报错。

1.2 变量

如何输入

  • 输入也在终端窗口中
  • 输入是以行为单位进行的,行的结束标志就是按下了回车键。在按下回车之前程序不会读到任何东西。

变量赋值和初始化

  • int price = 0;
  • 这一行,定义了一个变量。变量的名字是price,类型是int,初始值是0.
  • 变量是一个保存数据的地方,当我们需要在程序里保存数据时,就需要一个变量来保存它。
  • price = 0 是一个式子,这个的"="是一个赋值运算符,表示将"="右边的值赋给左边的变量。

变量定义

  • 变量定义的一般形式:

    • <类型名><变量名>;
  • 例如
    • int price;
    • int amout;
    • int price,amount; //等价于int price; int amount;

变量的名字

  • 变量需要一个名字,变量的名字是一种“标识符”,意思是它是用来识别这个和那个的不同的名字。
  • 标识符有标识符构造的规则,基本的原则是:
    • 标识符只能由字母、数字和下划线组成
    • 数字不可以出现在第一个位置上
    • C语言的关键字(有的地方叫他们保留字)不可以用作标识符

赋值运算符"="和数学的'"="'差异

  • 和数学不同,a=b在数学中表示关系,即a和b的值一样
  • 而在程序设计中,a=b表示要求计算机做一个动作:将b的值赋给a
  • 关系是静态的,而动作是动态的。
  • 在数学中,a=b和b=a是等价的,而在程序设计中,两者的意思完全相反。

初始化

  • 定义:当赋值发生在程序定义变量的时候就是变量的初始化。(定义变量并赋值)
  • 所有变量在第一次使用之前都应该被赋值一次。
  • 在c语言中如果变量没有做初始化,变量会随机指向内存中的某一个值,因此建议在声明变量时就先初始化,否则可能导致程序运行出意外的结果。

变量初始化

  • <类型名称><变量名称> = <初始值>;

    • int price = 0;
    • int amount = 100;
  • 组合变量定义的时候,也可以在这个定义中单独给单个变量赋初值,如:
    • int price = 0,amount = 100;

变量类型

  • C语言是一种有类型的语言,所有的变量在使用之前必须定义或声明,所有的变量必须具有确定的数据类型。
  • 数据类型表示在变量中可以存放什么样的数据,变量中也只能存放指定类型的数据,程序运行过程中也不能改变变量的类型。

ANSI C标准和C99标准的定义变量的区别

  • ANSI C只能在代码开头的地方定义变量。
  • C99在使用变量前定义变量即可。

读取整数

  • scanf("%d",&price);
  • 要求scanf这个函数读入下一个整数,读到的结果赋值给变量price

常量

  • int change = 100 - price;
  • 固定不变的数,是常数。直接写在程序里,我们称作直接量(literal)
  • 更好的方式,是定义一个常量:
    • const int AMOUNT = 100; //C99
    • 常量的命名通常使用全大写的方式命名,便于区分。
    • 常量可以增加程序可读性(见名知义)
    • 常量便于修改,比如我们要修改上面的100就只需要修改初始化的地方就可以,而写成直接量就需要修改每一个用到的地方。
  • const是一个修饰符,加在int的前面,用来给这个变量加上一个const(不变的)的属性。这个const的数学表示这个变量的值一旦初始化,就不能再修改了。
  • 如果你试图对常量做修改,把它放在赋值运算符的左边,就会被编译器发现,指出为一个错误。

找零程序

假设有一个杂货铺,顾客有一张面额100的钞票,要求设计一个程序给店主,输入购买商品的总额并,并且计算出应该找零给顾客多少钱。

(假设金额都为整数且商品总额小于100)

#include <stdio.h>

int main(int argc, char *argv[]) {
const int AMOUNT = 100;
int change = 0;
int price = 0; printf("请输入金额(元):");
scanf("%d",&price);
change = AMOUNT - price;
printf("找您%d元。\n",change);
return change;
}

执行结果:

请输入金额(元):98
找您2元。

附录:C语言常见的保留字

auto,break,case,char,const,
continue,default,do,double,
else,enum,extern,float,for,
goto,if,int,long,register,return,
short,signed,sizeof,static,
struct,switch,typedef,union,
unsigned,void,volatile,while,
inline,restrict

1.3 计算

整数之间的运算

  • 两个整数的运算结果只能是整数

    • 例如10/3在c语言中的运行结果为3,c语言会自动抹掉小数后的部分(.3333...)。
  • 1010.0在C中是完全不同的数
  • 10.0是浮点数,10是整数

浮点数

  • 带小数点的数值
  • 浮点这个词的本意就是指小数点是浮动的(小数点在数字中出现的位置是可变的),是计算机内部表达非整数(包含分数和无理数)的一种方式。与浮点对应的计算机内部表达非整数的方式还有一种称作定点数。
  • 当浮点数和整数放到一起运算时,C会先将整数转换成浮点数,然后再进行浮点数的运算

double

  • double的意思是"双",它本来是“双精度浮点数”的第一个单词,人们用来表示浮点数类型。
  • 除了double,还有float(意思就是浮点!)表示单精度浮点数

整数和小数的输入输出

  • 整数

    • int
    • printf("%d",...);
    • scanf("%d",...);
  • 带小数点的数
    • double
    • printf("%f",...);
    • scanf("%lf",...);

身高转换程序

设计一个程序将英尺和英寸表达的升高转换为米表达,例如5英尺7英寸表示1.701800米。

#include <stdio.h>
int main(int argc, char *argv[]) { printf("请分别输入身高的英尺和英寸,"
"如输入\"5 7\"表示5英尺7英寸:"); double foot = 0;
double inch = 0; scanf("%lf %lf",&foot,&inch);
printf("身高是%f米。\n",((foot + inch / 12) * 0.3048));
return 0;
}

执行结果:

请分别输入身高的英尺和英寸,如输入"5 7"表示5英尺7英寸:5 7
身高是1.701800米。

表达式

  • 一个表达式是一系列运算符和算子的组合,用来计算一个值。
  • 运算符(operator)是指进行运算的动作,比如加法运算符"+",减法运算符"-"
  • 算子(operand)是指参与运算的值,这个值可能是常数,也可能是变量,还可能是一个方法的返回值。
  • 例如在表达式: change = AMOUNT - price; 中,change、AMOUNT和price全都是算子,"="和"-"则是算子。

时间差计算程序

#include <stdio.h>
// 计算第一个时间段和第二个时间之前的时间差,例如3点10分和1点30分 的时间差为1个小时40分钟
int main(int argc, char *argv[]) {
int hour1, minute1;
int hour2, minute2; printf("请输入第一个时间,分别输入小时和分钟."
"输入\"3 10\"表示3点10分:");
scanf("%d %d", &hour1, &minute1);
printf("请输入第二个时间,分别输入小时和分钟."
"输入\"1 30\"表示1点30分:");
scanf("%d %d", &hour2, &minute2); int t1 = hour1 * 60 + minute1;
int t2 = hour2 * 60 + minute2; int t= t1 - t2; printf("时间差是%d小时%d分。",t / 60, t % 60);
return 0;
}

执行结果:

请输入第一个时间,分别输入小时和分钟.输入"3 10"表示3点10分:3 10
请输入第二个时间,分别输入小时和分钟.输入"1 30"表示1点30分:1 30
时间差是1小时40分。

算术符优先级

赋值运算符

  • 赋值也是运算,也有结果
  • a=6的结果是a被赋予的值,也就是6
  • a=b=6 等价于 a=(b=6) 单目自右向左计算

嵌入式赋值

int a = 6;

int b;

int c = 1 + (b = a);

不建议使用嵌入式赋值,因为嵌入式赋值有以下两个缺点:

  • 不利于阅读
  • 容易产生错误

结合关系

  • 一般自左向右
  • 单目"+""-"和赋值"="自右向左

1.4 编程作业及课后讨论

题目内容:

程序每次读入一个正三位数,然后输出逆序的数字。注意,当输入的数字含有结尾的 0 时,

输出不应带有前导的 0。比如输入 700,输出应该是 7。

输入格式:

每个测试是一个 3 位的正整数。

输出格式:

输出逆序的数。

输入样例:

123

输出样例:

321

解题思路:

  1. 首先我们需要两个变量A和B,A存储用户的输入数字,B存储逆序的数字。(当然也可以只要一个变量A,逆序的数字直接输出即可,这里为了便于理解声明了两个变量)
  2. 获取用户输入的整数放入变量A
  3. 将变量A逆序放入变量B
  4. 输出变量B

进一步分析,步骤三还需要做拆分。我们知道一个三位数由个位、十位和百位组成,因此我们需要做的就是将A的百位放到B的个位再将A的个位放到B的百位,最后得到的就是A的倒序的一个三位数了,列如123将百位和十位互调的结果就是321

3.将变量A逆序放入变量B

3.1 取A的百位放到B的个位。

3.2 取A的十位放到B的十位。

3.3 取A的个位放到B的百位。

反转数字

#include <stdio.h>

int main(int argc, char *argv[]) {
int a;
int b; printf("请输入一个三位的整数:");
scanf("%d",&a);
// 个位 + 十位 + 百位
b = a / 100 + a % 100 / 10 * 10 + a % 10 * 100;
printf("%d\n",b);
return 0;
}

执行结果:

请输入一个三位的整数:123
321

扩展思考:到这里我们的程序算是符号题目要求了,但它还不是一个健壮的、好的程序。试想当用户输入的不是整数而是小数结果会怎么样呢? 又或者用户输入的根本就不是数字呢? 并且我们的程序只能反转三位数,如何反转四位数、五位数甚至n位数呢?




讨论题

标题:不好的表达式

内容:

看看如何分析这个表达式:

a=5;

b=0;

c = (b=a+2) - (a=2);

看看这个表达式的结果,会使得 c 是什么?为什么说这是个不好的表达式?

题目分析:

单目和赋值运算符自右向左,加、减、乘、除和取余运算符自左向右。

因此c = (b=a+2) - (a=2) 表达式的计算顺序为:

  1. (b=a+2) -> 7
  2. (a=2) -> 2
  3. (b=a+2) -(a=2) -> 5
  4. c = (b=a+2) - (a=2) -> 5

    通过计算我们知道最后的结果是5,

为什么说嵌套赋值是不要的表达式呢?

  • 表达式不容易理解,一眼看不出这个表达式的计算顺序,需要仔细的分析。
  • 由于是嵌套表达式,a和b的值在运算的过程中是会发生变化的,比如我们要搞清楚b被我们赋值的那个值最后是否是我们希望的那个值就要格外小心,稍不留神就容易出错。

我们可以试着把以上表达式拆分成下面的表达式。

a = 5;
b = a + 2;
a = 2;
c = b - a;

这样是不是一目了然了呢?

程序设计入门-C语言基础知识-翁恺-第一周:简单的计算程序-详细笔记(一)的更多相关文章

  1. 程序设计入门-C语言基础知识-翁恺-第二周:简单的计算程序-详细笔记(二)

    目录 第二周:判断 2.1 比较 2.2 判断 2.3 课后习题 第二周:判断 2.1 比较 简单的判断语句: if(条件成立){ //执行代码 } 条件 计算两个值之间的关系,所以叫做关系运算 关系 ...

  2. 程序设计入门-C语言基础知识-翁恺-期中测试

    一.试题 程序设计入门—C 语言期中测评 试题下载地址: http://nos.netease.com/edu-lesson-pdfsrc/217E194E46A6595A3F554380337490 ...

  3. 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)

    目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...

  4. 程序设计入门-C语言基础知识-翁恺-第五周:函数-详细笔记(五)

    目录 第五周:函数 5.1 函数 5-2 使用函数 5.3 课后习题 第五周:函数 5.1 函数 什么是函数? 函数是一块代码,接受零个或多个参数,做一件事情,并返回零个或一个值. 函数声明语法 返回 ...

  5. 程序设计入门-C语言基础知识-翁恺-第四周:循环控制-详细笔记(四)

    目录 第四周:循环控制 4-1 for循环 4-2 循环控制 各运算符优先级(图) 4-3 课后习题 4-4 讨论题 第四周:循环控制 4-1 for循环 for循环像一个计数循环:设定一个计数器,初 ...

  6. 程序设计入门-C语言基础知识-翁恺-第六周:数组-详细笔记(六)

    目录 第六章:数组 6-1 数组 6-2 数组计算 6.3 课后习题 第六章:数组 6-1 数组 题目:让用户输入一组整数以-1结束输入,算出这组数的平均值,并且输出大于平均值的数. 我们需要记录用户 ...

  7. 程序设计入门-C语言基础知识-翁恺-第三周:循环-详细笔记(三)

    目录 第三周:循环 3.1 循环 3.2 循环计算 3.3 课后习题 3.4 讨论题(不需要掌握) 第三周:循环 3.1 循环 while循环 语法: while(条件表达式){ //循环体语句 } ...

  8. Golang 入门系列(三)Go语言基础知识汇总

    前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...

  9. 程序设计入门——C语言 习题汇总

    <img width="108" height="40" alt="浙江大学" src="http://imgsize.ph ...

随机推荐

  1. LVS-net

    一.LVS基本情况 lvs:Linux Virtual Server,是一种负载均衡集群,其主要是由工作在内核的ipvs与用户空间的命令行工具ipvsadm组成.支持TCP,UDP,AH,EST,AH ...

  2. vue集成ueditor

    相关代码见github 1.引入ueditor相关的文件,具体目录见下图如下 我将下载的文件放在static下面,这里专门用来放置相关的静态文件 (在ueditor.config.js需要配置一下路径 ...

  3. QT 样式表基础知识

    1. 何为Qt样式表2. 样式表语法基础3. 方箱模型4. 前景与背景5. 创建可缩放样式6. 控制大小7. 处理伪状态8. 使用子部件定义微观样式 8.1. 相对定位    8.2. 绝对定位 摘要 ...

  4. Java循环语句之 while

    生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 Java 中实现功能时,也经常需要重复执行某些代码,例如,我们为了表示 ...

  5. MySQL Order By Rand()效率分析

    最近研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() L ...

  6. 【Python】深入浅出学习Python的yield和generator

    背景 之前走马观花接触过Python协程的概念,这两天和一个同事聊到了协程,死活想不起来曾经看过的东西,就记得一个yield,概念不清: 所以想捋一捋相关的东西,此篇作为学习的记录. Generato ...

  7. 【三小时学会Kubernetes!(三) 】Service实践

    服务Service Kubernetes 服务资源可以作为一组提供相同服务的 Pod 的入口.这个资源肩负发现服务和平衡 Pod 之间负荷的重任,如图 16 所示. 图16:Kubernetes 服务 ...

  8. getline

    istream& istream::getline(char*, streamsize,char= '\n'); 函数getline与get的区别在于,函数get当遇到分隔符后,停止获取,并将 ...

  9. ADC和RTC的寄存器的读取

    ADC的寄存器读取,int adc_read(void){ int result; #if ADSTART==0 result = ADC.ADCDAT0&0x3ff; while(!(ADC ...

  10. Python编程

    1.pip的使用.安装 pip show 显示输出版本 pip -V 是否安装成功 pip --help 查看相关帮助