版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章概述1/22/20241计算机系统组成图计算机系统硬件系统软件系统主机外设系统软件应用软件CPU内存外存输入设备输出设备操作系统程序设计语言数据库系统服务性程序应用数据包用户程序1/22/20242第一代:机器语言〔低级语言〕:面向机器、可移植性差、效率高、不方便编程第二代:汇编语言第三代:高级语言:面向程序员、可移植性好、执行效率低、便于编程第四代:面向对象式语言第五代:智能语言程序设计语言1/22/20243C语言与其他高级语言的比照:C语言:系统软件和应用软件BASIC:初学者入门FORTRAN或PL/I:科学计算COBOL:商业和管理等数据处理领域PASCAL:教学,第一个结构化语言1/22/202441.1C语言概述1.1.1C语言开展简介1.1.2C语言特点1.1.3C语言的程序结构1.1.4TurboC上机步骤1.2
C语言的根本符号1.2.1根本符号集1.2.2标识符1.3数据的输入和输出1.3.1字符输出函数putchar()1.3.2字符输入函数getchar()1.3.3格式输出函数printf()1.3.4格式输入函数scanf()
退出1/22/202451.1.1C语言开展简介ALGOL语言:1960,面向问题高级语言,不宜写系统程序CPL语言:1963,英剑桥,能够作较低层次的操作,但规模较大,难以实现BCPL语言:(Basiccombinedprogramminglanguage)1967,英剑桥MartinRichards改进CPLB语言:1970,美贝尔实验室Thompson简化BCPL,用B写UNIX操作系统C语言:1972,贝尔实验室,Ritchie和Kernighan设计,保持B和BCPL的精炼与接近硬件,克服其简单和数据无类型的缺点。描述和实现UNIX的工具语言1977,?可移植C语言编译程序?,C与UNIX相辅相成1978,Kernighan和Richie,?TheCProgrammingLanguage?,标准C语言1983,美国国家标准化协会〔ANSI〕,ANSIC1990,国际标准化组织〔ISO〕通过返回1/22/202461.1.2C语言特点
(1)较低级语言〔中级语言〕(2)结构化语言(3)运算能力强(4)数据类型多(5)有预处理能力(6)可移植性好(7)语法不严格返回1/22/202471.1.3C语言程序的结构特点[例1.1]求两个数的和。
main(){inta,b,sum;a=3;b=4;sum=add(a,b);printf("sum=a+b=%d\n",sum);}intadd(intx,inty){intz;z=x+y;return(z);}sum=a+b=71.函数型语言,函数是C程序的根本单位。2.函数由说明局部和函数体两局部组成函数的组成:说明局部:函数类型函数名〔参数类型参数名,……〕例:intadd(intx,inty)或intadd(x,y)intx,y;函数体:{变量定义;执行语句;}3.主函数main():程序中有且只有一个main()函数,可在任意位置,是程序运行开始和结束。4.书写格式自由:一行内可多条语句,空格和回车符不计。一个语句可多行,用“\〞续行。5.每个语句后有“;〞,函数说明局部除外。6.C语言本身没有输入输入语句,输入输出用库函数scanf()、printf()、getchar()、putchar()实现。7.可在任意位置加注释/*……*/,可多行,不可嵌套。1/22/20248[例1.3]函数C程序例。main(){printf("ThisisaCprogram.");}[例1.2]最小的C程序例。main(){}ThisisaCprogram.1/22/20249[例1.4]求两个数中较小数。main(){inta,b,c;scanf("%d,%d",&a,&b);c=min(a,b);printf("min=%d",c);}intmin(intx,inty){intz;if(x<y)z=x;elsez=y;return(z);}
返回3,5min=31/22/202410启动:DOS下:C:\TC>TC<CR>Windows下:双击图标〔p5图1.1〕翻开:<F3>或<F10>-File-Load输入要翻开的文件名新建:<F10>-File-New编辑:<ESC>〔p5表1.1〕保存:<F2>或<F10>-File-Save<CR>输入文件名<CR>编译:<F9>或Compile/MakeEXEfile<CR><F6>,修改错误运行:<Ctrl-F9>或Run-Run结果:<Alt-F5>或Run-UserScreen退出:<Alt-X>或<F10>-File-Quit启动TC编辑源程序保存源程序编译、连接、运行退出TC打开/新建文件1.1.4TC上机步骤返回1/22/2024111.2
C语言的根本符号1.2.1根本符号集〔ASCII字符集〕阿拉伯数字10个:0、1、2、…、9大小写英文字母各26个:A,B,C,…,Z,a,b,c,…,z下划线:_特殊符号:主要是运算符和操作符返回1/22/202412
1.2.2标识符字符序列,用作常量、变量、函数、文件指针、类型的名字。用户标识符保存字/关键字预定义标识符
1/22/202413
用户标识符:用户根据需要对C程序中用到的变量、符号常量、自己的函数或文件指针进行命名,形成用户标识符。构成规那么:①由英文字母、数字、下划线组成,且第一个字符不能是数字;②英文字母区别大小写;③通常识别前8个字符;④取名遵循“简洁明了〞和“见名知意〞。
1/22/202414
保存字/关键字是编译系统固有的,用做语句名、类型名的标识符。不允许作为用户标识符使用。〔p9表1.2〕
预定义标识符允许用户作其他其途,但将失去系统规定的原意。例define、include
返回1/22/2024151.3
数据的输入和输出
由一组库函数完成数据的输入和输出。字符输出函数putchar()程序开头要预编译命令:#include<stdio.h>或#include“stdio.h〞。功能:把一个字符输出到标准输出设备〔显示器〕上。调用形式:putchar(ch);ch是一个整型变量、字符型变量、整型常量或字符型常量。
1/22/202416[例1.5-1.6]输出字符B〔变量为字符型、整型〕#include“stdio.h〞main(){charc;|intc;c=’B’;|c=66;putchar(c);putchar(‘\n’);putchar(‘B’);|putchar(66);}
返回BB1/22/202417
1.3.2字符输入函数getchar()程序开头要预编译命令:#include<stdio.h>或#include“stdio.h〞功能:从标准输入设备〔键盘〕上读入一个字符。调用形式:getchar();无参数,键盘输入一个字符后,按回车,执行下一语句。
1/22/202418
[例1.7-1.9]输入一字符B,变量是字符型、整型。#include“stdio.h〞main(){charc;|intc;c=getchar();|putchar(getchar());putchar(c);}
返回BB1/22/202419
1.3.3
格式输出函数printf()不需要预编译命令。功能:向输出设备〔显示器或打印机〕输出有一定格式的任意数据。调用形式:printf(格式控制,输出项表);
1/22/202420printf(格式控制,输出项表);普通字符〔原样输出〕
格式说明
%+/-0m.nl格式字符右对齐左对齐最小宽度左补0小数位数长整型d符十整o无八整x无16整c字符s字串f小六e指六1/22/202421
注:①格式控制局部用双引号括起来的字符串,分为普通字符和格式说明。②格式说明与输出项一一对应,假设格式说明个数少于输出项时,多余输出项不输出;假设格式说明多于输出项,对缺少项输出不定值。③函数值为整型,等于正常输出的数据个数。
1/22/202422
[例1.10]输出格式举例。main(){charc=’a’;charstr[]=“seeyou〞;inti=1234;floatx=123.456789;floaty=1.2;printf(“1:%c,%s,%d,%f,%e,%f\n〞,c,str,i,x,x,y);printf(“2:%4c,%10s,%6d,%12f,%15e,%10f\n〞,c,str,i,x,x,y);printf(“3:%-4c,%-10s,%-6d,%-12f,%-15e,%-10f\n〞,c,str,i,x,x,y);printf(“4:%0c,%6s,%3d,%9f,%10e,%2f\n〞,c,str,i,x,x,y);printf(“5:%12.2f\n〞,x);printf(“6:%.2f\n〞,x);printf(“7:%10.4f\n〞,y);printf(“8:%8.3s,%8.0s\n〞,str,str);printf(“9:%%d\n〞,i);}返回1/22/2024231.3.4格式输入函数scanf()不需要预编译命令。功能:把从终端〔键盘〕输入的数据传送给对应的变量。调用形式:scanf(格式控制,输入项地址表);
1/22/202424scanf(格式控制,输入项地址表);普通字符〔原样输入〕
格式说明
%mhl*格式字符最小宽度短整形不赋值长整形d符十整o无八整x无16整c字符s字串f小六e指六1/22/202425注:①格式控制局部用双引号括起来的字符串,分为普通字符和格式说明。
②输入项地址表是假设干变量的地址,而非变量名。&变量名③格式说明与输入项一一对应。④输入时不能规定精度。⑤假设格式控制字符串中无其他符号,那么输入时用空格、回车或跳格分隔。⑥函数值为整型,等于正常输入的数据个数。1/22/202426[例1.11]输入数据举例。main(){charch;inti;charstr[80];floatx;scanf(“%c%d%s%f〞,&ch,&i,str,&x);printf(“%c,%d,%s,%f〞,ch,i,str,x);}
返回w123hello123.456w,123,hello,123.4560001/22/202427第一次作业::p18-1、15、18、19第二次作业:P18-2、3、4、5、6、7、8、9、10、12、16、17、20、21Thankyou!1/22/202428数据类型、运算符和表达式第二章1/22/2024292.1C语言数据类型简介2.2常量2.3变量2.4运算符和表达式退出1/22/2024302.1C语言数据类型简介基本类型
构造类型派生类型整型int结构体struct数组类型字符型char共用体(联合)型union指针类型实型float枚举型enum双精度型double用户定义类型typedef空值型void返回数据类型决定:1.数据占内存字节数2.数据取值范围3.其上可进行的操作1/22/2024312.2常量常量是指在程序运行过程中其值不能被改变的量。
2.2.1数值常量2.2.2字符常量和字符串2.2.3标识符命名的常量2.2.4换码序列常量
返回1/22/2024322.2.1数值常量1、整型常量〔简称为整数〕三种形式:十进制整型常量、八进制整型常量〔以0开头的0~7数字串〕、十六进制整型常量〔以0X或0x开头的0~9/a~f/A~F字符串〕;每种形式常量可表示成短常量和长常量〔在整型常量后面紧跟L或l〕。2、实型常量〔简称为浮点常量或实数〕两种形式:十进制小数形式和指数形式〔用E或e表示〕返回例:1230例:01230400例:0X123-0x11例:12L-9l例:0.123123.例:345e+2.5e-21/22/2024332.2.2字符常量和字符串
1、字符常量用单引号括起来,可以用作整数常量,可参与算术运算。特例:单引号’\’’,反斜线’\\’2、字符串用双引号括起来的零个或多个字符序列。特例:字符串中的双引号\〞,字符串中的反斜线\\存储:编译时自动在字符串结尾加一个转义字符’\0’作为字符串结束标志,即长度为n个字符的字符串占n+1个字节空间。例:’a’‘?’例:“china〞〞a〞例字符串“China”在内存中China\0例:字符‘a’在内存中字符串“a”在内存中aa\01/22/2024341/22/2024352.2.3标识符命名的常量〔符号常量〕一般用大写字母表示,而变量一般用小写字母表示。符号常量使用之前必须预先定义,其定义格式为
#define标识符常量
例:
#definePI3.14159
注:不是语句,后无;优点:①清晰易懂;②易于修改。
1/22/202436[例2.3]标识符命名的常量举例。#definePI3.1415926main(){floatradius,circum,area;scanf("%f",&radius);circum=2*PI*radius;area=PI*radius*radius;printf("circumferenceis%f\n",circum);printf("areais%f\n",area);}
返回3circumferenceis18.849556areais28.2743341/22/2024372.2.4换码序列常量〔转义字符〕是特殊字符常量。以一个反斜杠〞\〞开头的字符序列,只代表某个特定的ASCII码字符。用单引号括起。
<常见的转义字符常量表(p27表2.2):转义字符含义\n\v\r\0\‘\ddd\t\b\f\\\“\xhh转义字符含义换行垂直制表回车空字符单引号3位8进制数代表的字符水平制表退格换页反斜线双引号2位16进制数代表的字符1/22/202438[例2.4]转义字符举例。main(){printf("\tHello!");printf("\n1234567890");printf("\bHello!");}Hello!123456789Hello!
返回1/22/2024392.3变量变量:是指程序执行过程中,其值可以改变的量。
2.3.1变量说明和变量地址
2.3.2变量的初始化
2.3.3数据类型
2.3.4存储类型和变量的作用域返回1/22/2024402.3.1变量说明和变量地址1、变量说明“先定义,后使用。〞变量名:变量的名字,用标识符表示,不能与保存字〔语句名、类型名〕重名。变量说明:存储类型数据类型变量名;2、变量的地址:存储某变量的内存空间的首地址,用&变量名表示。注:&-取地址运算,地址值可用十进制或十六进制表示。例:内存地址变量值变量名0x840010a………0x850020b………返回编译程序根据变量说明为其分配指定字节的内存单元…...地址0x8400inta=10,b=-20,c;abc2字节2字节2字节地址0x8402地址0x8404…...内存10-20
随机数1/22/202441定义变量的同时给变量赋初值。例:inta=10;charc=’A’;[例2.5]变量的初始化.main(){charc1='a';charc2='b';charc3,c4;c3=c1-('a'-'A');c4=c2-('a'-'A');printf("%c,%c\n",c3,c4);}A,B返回2.3.2变量的初始化
1/22/202442整型变量占字节数随机器不同而不同,一般占两个字节分为根本型-int-2字节、短整型-short-2、长整型-long-4和无符号型-unsigned-2、unsigenedshort-2、unsignedlong-4。可用sizeof(类型标识符〕测量实型变量float:占4字节,提供7位有效数字double:占8字节,提供15~16位有效数字字符型变量字符变量存放字符ASCII码char与int数据间可进行算术运算例floata;a=111111.111;/*a=111111.1*/doubleb;b=111111.111;/*b=111111.111*/例a=‘D’;/*a=68;*/x=‘A’+5;/*x=65+5;*/s=‘!’+‘G’/*s=33+71;*/没有字符串变量,用字符数组存放2.3.3数据类型1/22/202443[例2.6]测试所用计算机的根本数据类型所占内存的字节数。main(){printf("int:%d\n",sizeof(int));printf("short:%d\n",sizeof(short));printf("long:%d\n",sizeof(long));printf("unsigned:%d\n",sizeof(unsigned));printf("unsignedshort:%d\n",sizeof(unsignedshort));printf("unsignedlong:%d\n",sizeof(unsignedlong));printf("char:%d\n",sizeof(char));printf("unsignedchar:%d\n",sizeof(unsignedchar));printf("float:%d\n",sizeof(float));printf("double:%d\n",sizeof(double));}注:sizeof〔〕求括号中的变量或数据类型的长度〔字节数〕。1/22/2024442、数据类型间的转换按较低类型向较高类型转换的原那么:-字符型->整型〔短整型〕->长整型->实型->双精度型-有符号型->无符号型返回intintfloatfloatdoubledoublefloatdouble10+‘a’+f*i-d/e例inti;floatf;doubled;longe;强制转换类型:〔数据类型名〕表达式例:(double)a(int)x+y1/22/2024452.3.4存储类型和变量的作用域1、局部变量和全局变量局部变量〔内部变量〕:在函数内部或复合语句内部定义的变量,作用域是从定义的位置起到函数体或复合语句结束止。全局变量〔外部变量〕:在函数外部定义的变量。作用域是从变量定义的位置起到根源文件结束止。注:同一源文件中,假设局部变量与全局变量同名,那么全局变量被屏蔽。1/22/2024462、存储类型自动变量(auto):auto可省略,局部变量,内存的堆栈区,不能赋初值。存放器变量(register):保存在存放器中,可说明局部变量和形式参数,使用最频繁,只能是int或char。静态变量(static):内存的数据区,可说明局部变量和全局变量,随文件存在而存在。外部变量(extern):内存的应用程序区,只能说明全局变量,随程序存在且活动。
注:内存分为堆栈区〔auto〕、系统程序区、应用程序区(extern)和数据区〔static〕。1/22/202447[例2.7]存储类型和作用域举例。#include"file2.c"inta=10;externintadd();main(){intb,c;scanf("%d",&b);c=add(b);printf("%d+%d=%d\n",a,b,c);}返回2010+20=30externinta;intadd(x)registerintx;{inty;y=a+x;return(y);}file1.cfile2.c全局变量局部变量自动变量全局变量外部变量局部变量存放器变量局部变量自动变量1/22/2024482.4运算符和表达式
2.4.1运算符和表达式
2.4.2赋值运算符和表达式
2.4.3算术运算符和表达式
2.4.4逗号运算符和表达式
2.4.5关系运算符和表达式
2.4.6逻辑运算符和表达式
2.4.7条件运算符和表达式
2.4.8位运算符和表达式
2.4.9运算符的结合律和优先级返回1/22/2024492.4.1运算符和表达式1、C运算符
算术运算符:+-*/%-(取负)++--
关系运算符:>>=<<===!=
位运算符:
~&|^<<>>
逻辑运算符:!&&||
赋值运算符:=复合赋值符号+=-=*=/=%=
条件运算符:?:
逗号运算符:,
指针运算符:*&
求字节数运算符:sizeof
强制类型转换运算符:类型
分量运算符:.->
下标运算符:[]
其他:()函数调用运算符
7227451/22/202450学习运算符应注意(1)运算符功能(2)与运算量关系--要求运算量个数:单目、双目、三目--要求运算量类型(3)运算符优先级别:15个级别(4)结合方向:自左至右、自右至左(5)结果的类型-(负号)&+-*%?:2、表达式:是由数据和运算符组合而成的式子。是一种复合数据,定义如下:①常量、变量和函数是一个表达式;②运算符与表达式的组合是一个表达式。
返回优先级运算符结合规则1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右3*5/6a=b=c=5//自左至右//自右至左1/22/202451赋值运算符:
=
把其右侧表达式的值赋给左侧的变量。
赋值表达式:赋值运算符连接变量和表达式而得到的式子。
变量=表达式
--注:右边的数据类型转换成左边变量的数据类型。赋值表达式的值是左部变量的值和类型。
赋值语句:赋值表达式加上分号。变量=表达式;
2.4.2赋值运算符、赋值表达式
和赋值语句返回a=2a=2+3;优先级运算符结合规则1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右1/22/202452算术运算符:+-*/%-(取负)++----优先级:()++---*/%+---注:①其中%++--只能用于整型。②两个整数相除为整数,向零取整。③%:余数与被除数符号相同。算术表达式:由运算对象〔常量、变量和函数等〕、圆括号和算术运算符组成。表达式中所字符写在一行上。
2.4.3算术运算符和算术表达式-5/3=-1-4%-3=1--a/(b1+5)-11%7*'a'的运算次序优先级运算符结合规则1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右1/22/202453[例2.8]自增运算符举例。main(){inti=2;printf(“%d\n〞,-i++);printf(“%d\n〞,i);}-23自增、自减表达式:
++i(先加1再引用)
i++
(先引用再加1)1/22/202454复合赋值运算:+=-=*=/=%=[例2.9]复合赋值运算符举例。main(){inta=3,b=9,c=-7;a+=b;c+=b;b+=(a+c);printf(“a=%d,b=%d,c=%d\n〞,a,b,c);a+=b=c;printf(“a=%d,b=%d,c=%d\n〞,a,b,c);a=b=c;printf(“a=%d,b=%d,c=%d\n〞,a,b,c);}a=12,b=23,c=2a=14,b=2,c=2a=2,b=2,c=2返回1/22/202455逗号运算符:
,
--优先级别最低。逗号表达式:用逗号运算符把两个或多个算术表达式连接起来构成逗号表达式。
表达式1,表达式2,……
--注:①求值过程从左到右,逐个求表达式的值,最后整个表达式的值取最右侧的表达式的值。
②
for循环语句中常用。逗号运算符和逗号表达式返回
y=(b=2,3*2)
(y=b=3,3*b)
a=(b=2,++b,b+5)//y值为3,表达式值为9//y值为6,表达式值为6//a值为8,表达式值为8优先级运算符结合规则1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右1/22/202456关系运算符:>>=<<===!=
--优先级:算术>关系>赋值运算符
>>=<<===!=
关系表达式:用关系运算符将两个表达式连接起来的式子。值是1或0。
表达式1关系运算符表达式22.4.5关系运算符和关系表达式a+b<=c+di=(j+k)!=0优先级运算符结合规则1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右1/22/202457[例2.11]关系运算符举例。main(){inta,b;scanf(“a=%d,b=%d〞,&a,&b);printf(“a>b:%d\n〞,a>b);printf(“a<b:%d\n〞,a<b);printf(“a==b:%d\n〞,a==b);printf(“a>=b:%d\n〞,a>=b);printf(“a<=b:%d\n〞,a<=b);printf(“a!=b:%d\n〞,a!=b);}返回a>b:0a<b:1a==b:0a>=b:0a<=b:1a!=b:1a=3,b=51/22/202458逻辑运算符:||&&!
--优先级:!=算术>关系>&&>||>赋值
--逻辑运算真值表(p43表2.11)
2.4.6逻辑运算符和逻辑表达式ab!a!ba&&ba||b真假真假假假真真真假假假假假真真假假真真真假真真优先级运算符结合规则1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右1/22/202459返回inta=1,b=2,c=3,d=4,m=1,n=1;(m=a>b)&&(n=c>d)//m值为0,n值为1逻辑表达式:用逻辑运算符连接运算量,并产生一个逻辑值。逻辑值是1或0。
--注:①逻辑运算结果中,1表示真,0表示假;而判断时,非0表示真,0表示假。②&&和||一旦能够确定表达式的值,就不再继续运算下去。1/22/202460条件运算符:?:条件表达式:含有条件运算符的表达式。三目运算符。表达式1?表达式2:表达式3--执行过程:先表达式1,为非0,那么执行表达式2;为0,表达式3。
2.4.7条件运算符和条件表达式a>b?a:ba=(b==0)?c*d:c/d;if(b==0)a=c*d;elsea=c/d;1/22/202461[例2.13]用条件表达式求出输入的两个整型数中较小者。main(){inta,b;scanf(“a=%d,b=%d〞,&a,&b);printf(“Theminis%d〞,(a<b)?a:b);}返回a=3,b=4Theminis31/22/202462位运算表达式:用位运算符连接运算量而组成的表达式。对运算量以二进制位为单位操作。位运算符:~&|^<<>>
2.4.8位运算符和位运算表达式逻辑位运算符移位位运算符优先级运算符结合规则1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右1/22/202463ab~aa&ba|ba^b000110111、逻辑位运算~&|^
逻辑位运算真值表〔p45表2.12)1100
0001
0111
0110
1/22/202464[例2.14]逻辑位运算。main(){inta,b;scanf("a=%x,b=%x",&a,&b);printf("~a=%x\n",~a);printf("a&b=%x\n",a&b);printf("a|b=%x\n",a|b);printf("a^b=%x",a^b);}a=0xb9,b=0x83~a=0xff46a&b=0x81a|b=0xbba^b=0x3a1/22/2024652、移位位运算
<<>>
<<:右补0>>:有符号数,左复制符号位无符号数,左补0例:a=0x1b;b=a<<2;0x6c即10801101100
00011011补0舍去例:a=-8;a=a>>2;0xfe即-211111110
11111000补1舍去例:b=248;b=b>>2;0x3e即62
舍去00111110
11111000补01/22/202466[例2.15]移位位运算。#defineS11#defineS23main(){inta;scanf("a=%d",&a);printf("%d>>%d=%d\n",a,S1,a>>S1);printf("%d>>%d=%d\n",a,S2,a>>S2);printf("%d<<%d=%d\n",a,S1,a<<S1);printf("%d<<%d=%d\n",a,S2,a<<S2);}返回a=33>>1=13>>3=03<<1=63<<3=241/22/2024672.4.9运算符的结合律和优先级(p49-表2.15)优先级运算符结合规则1[]()->.从左至右2!~++---*&sizeof从右至左3*/%从左至右4+-从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13?:从右至左14=+=-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右返回1/22/202468Thankyou!第一次作业:p52-1、2、7、8、9、48~51第二次作业:p52-3~6、10~18、21~23、25~31、33~36、52~54第三次作业:p53-19、20、37~471/22/202469三种根本结构的程序设计第三章1/22/2024703.1顺序结构3.2条件结构3.3循环结构退出1/22/2024713.1顺序结构顺序结构程序就是按书写顺序执行的语句构成的程序段。语句1语句21/22/202472数据输入语句ch=getchar();scanf(格式控制,输入项地址表);数据输出语句putchar(ch);printf(格式控制,输出项表);赋值语句变量=表达式;空语句;复合语句〔分程序〕{内部数据说明;执行语句;}1/22/202473[例3.1]复合语句举例。main(){inta=10;printf("a=%d\n",a);
{inta=20;printf("a=%d\n",a);}printf("a=%d\n",a);}a=10a=20a=10返回1/22/2024743.2分支结构〔条件结构〕1、根本if语句〔单分支结构〕2、if-else语句〔双分支结构〕3、if嵌套语句〔分支嵌套的一般形式〕4、if-else-if语句(分支嵌套的特殊形式)5、switch-case语句(分支开关结构)6、goto语句〔无条件分支结构〕
返回1/22/2024751、根本if语句〔单分支结构〕if〔表达式〕语句
注:表达式可是任意表达式,为“非0〞那么执行语句。语句表达式0非01/22/2024761/22/2024772、if-else语句〔双分支结构〕if〔表达式〕语句1else语句2语句1语句2表达式非001/22/202478[例3.3]输入一个整数,判断奇偶。main(){intn;printf(“Inputanumber\n〞);scanf(“%d〞,&n);if(n%2==0)printf(“Thenumberiseven\n〞);elseprintf(“Thenumberisodd\n〞);}
Inputanumber
100ThenumberisevenInputanumber25Thenumberisodd1/22/202479[例3.4]
求整数a的平方值。main(){inta;printf("EnteranintegerA:\n");scanf("%d",&a);
if(a!=0){a=a*a;printf("a*a=%d\n",a);}
elseprintf("a*a=0\n");}
返回EnteranintegerA:5a*a=251/22/202480例
if
(n>0)
if(a>b)c=a;
elsec=b;3、if嵌套语句〔分支嵌套的一般形式〕if后和else后的语句可再包含if语句。注:else总是与前面最近的并且没有与其他else匹配的if相匹配。例’
if(n>0){if(a>b)c=a;}
elsec=b;
1/22/202481[例3.5]求一个点所在的象限。main(){floatx,y;printf(“Inputthecoordinateofapoint\n〞);printf(“x=〞);scanf(“%f〞,&x);printf(“y=〞);scanf(“%f〞,&y);if(x>0)if(y>0)printf(“Thepointisin1stquadrant.\n〞);elseprintf(“Thepointisin4thquadrant.\n〞);elseif(y>0)printf(“Thepointisin2ndquadrant.\n〞);elseprintf(“Thepointisin3rdquadrant.\n〞);}
Inputthecoordinateofapointx=5y=3Thepointisin1stquadrant.Inputthecoordinateofapointx=-2y=-7Thepointisin3rdquadrant.返回1/22/2024824、if-else-if语句〔分支嵌套的特殊形式〕if〔表达式1〕语句1elseif〔表达式2〕语句2……elseif〔表达式n〕语句nelse语句n+1表达式1假(0)语句2真(非0)语句1表达式2假(0)表达式n假(0)语句n+1语句n真(非0)真(非0)1/22/202483[例3.6]求解符号函数。main(){intx,sign;printf(“Pleaseinputanumber\n〞);scanf(“%d〞,&x);if(x>0)sign=1;elseif(x==0)sign=0;elsesign=-1;printf(“Thesignis%d\n〞,sign);}Pleaseinputanumber-100Thesignis–1Pleaseinputanumber2Thesignis1Pleaseinputanumber0Thesignis01/22/202484[例3.10]设计求ax2+bx+c=0的一元二次方程解的程序。
a,b,c=?1,2,1Theequationhastwoequalroots:-1.0000a,b,c=?1,2,2Theequationhascomplexroots:-1.0000+1.0000i-1.0000-1.0000ia,b,c=?2,6,1Theequationhasdistinctrealroots:-0.1771and-2.8229#include"math.h"main(){floata,b,c,d,x1,x2,p,q;printf("a,b,c=?");scanf("%f,%f,%f",&a,&b,&c);printf("Theequation");
if(fabs(a)<=1e-6)printf("isnotquadratic");else{d=b*b-4*a*c;
if(fabs(d)<1e-6)printf("hastwoequalroots:%8.4f\n",-b/(2*a));else
if(d>1e-6){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("hasdistinctrealroots:%8.4fand%8.4f\n",x1,x2);}else{p=-b/(2*a);q=sqrt(-d)/(2*a);printf("hascomplexroots:\n");printf("%8.4f+%8.4fi\n",p,q);printf("%8.4f-%8.4fi\n",p,q);}}}输入a,b,ca==0?“非二次方程”d=b2-4acd==0?d>0?相等实根不相等实根不相等虚根返回1/22/2024855、switch-case语句(开关分支结构)
switch(表达式){case常量表达式1:语句组1
case常量表达式2:语句组2
……case常量表达式n:语句组ndefault:语句组n+1}注:①表达式和常量表达式可为任何整型或字符型。②每一个case后的常量表达式值应互不相同。③default位置任意,只作入口;假设无default且无匹配常量表达式,那么不执行任何操作。④语句组不须加{}⑤break无条件转向本层复合结构的下一条语句。计算表达式值语句组1语句组2语句组n语句组n+1常量表达式1常量表达式2常量表达式ndefault…………计算表达式值语句组1语句组2语句组n语句组n+1常量表达式1常量表达式2常量表达式ndefault…………break;
break;
break;
breakbreakbreak1/22/202486[例3.7]根据考试成绩的等级打印百分制分数段。
main(){chargrade;printf("inputthegrade:");scanf("%c",&grade);
switch(grade){
case'A':printf("85~100\n");break;
case'B':printf("70~84\n");break;
case'C':printf("60~69\n");break;
case'D':printf("<60\n");break;
default:printf("error\n");}}
Inputthegrade:A85~100Inputthegrade:kerror1/22/202487[例3.8]判别某考试成绩等级是否大于60分。
main(){chargrade;printf("Inputthegrade:");scanf("%c",&grade);
switch(grade){
case'A':
case'B':
case'C':printf(">=60\n");break;
case'D':printf("<60\n");break;
default:printf("error\n");}}Inputthegrade:B>=60Inputthegrade:D<601/22/202488[例3.9]在case后面嵌套switch语句的程序。
#include"stdio.h"main(){intx=1,y=0,a=0,b=0;
switch(x){case1:
switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf("a=%d,b=%d\n",a,b);}
a=2,b=11/22/202489程序举例:
[例3.11]设计输入年、月,输出该月天数的程序。返回Inputyear,month=?1994,8year=1994,month=8,days=31Inputyear,month=?1994,2year=1994,month=2,days=28main(){intyear,month,days;printf("inputyear,month=?\n");scanf("%d,%d",&year,&month);
switch(month){
case1:
case3:
case5:
case7:
case8:
case10:
case12:days=31;break;
case4:
case6:
case9:
case11:days=30;break;
case2:if((year%4==0)&&(year%100!=0)||(year%400==0)) days=29; else days=28;break;
default:printf("monthiserror\n");}printf("year=%d,month=%d,days=%d\n",year,month,days);}年号能被4整除但不能被100整除,或者年号能被400整除的年均是闰年。1/22/2024906、goto语句〔无条件分支结构〕(p64)goto语句标号;注:语句标号用标识符表示,用来表示程序的某个位置。
返回无条件分支结构语句的三种形式:
goto语句:转向标号所在位置。
continue语句:转向本层复合结构的末尾。
break语句:转向本层复合结构的下一语句。loop:if(i<=100){sum=sum+i;i++;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论