C语言讲义1

更新时间:2024-01-23 12:15:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言常量、变量、运算符和表达式、输入输出

数据类型基本类型指针类型空类型(void)组合类型实型 (浮点 型)

整型(int)字符型(char)单精度型双精度型数组结构联合枚举 字符 char 短整型 short int (略为short) 整型 int 长整型 long int (略为 long) 无符号字符 unsigned char 无符号短整型 unsigned short 无符号整型 unsigned int 无符号长整型 unsigned long 单精度浮点数 float 双精度浮点数 double 大概范围,精度为7位 大概范围,精度为19位 格式字符 12类型 关键字 1 2 4 4 1 2 4 4 4 8 字节 -128~127 -32767~32767 -2147483647~2147438647 -2147483647~2147438647 0~255 0~65535 0~4294967295 0~4294967295 1.2E-38~3.4E38 2.2E-38~1.8E308 12数值范围

windows为32位计算机环境

上表给出的是以此为例的各数据类型占用的内存空间字节数和表示的数值范围 可以利用sizeof()函数获得内存空间字节数

#include “stdio.h” void main()

{

int a; //char a; short a; printf(“%d”,sizeof(a)); }

? 不同类型的数据需要采用不同的方式来存储 ? C语言中有两种存储数值的方式

– 变量

– 常量

? 值不能被改变的量被称为常量

– 字面常量

– 符号常量

? 字面常量

– 字面常量是指在源代码中直接输入的值 – 例如:

? int age=25; //整型常量 ? float score=85.5; //浮点数常量 ? char sex=?f?; //字符常量 ? char name[10]=”lucy”; //字符串常量 ? 其中25、85.5、?f?、 ”lucy”是字面常量

? 整型常量的表示方式

– 首位不为0的常量被视为10进制整数

? 十进制常量可以包含数字0~9,并可以在最前面加上正号或负号(正

号可省略)

– 以0打头的常量被视为八进制整数

? 八进制常量可以包含数字0~7,并可以在前面加上正号或负号 – 以0x或OX打头的常量被视为十六进制整数

? 十六进制常量可以包含数字0~9和字母A~F,并可以在前面加上

正号或负号

? 符号常量

– 在程序中用一个符号来表示一个常量

– 这个符号就被称为符号常量 – 例如:

? 圆周率π的值(3.14)

? C语言中使用预编译处理命令#define来定义符号常量

? #define PI 3.14 //注意:#define语句不以分号结尾 ? 则可以这样计算圆的面积:area=PI*r*r

? 常量不能修改,程序中写 PI=3.1415 这样会引发错误

? 变量的概念

– 程序运行中,其值可以被改变的量是变量

– 变量是计算机内存中一个被命名的数据存储位置 – 使用变量名时实际上用的是存储在这里的数据的值

? 变量定义

– 任何变量都必须遵守先定义后使用的原则

– 变量定义的一般形式

? [存储类别] 数据类型 变量名1,变量名2…;

? 存储类别不是必须要求声明的部分,后面章节中将讲到这个

概念

? int num1,num2; //定义num1,num2为整型变量 ? float avg; //定义avg为实型变量 ? char ch1,ch2; //定义ch1,ch2为字符型变量

? 变量定义的位置

? 定义在哪里是至关重要的

? 在哪里定义决定着这个变量在哪些范围内有效

? 现学习阶段,可将所有变量声明放在一起,并放置于main()函数的

主体语句中的前面

? 变量的初始化

– 定义变量时指示计算机为变量留出存储空间 – 变量值并没有指定,可能为随机值

– 使用变量前,一定要将其初始化为一个确定的值

? 变量初始化方法

– 定义变量的同时进行赋初值的操作

– 定义变量后,使用赋值语句来初始化变量

? int num1=34,num2; ? ? ? ?

num2=67;

定义了num1和num2两个整型变量 定义的同时初始化num1为34

使用了等号“=” 赋值运算符将67赋给变量num2

? 初始化注意事项

– 不要将变量初始化为该变量数据类型所表达的值域允许范围之外的值

? short int weight=100000;//错误

? C编译器也许不会发现这种错误,因此程序将被编译和链接,但当

程序运行时,结果将可能与预期的不同

? 初始化原则

– 了解不同类型变量占用的字节数,不要试图将超出变量取值范围的值赋给变

– 声明变量时,应尽可能对它进行初始化

– 存储整型数据时,尽量不要使用float或double变量,会降低效率 – 不要将负值赋给unsigned变量

? 特殊的char数据类型

– C语言使用char数据类型来存储字符。 – 例如?5?,?*?,?#?,? ?都是字符

? 计算机内存中,所有数据都以数值方式存储 ? 人们为每个字符进行了相对应的数值编码

? 称为ASCII字符集(ASCII表示美国信息交换标准码)

? 例如:字母a的ASCII码为97。那么,当在char变量中存

储字符a时,实际存储的是97

? char变量处理

– 使用char变量之前必须声明;也可以在声明的同时对它进行初始化 ? char ch,ch1,b='f'; ? char code='3';

– 函数printf()可用于打印字符和数字

– 格式字符串%c指示printf()打印一个字符,而%d指示它打印一个十进制整

#include \void main() {

char ch1='a'; char ch2=90;

printf(\作为一个字符ch1=%c\ printf(\作为一个数字ch1=%d\ printf(\作为一个字符ch2=%c\ printf(\作为一个数字ch2=%d\\n\}

? 什么是运算符?

– 运算符是一个命令编译器对一个或多个操作数执行某种运算的符号 – 类似于“+”、“-”等

– 操作数是运算符对其执行操作的东西 – 类似于“1”、“a”等

– 例如:a+1中,“+”为运算符, “a”、“1”为操作数

? 什么是表达式?

– 表达式可以是任何计算结果为数值的东西 – 有各种复杂程度不同的表达式

? 最简单的表达式只包含一项:一个简单变量、字面常量或符号常量

? 例如:PI:程序中定义的符号常量

? 复杂表达式由多个简单的表达式组成

? 表达式之间用运算符连接

? 例如:3*9、a=4+9等赋值语句

? 赋值运算符

– 赋值运算符是一个等号(=)

– 编程中的用途与数学中的“相等”是不同的 – 例如下面的语句:

? int a =3,b;

? b = a;

? 指的是将a的值“3” 赋给b,而不是说a等于b

? 赋值运算符的格式

– 变量=表达式

? 赋值语句的右边可以是任何表达式(expression) ? 但左边必须是一个变量名

? 例如:

? int a=2,b=3,c; ? c=a*2+b;

? 该句被执行时,将计算表达式a*2+b的值,并将结果7赋给变量c

? 算术运算符

– 算术运算符是执行诸如加、减等数学运算的 – 2种单目算术运算符

– 5种双目算术运算符

? 注:“目”就是代表参与运算的操作成员数量

? 单目算术运算符

– 单目数学运算符是指完成此类运算只需要一个操作数

格式字符 运算符 符 号 操 作 范 例 递增 递减

++ -- 将操作数加1 将操作数减1 ++x、x++ --x、x-- ? 递增与递减运算符

– 只能用于变量,而不能用于常量 – 分别将操作数加1和减1

? ++a; 等价于 a=a+1; ? --b; 等价于 b=b-1;

– 这两个运算符放在操作数的前面(前缀模式),和放在操作数的后面(后缀

模式)时,效果却不等价

? 采用前缀模式时,先执行递增或递减运算,再计算表达式的值

? 采用后缀模式时,先计算表达式的值,然后再执行递增或递减操作

#include \void main() {

int a=8,b;

b=a++; //先取a的值做赋值给b,再执行a=a+1 }

printf(\? 双目算术运算符

– 双目运算符需要两个操作数

运算符 格式字符

加法

减法

乘法

除法

求模

符号 + - * / %

将两个数相加

操 作

将第1个操作数减去第2个操作数

将两个操作数相乘

将第1个操作数除以第2个操作数

第1个操作数除以第2个操作数得到的余数

范例 a+b a-b a*b a/b a%b

? “+”、“-”、“*”、“/”大家都很熟悉

? 求模(取余)运算

– 返回第一个操作数除以第二个操作数后得到的余数

– 该运算符要求两边的操作数都是整型 – 例如:

? 10%3=1 (商为3,余数为1) ? 25%5=0 (商为5,余数为0) ? 2%7=2 (商为0,余数为2)

? 求模运算符应用广泛

? 要求用户输入一个三位数的整数,倒序输出,478变874

? ? ? ? ? ?

#include \void main() {

int a,b,c,d;

printf(\请输入三位数的整数\

scanf(“%d”,&a); //假设输入了456赋给变量a

? printf(\输入的数字是:%d\\n\

? b=a; //利用%符号得到了个位数字6,将该值赋给变

量b ? a=a/10; //除号的两边都是整数时,做整除,456被10

整除变成了45 ? c=a; //45 后得到了个位数字5,将该值赋给变

量c ? a=a/10; //a再次做整除,45被10整除变成了4 ? d=a; //4=4赋给了变量 d ? printf(\倒序后为:%d%d%d\\n\

? }

? 运算符优先级

– 有关运算执行顺序的规则

? 每个运算符都有一个优先级

? 计算表达式时,先执行优先级高的运算符 ? 下表中的“1” 表示优先级最高

格式字符

运 算 符 ++、-- *、/、% +、-

相对优先级

1 2 3

? 表达式计算顺序

? 表达式中包含多个优先级相同的运算符,则按从左到右的顺序依次计算

? 例如:15/3*4%3

? 表达式的结果为2(15/3=5 ,5*4=20,20%3=2) ? 如果我们希望先计算乘法再执行其它运算呢? – 改写为:15/(3*4)%3

– 结果变成1(3*4=12 ,15/12=1,1%3=1)

? 使用圆括号可以改变计算顺序

– 在表达式中,可以使用多个圆括号,并且可以嵌套 – 当圆括号被嵌套时,从内向外计算表达式

? 表达式:num=10*(22/(6-4)-7);

? 表达式的计算顺序如下:

? 1.计算最里面括号内的表达式6-4,结果为2。表达式变为:

? 10*(22/2-7)

? 2.接着计算表达式22/2,结果为11,表达式变为: ? 10*(11-7)

? 3.计算括号内的表达式11-7,结果为4,表达式变为: ? 10*4

? 4.最后结果为num=40 。

? 通常会在书写表达式时,为清晰思路,即使不改变运算符优先级,

也会使用圆括号

? 注意:圆括号必须成对出现,否则编译器将产生错误消息

? 关系运算符

? 关系运算符用于比较表达式

? 例如比较两个数字大小时等问题

? 关系运算符所组成的表达式的结果为真true(1)或假false(0)

#include \void main() {

int a=3,b=4,c=3; printf(\ printf(\ printf(\

printf(\ }

? 关系运算符注意事项:

? C语言将真(true)解释为1,假(false)解释为0。

? 不要将描述相等关系的关系运算符“==”和赋值运算符“=”混淆 ? 关系运算符的正确理解对于我们后面学习条件语句的使用非常重要

? 关系运算符的优先级

? 使用关系运算符的表达式中,也可用圆括号来改变优先级

printf(\printf(\printf(\printf(\

格式字符 运 算 符 <、<=、>、>= 相对优先级 1 2 !=、== ? 关系运算符的优先级低于算术运算符

– 例子:

– int a=3,b=4,c=4,d=2; – num=a+b>c*d

? 将先计算c*d=8

? 再计算a+b=7

? 然后比较两个值的大小7>8?

? 结果为0赋给num

? 逻辑运算符

? 现实中,评价一个问题时通常要多方参考

? 例如:

? 评选优秀学员的条件

? 出勤率达到95%以上

? 各门课程的平均分在90分以上

? 要用到逻辑运算符把两个条件表达式进行组合

? 三种逻辑运算符

格式字符 运算符 符号 范例 与(AND) 或(OR) 非(NOT)

&& || ! exp1 && exp2 exp1 || exp2 !exp1 ? 逻辑运算符的运算规则

? exp1 && exp2 ——当且仅当exp1和exp2表达式的值都为真时,整

个表达式的结果为真。

? exp1 || exp2 ——当且仅当exp1和exp2表达式的值都为假时,整

个表达式的结果为假。

? !exp1 ——当exp1本来为真时,结果为假;本来为假时,结果为真。

? 逻辑运算符的优先级

? “!”是单目运算符

? 优先级高于“&&”和“||”和所有的关系运算符及所有的双目数学运算符

? 运算符“&&” 的优先级高于“||”

? 它们的优先级低于所有的数学运算符和关系运算符

? 同样也可以使用圆括号来改变计算顺序

? 复合赋值运算符

? 复合赋值运算符是指将双目算术运算符和赋值运算符组合在一起, 提供了

一种简单的方式

? a+=3; 等价于a=a+3; ? a*=3; 等价于a=a*3;

? a/=3; 等价于a=a/3; ? a-=3; 等价于a=a-3;

? a%=3; 等价于a=a%3;

? 当表达式中有多种类型的数据参加运算时,这时涉及到表达式中的类型转换

? 如下程序:

#include \void main()

{ char ch='A'; //大写字母A的ASCII值为65 int a=1; float b=2.1;

double c=10.004;

printf(\整体求和后结果为:%lf\\n\ // %lf为double的输出格式控制符

}

double←float ↑ long ↑ unsigned ↑

int←char, short 说明:

横向向左箭头表示必定的转换,如字符数据必定先转换为整数,short型转为int型,float型数据在运算时一律转换成双精度型,以提高运算精度。

纵向箭头表示当运算对象为不同类型时转换的方向。例如int型与doub1e型数据进行运算,先将int型的数据转换成图double型,然后在两个同类型(double型)数据进行运算,结果为double型。

箭头方向只表示数据类型级别的高低,由低向高转换。 类型转换是由系统自动进行的

? 大部分程序中,都需要在屏幕上显示信息或从键盘读取信息

– 读取信息——输入(Input) – 显示信息——输出(Output) – 常见术语——I/O操作

? printf()函数位于标准C语言库中 ? 是最通用的在屏幕上显示信息的方式 ? 通用格式为:

– printf(格式控制字符串,输出列表)

? 格式控制字符串

– 格式指示符

? 例如%d,%f等,控制了数据的输出格式

– 转义字符

? 如:“\\n” 等,提供特殊的格式化控制,由一个反斜杠和一个字符组成

– 普通字符

? 除格式指示符和转义字符之外的其他字符。这些字符将原样输出

常见转意字符表 \\a 振铃(电脑鸣叫) \\b 退格 \\f 换页 \\n 换行 \\r 回车 \\t 水平制表符 \\v 垂直制表符 \\\\ 反斜杠

\\? 问号 \\?单引号 \\” 双引号

? 格式指示符的一般形式如下:

– %[修饰符]格式字符 – 例如:

? 我们要打印一个有符号的十进制整数(类型为int),则会使用格式字

符%d ? 对于无符号的十进制整数(类型为unsigned int),则使用%u ? 对于浮点变量(类型为float),则使用%f

c d或i u O x或X f e或E g或G s 格式字符

输出单个字符 输出带符号的十进制整数(整数不输出符号) 输出无符号的十进制整数 以八进制无符号形式输出整数 以十六进制无符号形式输出整数 输出带小数点的单精度或双精度浮点数 以指数形式输出浮点数 系统决定采用%f还是%e的格式,从而使输出的宽度最小 输出字符串 说明

? 长度修饰符

– 长度修饰符是“l”,在输出长整型数据时要用

? long a=135790; ? printf(“%ld”,a);

? 注意:因为我们的上机环境是VC++,long 和 int占用的字节长度

都是4,所以,在这里可以不用加上“l”

? 宽度修饰和精度修饰

– 该修饰符的格式为“m.n”,m和n都是整数

? m叫做宽度修饰符,用来指定数据输出的宽度,默认情况下,当指

定宽度大于数字本身宽度时,在该数字前补空格。也可以在m前加数字0,这样就会补数字0

#include \void main() {

printf(\printf(\

}

printf(\printf(\

? 宽度修饰和精度修饰

– m.n中,n叫做精度修饰符

? 对于整型数,它能指定必须输出的数字个数

? 对于浮点数,%m.nf指定输出的数据共占m列,其中有n位小数;如果数值长度小于m,则左端补空格

? 对于格式字符e,来指定输出的有效数字的位数

? 对于字符串,%m.ns能指定一共输出m列,但只取字符串中左端n

个字符;这n个字符输出在m列的右侧,左补空格

#include \void main() { }

? 左对齐修饰

– 输出数据时,默认的是“右对齐”,如果我们希望输出的数据左对齐的话,就

可以使用左对齐修饰符“-”

#include \void main() {

printf(\ printf(\ printf(\ printf(\}

? 某校考试,现有五成绩:97、68.5、85.25、90和78.5。请问这五学生的总分平均分

是多少(要求最终数据精确到小数点后一位)? ? #include \

? void main() ? {

? float sco1=97,sco2=68.5,sco3=85.25,sco4=90,sco5=97;

printf(\printf(\printf(\printf(\printf(\printf(\printf(\printf(\printf(\printf(\

? float sum; //该变量来存放学生的总分 ? float avg; //该变量用来存放学生的平均分

? sum=sco1+sco2+sco3+sco4+sco5; ? avg=sum/5;

? printf(\五名学生的总分为:%.1f\\n\\t平均分为:%.1f\\n\? }

? 函数scanf()

– 按指定的格式从键盘读取数据,并将其赋给一个或多个变量

– scanf()也使用格式化字符串来描述输入格式

? 例如: ? int a;

? scanf(\

? 用于从键盘读取一个十进制整数,并将其赋给整型变量a

? scanf()函数的一般格式

– scanf(“格式字符串”,输入项的地址列表);

? “格式字符串”包含两种种类型的字符:

? 1、格式指示符

? 同printf()的用法大致相同

? 2、普通字符(一般不用)

? 要求在输入时必须原样一起输入的内容

? scanf()函数的一般格式

– scanf(“格式字符串”,输入项的地址列表);

? 输入项的地址列表,是指一条scanf()语句可以输入多个值

? scanf(\

? 输入多个变量时,可以用空格、制表符或换行符来标识每个变量的输

入结束,只要值之间有空白字符,scanf()便能将每个值赋给相应的

变量

? 例如本题可以输入:10 20 5.6 ? 也可以输入:10 20 5.6

? 还可以输入: ? 10 ? 20 ? 5.6

? scanf()注意事项

? 1、scanf(“%d\\n”,&x) 在格式字符串后加个?\\n?是错误的。

? 2、格式字符串中出现的普通字符必须按原样输入。例如:

scanf(\

我们要想把12和23输入到a,b中,必须键入 a=12,b=23 按回车键 ? scanf()使用实例

? 从键盘输入一个大写字母,要求改用小写字母输出。提示:大小写

英文字母的ASCII值相差32。

#include \

void main() { }

? getchar()和putchar()

– 两个无格式控制的,专门用于输入/输出单个字符的函数 – 使用这两个函数时,需要用到”stdio.h”文件 – 要书写头文件#include \

? getchar()函数

? 从终端(或系统隐含指定的输入设备)输入一个字符, getchar函数

没有参数,其一般形式为: ? getchar()

? 函数的值就是从输入设备得到的字符。例如:

#include \ void main() {

char c;

c=getchar(); printf(\

char c1,c2;

printf(\请输入一个大写英文字母:\scanf(\

c2=c1+32;

printf(\该英文字母%c的小写形式为%c\\n\

}

注意:getchar()一次只能接收一个字符

? putchar()函数

? 一次向显示器输出一个字符

? 一般调用形式为:

? putchar(ch);

– 括号中可以是字符变量或字符常量 – putchar(?A?)这样也是可以的

– 上例中的输出语句就可以做如下改变: – printf(\——〉putchar(c)

? gets()和puts()函数

– 无格式控制的专门对字符串处理的函数

– 必须包含头文件stdio.h

? gets()用来接受用户输入的字符串

? puts()函数用来向用户显示一个字符串

– 需要一个字符串参数,显示该参数并自动换行

– puts(\

– 与 printf(\ 的效果相同

顺序和分支结构

? 什么是语句?

– 语句是一条完整的指令

– 用语句可以命令计算机执行特定的任务

? 例如:a=2*3;

? 这样的赋值语句,把2和3的积赋给了变量a

– 通常一条语句占一行

– 也允许一条语句占多行和一行上写多条语句 – 语句之间使用分号间隔

? 语句格式

? 代码中经常会键入一些空白以利于阅读

? C编译器在读取源代码中的语句时,会查找语句中的字符和末尾的

分号,但会忽略空白 – a=2*3; 和语句:a = 2 * 3 ;是等价的

? 书写语句时比较好的习惯应该是:

– 每条语句占一行

– 在变量和运算符的两边加上空格 – 确保源代码易于阅读

? 注意:字符串常量中的制表符和空格不会被忽略

– “How are you !”与“how are you!”是不同的

? 复合语句概念

– 复合语句也叫代码块

– 指一组用花括号括起的语句

? 例如:

{ printf(\ printf(\

/*注意使用这种形式时花括号应对齐,这样容易找到代码块的开始和结束位置,里面的内容应有适当的缩进*/

}

等价于printf(\

整个复合语句是作为一个整体来对待的,在条件及循环中有非常重要的应用

? 顺序结构

? 顺序结构程序是最简单的程序

? 按其在源文件中的出现顺序从前到后依次执行

? 主要由说明语句、表达式语句、复合语句等语句构成

– 例:输入矩形的长和宽,求矩形的面积 – #include \

– void main()

– { float a=0,b=0,area; //说明部分:a代表长,b代表宽,

area代表面积

– printf(“请输入矩形的长和宽\\n\

– scanf(\

– area=a*b; //表达式语句部分

– printf(\长为%.2f宽为%.2f的矩形面积为%.3f\\n\– }

? 分支结构概念:

? 分支结构即选择结构

? 代表解决某件事情的时候,需要经过判断不同的情况来给出相应的处理方

法。

? if 语句语法格式及实例

? if语句的基本格式是,对一个表达式(expression)进行计算,该表

达式一般由关系运算符和逻辑运算符组成。 ? 根据计算结果决定是否执行后面的语句(statement) ? if语句的格式如下:

– if(表达式)

? {

– 语句或语句块;

– }

– 如果 表达式 的运算结果为true,则执行 语句;否则不执行。 – 无论结果如何,都将接着执行if语句后面的语句,即右花括

号后面的语句。 – if(表达式)和语句;一起组成了完整的if语句,它们并非两条

独立的语句。

? if语句与代码块

? 条件满足时,我们通常不只要做一件事情

? if语句后往往加上一对花括号,书写要执行的代码块

if(表达式) {

语句1; 语句2; ...

语句n; }

? if语句与关系表达式

– if语句最常与关系表达式一起使用

– 仅当条件为真时,才执行if下面的语句

? 说明:if语句后面其实可以是任意表达式

– if(1) x=10; – if(3) x=5;

– //因为C语言中所有的非0值都为真,所以,这样的表达式

为恒真 – if(0) x=10; //恒假

? 例程

? 输入两个实数,按代数值由小到大的顺序输出这两个数,如何处理?

– 分析:

? 设定两个变量a,b分别代表输入的两个数字 ? 如果a小于或等于b,就直接输出a,b即可

? 如果a大于b,就需要把a和b中的内容进行交换,

然后输出a,b即可 ? 交换a,b中的值,需要借助第三方变量,来完成我

们的交换 ? 程序需要设置三个变量

#include \void main() {

float a,b,t;

scanf(\if(a>b)

{ t=a; //交换变量值的三个步骤

a=b; //使用t作为中间过渡变量

b=t; //完成交换

}

}

printf(\? 例程:

? 输入三个实数,按代数值由小到大的顺序输出这三个数

– 与两个数字有一些相似 – 但是需要更多次数的交换

– 考虑算法……

#include \void main() {

float a,b,c,t;

printf(\

scanf(\

if(a>b) //通过这条if语句保证了a,b中数值的关系是从小到大的 {

t=a; a=b; b=t;

}

if(a>c) //这条if语句保证了a,c中数值的关系是从小到大的排列关系为:abc或acb {

t=a; a=c; c=t; }

if(b>c) //通过上面的分析,只要确定了b,c的关系就可以了 { t=b; b=c; c=t; }

printf(\}

? if …else 语句语法

? if语句中也可以包含else子句,格式如下:

if (表达式) { 语句1; } else {

语句2; }

后面的语句

? if...else执行方式:

? 如果表达式为真,则执行语句1;否则执行语句2

? 语句1和语句2都可以是复合语句(代码块)

? 不管执行了语句1还是语句2,都会继续执行后面的语句

? 注意:

– 我们要注意语句结束后的分号,不该有的分号不要多加 – else 是if的子句,必须是if语句的组成部分,else子句不能

作为语句单独使用

#include \#include \void main() {

float a,b,c,s,area;

printf(\请输入三角形的三条边长\\n\ scanf(\

if(a+b>c&&a+c>b&&b+c>a) //合法三角形判断,任意两边之和大于第三条边 {

s=0.5*(a+b+c);

area=sqrt(s*(s-a)*(s-b)*(s-c)); //利用求三角形面积的公式进行代入值计算 printf(“三角形面积为%6.2f\\n\ } else }

{ }

? 使用if...else语句重写两数判断问题 #include \void main() { }

float a,b;

printf(\scanf(\

if(a>b)

{ printf(\else

/*注意:else后面不能直接书写条件表达式,

但是它隐含了当a>b不满足的情况,即a<=b的情况*/ {

printf(\ } printf(\的值无法构成三角形\\n\

? 多分支if语句一般格式 if (表达式1) {

语句1;

}

else if(表达式2) { } else {

语句3;

语句2;

}

下面的语句

? 有一个函数:根据x的不同范围,求y的值 #include \void main() {

int x,y;

printf(\scanf(\if(x<0) y=-1;

else if(x>0) //隐含了x<0的反意思,即x>=0

//因else后无法直接跟表达式,嵌套if语句 y=1;

else //剩下一种情况,就是x=0的情况

y=0;

printf(\}

? 嵌套if语句语法格式

? 在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式

如下:

if (表达式1) if(表达式2)

{ 语句1 } ?else

{ 语句2; } else if (表达式3) { 语句3; } ?else { 语句4; }

重写三数排序程序: #include \void main() {

float a,b,c;

printf(\

scanf(\ if(a>=b) {

if(b>=c)

{printf(\ else

if(c>=a)

{printf(\ else

{printf(\ else {

if(a>=c)

{ printf(\ else if(c>=b)

{ printf(\ else

{printf(\ } }

#include void main(){

int a=3,b=2,c=1; int x=10,y=20; if ( a < b ) y = 9;

else if (b != 0) if (!x)

y = 8; else if (x) y = 7; y = 6; printf(“%d”,y); }

(a)9 (b)8 (c)7 (d)6

? 养成良好编码习惯,即使if只跟一条语句,也要用{ }括起来。 ? 在if语句的表达式中逻辑相等用==,而不是= ? 不要在包含else的if语句中使用“不等于”运算符(!=)

– 使用等于运算符(==)表达这个意思会更为清晰

– 例如:

if (x!=5) statement1; else statement2;

? 最好改为: if (x==5) statement2; else statement1;

? 参看下面的简单公式:身高H(cm)、体重W(kg)

(18-35岁适用)

? 男性:(H-100)=W ? 女性:(H-110)=W

? W上下浮动2kg是正常体重,低于这个值的偏瘦,需要增强营养;高于这个值的偏胖,要注意锻炼

? 尝试使用这个公式编写一个计算体重的小程序,接收年龄、性别、

体重,判断体重状况?

? 解决多项判断问题时,可以使用多分支结构

? switch结构是描述多分支选择的另一种形式。它的一般格式为:

– switch(表达式)

– {

– case常量表达式1: 语句1;break; – case常量表达式2: 语句2;break; – ...

– case常量表达式n: 语句n;break; – [default: 语句n+1;break;] – }

– next 语句

? switch结构执行过程:

? 先计算表达式(expression)的值,它必须是整型或字符型的值 ? 自上而下的将它与case后面的“常量表达式(const-expression)”做

比较

? 若等于某个“常量表达式”,控制就转向该“常量表达式”后面的语句

去执行 ? 然后执行break语句,从该switch语句中退出 ? 接着执行switch语句后面的语句(next statement)

? 如果表达式的值与每一个“常量表达式”的值都不相同,而程序中又

书写了default子句,则控制会转向该子句执行,然后从switch语句中退出

? 如果没有书写default子句,则该switch语句无结果,也会从switch

语句中退出后执行下面的语句

? 注意事项:

? 1、在case 后的每个语句,既可以是单语句,也可以是复合语句,但是不需要用花括号括起来 ? 2、case后的常量表达式和default子句可以按任何顺序书写,不会改变程序的控制流程

? 3、break语句非常重要,如果不书写该语句,则只要表达式的值同任一个“常量表达式”的值相等后,就会顺序向下执行所有剩余case和default子句后的语句,直到遇到第一个break就会退出

? 4、switch后面圆括号内的“表达式”的值和case后面的“常量表达式”

的值,都必须是整型的或字符型的

? 5、同一个switch语句中的所有case后面的“常量表达式”的值都必须

不相同

? 判断每月天数:

? 闰年的判断条件:

– ① 能被4整除,但不能被100整除

– ② 如能被100整除,则必须能被400整除 – 符合这两个条件之一的年份就是闰年

? 现在要求用户输入某年1-12月的任何一个月份,输出该年该月的天

? 分析:

– 1、3、5、7、8、10、12月的每月为31天,所以可以按同一

方法处理

– 第4、6、9、11月的每一天为30天,也可按同一方法处理 – 闰年的2月为29天,否则为28天,要进行单独处理

#include \void main() {

int year,month,day;

printf(\请输入年号和月份\\n\ scanf(\ switch(month) {

case 1: case 3: case 5: case 7:

case 8: case 10:

case 12: day=31;break;

/*表示month为1、3、5、7、8、10、12的任一值,都执行day=31这条语句 */

case 4: case 6: case 9: case 11: day=30;break;

case 2:if(year%4==0 && year0!=0||year@0==0) //闰年的判断

day=29; else day=28; break;

default:day=0;break; //输入的月份不是有效范围内时的处理 } if(day==0)

{

printf(\输入的月份不合法\

} else

}

{ }

printf(\年的%d月的天数是%d\

? 计算员工工资:

? 计算规则:

– 某公司把销售员工评定为?A?、?B?、?C?三个等级 – ?A?级员工的工资为基本工资1500元,加上本月实际销售额

的20%的提成

– ?B? 级员工的工资为基本工资1000元,加上本月实际销售额

的15%的提成

– ?C?级员工的工资为基本工资800元,加上本月实际销售额的

10%的提成

– 请根据员工的级别和本月实际销售额,计算员工本月的工资

? 分析:

– 每一位员工工资的计算方法都是:基本工资+提成

– 根据员工级别的不同,基本工资和提成的额度不相同 – 需要根据员工级别,确定这两个值

#include \void main()

{ int basic; //基本工资

float per,c,pay; //per代表提成额度,c代表实际销售额,pay代表实发工资 char s; //级别

printf(\请输入员工级别(A,B,C)和本月销售额\\n\ scanf(\ switch(s) {

case 'A': basic=1500;per=0.2;break; case 'B': basic=1000;per=0.15;break; case 'C': basic=800;per=0.1;break; default:basic=0;break; }

if(basic==0) { printf(\输入的级别不合法\ else { pay=basic+c*per; printf(\实发工资为%.2f\}

循环结构程序设计语句

? for循环

? 它能够将一个由一条或多条语句组成的代码块执行特定的次数 ? for语句的基本结构

for(表达式1; 表达式2; 表达式3 ) { }

? for循环执行过程

? 运行时,程序首先会执行表达式1部分。 ? 表达式2通常为一个关系表达式。

? 执行循环体部分的语句。 ? 执行表达式3。

? for语句后的其他语句。

? 在屏幕上输出15行“您好!”,用for语句来完成为: #include \void main() {

int i;

for(i=1;i<=15;i++) { printf(\您好!!\\n\ }

? while语句也叫while循环,其一般形式为: while(表达式) {

语句; //循环体 }

语句; //循环体

}

表达式类似于for语句中的表达式2。

表达式代表循环的条件,真/假控制是否执行循 环体。

while可以对for循环具有替代性。 用while改写输出15个“您好”: #include void main() {

int i=1;

while(i<=15) { printf(\您好!!\\n\

}

i++; }

? do?while语句

? C语言中的第三种循环结构是do...while循环

它在指定的条件表达式为真时不断执行一个语句块。

? do?while循环在每次循环结束后检测条件,而不像for循环和while

循环那样,在开始前检测条件。 ? do…while循环的结构如下:

do{

语句; //循环体 }while(表达式)

? 从键盘输入字符中统计数字字符的个数,输回车符时结束录入。 #include void main()

{ int c=0; char ch; printf(\请输入字符,按回车键结束:\\n\ do{

ch=getchar(); if(ch>='0'&&ch<='9') c++;

}while(ch!='\\n'); printf(\数字个数为:%d\\n\}

? 循环控制语句:

? break语句

使用一般格式:break; ? continue语句

使用一般格式:continue;

? break语句:强行结束循环程序,转向循环语句下面的语句

? continue语句:

结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行

? 区别在于:

? continue只是结束了本次循环,而不是终止整个循环的执行

? break不再判断条件表达式,直接结束了整个循环过程

continue在for中的作用: #include void main() {

}

int a,b=0;

for(a=1;a<=10;a++) { b++; if(a>5)

continue;

}

printf(\

循环结构的高级应用

? 在屏幕上输出五行星号“*”构成的等腰三角形。 找出规律: 1、第1行:4个空格,1个星号

每行的空格数=总行数-本行的行号; 每行的星号数=2 * 行号-1

? 屏幕上输出五行星号“*”构成的等腰三角形的代码: #include \void main()

{

int i,j; //i代表行号,j代表每行内的星号数,列数

for(i=1;i<=5;i++) {

for(j=1;j<=5-i;j++) printf(\ for(j=1;j<=2*i-1;j++)

printf(\

printf(\ /*每行输出结束后的换行*/ } }

? 输出从2到100之间所有的素数的主要代码: for(i=2;i<=100;i++) {

2、第2行:3个空格,3个星号 3、第3行:2个空格,5个星号 4、第4行:1个空格,7个星号 5、第5行:0个空格,9个星号

flag=1;

n=(int)sqrt(i); //根据素数条件计算出该数字的平方根 for(j=2;j<=n;j++) if(i%j==0) {

flag = 0; break; }

if(flag==1) {

printf(\

} }

穷举法示例

#include \“ void main() {

int i,j,k;

for(i=1;i<=50;i++) for(j=1;j<=6;j++) }

for(k=1;k<=20;k++)

if(i*2+j*15+k*5==100) printf(\香皂%d 块,洗发水 %d瓶,牙刷%d支;\\n\

本文来源:https://www.bwwdw.com/article/im6o.html

Top