C语言基础知识总结_第1页
C语言基础知识总结_第2页
C语言基础知识总结_第3页
C语言基础知识总结_第4页
C语言基础知识总结_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——C语言基础知识总结C语言根基学识总结

感叹号是勇士滴在攀登路上的血,也是懦夫消沉时流淌的泪。以下是我为大家探寻整理了C语言根基学识总结,梦想能给大家带来扶助!更多精彩内容请实时关注我们我!

主要内容:1.C数据类型

2.简朴的算术运算和表达式

3.键盘输入和屏幕输出

4.选择操纵布局

总结风格:分条罗列,主要是学识点,有例题不多

5.循环操纵布局

一、C数据类型

1.C语言处理两种数据:常量和变量

2.常量:整形常量、实型常量、字符常量、字符串常量、枚举常量

3.整形常量:正整数、负整数、零eg:10,-30,0

4.实型常量:实数、小数、浮点数eg:3.14,-0.56,18.0

5.字符常量:字符型常量、用单引号括起来的任意字符eg:xX?,9

6.字符串常量:用双引号括起来的一个或多个字符eg:xHelloY78

7.在C程序中,整型常量可以用十进制、八进制、十六进制形式表示,但编译器都会自动将

其转换成二进制存储

8.整型常量的类型:长整型、短整型、有符号、无符号。

9.不同进制的整型常量的表示形式:

1十进制:0~9数字组合,可带正负号eg:256,-128,0,+7

2八进制:0开头,后面跟0~7数字组合eg:021,-017

3十六进制:0x0X开头,后跟0~9,a~fA~F数字组合eg:0x12,-0x1F

10.不同类型的整形常量的表示形式:

1有符号整型常量:默认int型定义为有符号整数,无需signedeg:10,-30,0

2无符号整形常量:常量值后跟u或U,只能表示=0的数eg:30u,256U

3长整型常量:常量值后跟l或Leg:-256l,1024L

4无符号长整型常量:常量值后跟LU、Lu、lU、lueg:30lu

11.C程序中,实型常量两种表示形式:小数、指数

12.不同形式的实型常量的表示形式:

1十进制表示形式:数字和小数点组成,务必要有小数点,整数片面可省略eg:0.123,-12.35,.98

2指数形式:e或E代表以10为底的指数,e左边是数值片面有效数字,可以是整

数、小数,不能省略,e右边是指数片面务必是整数形式eg:3.45e-6

13.实型常量有单精度和双精度之分,无有符号和无符号之分

14.不同类型的实型常量表示形式:

1单精度实型常量:常量值后跟F或feg:1.25F,1.25e-2f

2双精度实型常量double:实型常量默认按双精度处理eg:0.123,-12.35,.98

3长双精度实型常量longdouble:常量值后跟L或leg:1.25L

15.变量:在程序执行过程中可以变更的量

16.变量在务必先定义后使用,定义时需要声明变量的类型和变量名,一般形式:类型关键

字变量名;

17.关键字是C语言预先规定具有特殊意义的单词,类型关键字用于声明变量的类型

18.标准C语言编写的程序都是以main作为开头,指定了C程序执行的起点,在C程序中

只能展现一次,称为主函数

19.C程序总是从main函数开头执行,与他在程序中的位置无关,main函数主体片面称为语

句,用括起来,一般C语句以;终止

20.变量的类型抉择了编译器为其调配内存单元的字节数、数据在内存单元中的存放形式、

该类型变量合法的取值范围以及该类型变量可参与的运算种类

21.变量名是用户定义的标识符,用于标识内存中概括的存储单元,存放的数据称为变量的

22.新数据存放于存储单元时,旧数据将会被修改,回响变量的值是可以变更的

23.变量名的命名规矩:

1标识符只能由英文字母、数字、下划线组成

2标识符务必以字母或下划线开头

3不允许使用C关键字为标识符命名

4标识符可以包含任意多个字符,但一般会有最大长度限制,预编译器有关,一般不会超过,最好不超过8个字符

留神:标识符区分大小写

eg:xy3_imaxELSEXA_to_B合法

eg:7xint#Nobadonere-input不合法

24.标准C规定全体变量务必在第一条可执行语句之前定义

25.在同一条语句中可以同时定义多个一致类型变量,多个变量之间用逗号分隔,没有依次要求

26.在使用标准输入/输出函数时,务必在程序开头加上编译预处理命令

27.中stdio为头文件,std是standard,i为input,o为output,h为head

28.编译预处理命令#include的作用:将在输入/输出函数的头文件stdio.h包含到用户源文件中

29.%d按十进制整数个格式输出,%f按十进制小数格式输出,一般输出6位小数,%c输出一个字符,\n换行,双引号内字符原样输出

30.不同类型的数据在内存中占用不同大小的存储单元,他们所能表示的数据的取值范围各不一致,不同类型的数据表示形式及其可以参与的运算种类也不同

31.定义整型变量时,只要不指定为无符号型,其隐含类型为有符号型,signed通常省略不写

32.C程序中每个变量的值都是按字节编址,都被存储在内存中特定的存储单元中,这个存储空间实际是一个线性地址表,即每个字节的存储空间对应一个唯一的地址

33.1个字节等于8个二进制位,即8个位为一个字节,一个字节可以表示的整数最小为0,最大255,即8个位可以表示0-255之间的数,一个二进制位的值只能是0或1

34.同种类型在不同的平台所占字节数不同,要计算数据类型所占内存空间的字节数需要用sizeof运算符

35.sizeof是C语言关键字,不是函数名,sizeof变量名计算一个变量所占内存的字节数

36.计算不同类型运算符的表达式时,要考虑运算符的优先级和结合性

37.正数的反码、补码与原码都一致,负数的补码等于反码加1

38.在计算机内存中负数都是用补码来表示

39.对于实数,无论小数海曙指数形式,在计算机内存中都采用浮点形式来存储

40.浮点数分为阶码、尾数两片面,实数N=S*powr,j,S为尾数无论正负,规定用存小数,j为阶码无论正负,务必是整数,r是基数eg:10.0111=0.100111*pow2,10

41.阶码所占位数抉择实数的取值范围,尾数所占位数抉择实数的精度,尾数的符号抉择实数的正负,阶码和尾数的字节大小与编译器有关

42.float型变量能接收实型常量的7位有效数字,double型变量能接收16位

43.运算符的优先级:单目运算算术运算关系运算规律运算条件运算赋值运算逗号运算

44.素数:又称质数,指在大于1的自然数中,除1和本身不能被其他自然数整除的数

45.合数:指在自然数中除1和本身外还能被其他自然数整除的数

46.因子:全体能整除这个数的数,不包括自身,但包括1

47.闰年:能被4整除但不能被100整除,或能被400整除

二、简朴的算术运算和表达式

1.条件运算符是C语言供给的唯一一个三元运算符,C语言中没有幂运算符

2.只有计算相反数是一元运算符,其余运算符都是二元运算符

3.一元运算符也叫单目运算符,二元运算符也叫双目运算符,三元运算符也叫三目运算符

4.整数除法的结果是整数,浮点数除法的结果是浮点数

5.求余运算限定参与运算的两个操作数务必为整型,余数的符号与被除数的符号一致,不能对两个实型数举行求余运算

6.全体的算术运算符中只有一元的去相反数运算符为右结合,其余的结合性都为左结合

7.同一优先级的运算符举行混合运算时,从左向右依次举行

8.运算符的优先级:单目运算算术运算关系运算规律运算条件运算赋值运算逗号运算

9.计算并输出一个三位整数的个位、十位、百位数字之和

#include

voidmain

intx=321;

inta,b,c,sum;

a=x%10;//a=1

b=x/10%10;//b=2

c=x/100;//c=3

sum=a+b+c;

printfa=%d,b=%d,c=%d\nsum=%d\n,a,b,c,sum;

10.涉及算术运算的复合赋值运算符有5个:+=,-=,*=,/=,%=

11.增1运算符也称自增运算符,减1运算符也称自减运算符,都是一元运算符,只有一个操作数务必是变量不能是常量或表达式

12.自增自减运算符作为前缀时,先执行加1或减1然后使用;自增自减运算符作为后缀时,先使用再执行加1或减1;

13.考虑优先级与结合性的实例

m=-n++《=》m=-n++《=》m=-n,n=n+1;

//正面:-和++都是一元运算符,优先级一致,此时要考虑结合性,结合性都是右结合的,所以先算++后算-

//反面:假设等价m=-n++就不合法了,由于表达式不能举行自增操作

14.scanf函数和printf函数都是C的标准输入/输出函数,为取地址运算符

15.宏常量与宏替换:

1在程序中直接使用的常数称为幻数,将幻数定义为宏常量或const常量是为了提高程序的可读性和可维护性

2宏常量也称符号常量,没有数据类型,编译器不对其举行类型检查,只举行字符串替换

3宏定义一般形式:#define标识符字符串。标识符被称为宏名,宏名与字符串之间可有多个空白符,不加等号,结尾不加分号

4宏常量是由宏定义编译预处理命令来定义,宏名替换成字符串的过程称为宏替换,宏替换不做任何语法检查

5当宏定义是一个表达式时,调用时,是一个数就可以直接带入,而是表达式也要看成是一个数代进宏定义表达式中,

而看成一个数这就要求把调用的数加上圆括号,为了裁减不必要的错误,最好都加上圆括号

6宏替换的过程是将宏名原样替换成字符串,而不是直接计算出值,所以要用调用后的结果参与其他运算就需要把调用的结果加上圆括号

7例题:

#include

#defineN2//N=2

#defineMN+1//M=2+1

#defineNUM2*M+1//NUM=2*2+1+1=6

voidmain

inti;

fori=1;i=NUM;i++;

printf%d\n,i;//执行完空循环,i=7

i--;//i=6

printf%d\n,i;

8例题:

#include

#definefxx*x

voidmain

intb;

b=f4+4;//b=4+4*4+4=24,解释见5

printfb=%d\n,b;

9例题:

#include

#definefxx*x

voidmain

intb;

b=f4+4/2+2;//b=4+4*4+4/2+2=21解释见6

printfb=%d\n,b;

10例题:

#include

#definefxx*x

voidmain

intb;

b=f4+4;//b=4+4*4+4=64

printfb=%d\n,b;

11例题:

#include

#definefxx*x

voidmain

intb;

b=f4+4/2+2;//b=4+4*4+4/2+2=16

printfb=%d\n,b;

16.const常量

1const常量只能在定义时赋初值,由于编译器将其放在只读存储区,不允许在程序中修改

2const常量的定义一般形式:const类型名标识符=字符串;//将标识符声明为具有该数据类型的const常量

3const是一种类型修饰符,const常量具有数据类型,编译器要对其举行类型检查

17.表达式中的自动类型转换:

1表达式中,操作数类型一致,运算的结果类型与操作数类型一致

2表达式中,操作数类型不一致,C编译器自动将全体操作数举行类型提升,转换成同一类型,所占字节最大,再计算

18.赋值中的自动类型转换:

1赋值运算符左侧变量与右侧表达式类型不同时,发生自动类型转换:右侧表达式的值转换成左侧变量的类型

19.强制类型转换:

1强制类型转换运算符是一元运算符

2强制类型转换也称强转,是将表达式的值转换为任意类型,并不变更变量本身的数据类型

3强转一般形式:类型表达式

4演示强制类型转换运算符的使用

#include

voidmain

intm=5;

printfm/2=%d\n,m/2;//m=2

printffloatm/2=%f\n,floatm/2;//m=2.000000

printffloatm/2=%f\n,floatm/2;//m=2.500000

printfm=%d\n,m;//m=5,只是将m强转为实型数据,并不变更m的数据类型

20.常用的标准数学函数:

1使用C标准数学函数,要在程序开头加上编译预处理命令:#include

2例:已知三角形三边长为a,b,c,计算三角形的面积

#include

#include

voidmain

floata,b,c,s,area;

printfInputa,b,c:;

scanf%f,%f,%f,a,b,c;

s=a+b+c/2;

area=floatsqrts*s-a*s-b*s-c;

printfarea=%f\n,area;

21.赋值运算符的左侧不能展现表达式,变量与变量之间可以赋值

例1:若有定义:inta,b,c;以下表达式中哪一个是合法的C语言赋值表达式C、D

Aa=7+b=c=7Ba=b++=c=7Ca=b=7,c=12Da=3,b=a+5,c=b+2

//A.7+b表达式不能做左值B.b++表达式不能做左值C.逗号表达式a=12D.依次赋值

例2:下面不正确的赋值语句是B

Aa=++aBa=b++=10Ca+=bDa=1a

//D.算术运算符优先级高于赋值运算符,先算1a再将其结果赋给a

例3:若有以下定义:inta=3,b=2,c=1;以下选项错误的赋值表达式是A

Aa=b=4=3Ba=b=c+1Ca=b=4+cDa=1+b=c=4

//A.先计算圆括号里的值等于4,然后按照赋值表达式的依次从右向左计算,将3赋值给4这是不对的,

即赋值号左侧只能是变量,不能展现表达式b=4

三、键盘输入和屏幕输出

1.字符常量:

把字符放在一对单引号内,适用于多数可打印字符

2.转义字符:

以反斜线\开头,也是放在一对单引号内,适用于操纵字符如回车符,换行符

3.常用的转义字符:

1\n换行8\a响铃报警提示音

2\r回车不换行9\一个双引号

3\0空字符10\一个单引号

4\t水平制表11\\一个反斜线

5\v垂直制表12\?问号

6\b退格13\ddd1到3位八进制ASCII码值所代表的字符

7\f走纸换页14\xhh1到2位十六进制ASCII码值所代表的字符

4.\n,是将光标移到下一行起始位置,\r是将光标移到当前行的起始位置

5.\t,是水平制表符,相当于按下Tab键,每次按下Tab键并不是从当前光标位置向后移动一个Tab宽度,而是移到下一个制表位

实际移动的宽度视当前光标位置距相邻的下一个制表位的距离而定

6.制表位,屏幕上的一行被分为若干个域,相邻域之间的交接点称为制表位,每个域的宽度就是一个Tab宽度,多数习惯上为4

7.当转义序列展现在字符串中时,是按单个字符计数的

8.一个整形数在内存中是以二进制形式存储的,而一个字符在内存中也是以其对应的ASCII码的二进制形式存储的,

但char型数据在内存中只占一个字节,而int型数据在16位系统中占2个字节,32位系统占4个字节

9.在ASCII码取值范围内,char型数据可以和int型数据举行混合运算,char型数据也能以int型输出,直接输出其对应的ASCII码的十进制值

10.字符的输入/输出:

1getchar和putchar是C标准函数库中特意用于字符输入/输出的函数,功能是只能输入/输出一个字符

2例:从键盘输入一个大写英文字母,将其转换为小写字母显示在屏幕上

#include

voidmain

charch;

ch=getchar;//键盘输入一个字符,再按回车表示输入终止,字符存入变量ch,留神:getchar没有参数,直接返回读入的字符

ch=ch+32;

putcharch;//其次次按回车,将显示转换后的结果

putchar\n;//留神:putchar内确定要有参数,参数就是待输出的字符,可以是可打印字符,也可是转义字符

11.数据的格式化屏幕输出:

1函数printf的一般格式:printf格式操纵字符串;或者printf格式操纵字符串,输出值

参数表;

2格式操纵字符串包括:格式转换说明符,需要原样输出的普遍字符

3函数printf的格式转换说明符:

%d输出带符号十进制整数,整数符号省略

%u输出无符号十进制整数

%o输出无符号八进制整数,不输出前导符0

%x输出无符号十六进制整数小写,不输出前导符0x

%X输出无符号十六进制整数大写,不输出前导符0x

%c输出一个字符

%s输出字符串

%f以十进制小数形式输出实数,包含单,双精度,隐含6位小数,但并非全是有效数字,单精度有效7位,双精度16位

%e以指数形式输出实数小写e表示指数片面,小数点前有且仅有一位非0数字

%E以指数形式输出实数大写E表示指数片面

%g自动选取f或e格式中宽度较小的一种使用,不输出无意义的0

%%输出%

4输出值参数表:需要输出的数据项的列表,可以是变量或表达式,逗号隔开,类型与格式转换说明符相匹配

5每个格式转换说明符与输出值参数表中的输出值参数一一对应,没有输出值参数,格式操纵字符串就不需要格式转换说明符

6例:从键盘输入一个大写英文字母,将其转换为小写字母和其十进制ASCII码值显示在屏幕上

#include

voidmain

charch;

printfPleaseenterakey:;

ch=getchar;

ch=ch+32;

printf%c,%d\n,ch,ch;//printf%c,ch=putcharch,printf\n=putchar\n

7函数printf中的格式修饰符:在%和格式符中间插入格式修饰符,用于输出格式的微调,如:指定输出域宽、精度、左对齐等

英文字母l修饰格式符d,o,x,u时,用于输出long型数据

英文字母L修饰格式符f,e,g时,用于输出longdouble型数据

英文字母h修饰格式符d,o,x时,用于输出short型数据

输出域宽mm为整数,输出时占m列,若m0,当数据宽度小于m时,域内右靠齐,左补空格,当数据宽度大于m时,修饰符失效,按实际宽度输出,若m有前导符0,左边多余位补0;若m0,输出数据在域内左靠齐

显示精度.nn为大于等于0的整数,精度修饰符位于最小域宽修饰符之后,由圆点和整数构成,对于浮点数,用于指定输出的浮点数小数位数;对于字符串,用于指定从字符串左侧开头截取的子串字符个数

8使用const常量定义pi,编程从键盘输入圆的周长和面积,使其输出数据留存两位小数

#include

voidmain

constdoublepi=3.14159;

doubler,circum,area;

printfPleaseenterr:;

scanf%lf,r;

circum=2*pi*r;

area=pi*r*r;

printf输出没有宽度和精度的值:;

printfcircum=%f,area=%f\n,circum,area;

printf输出没有宽度和精度的值:;

printfcircum=%7.2f,area=%7.2f\n,circum,area;//域宽为7,占7个字符宽度,小数点也算一个字符,精度为2,小数点后留存2位

12.数据的格式化键盘输入:

1函数scanf的一般格式:scanf格式操纵字符串,参数地址表;

2格式操纵字符串:包括格式转换说明符,分隔符

3格式转换说明符以%开头,以格式字符终止,用于指定各参数的输入格式

4函数scanf的格式转换说明符:

%d输入十进制整数

%o输入八进制整数

%x输入十六进制整数

%c输入一个字符,空白字符包括空格、回车、制表符也作为有效字符输入%s输入字符串,遇到第一个空白字符包括空格、回车、制表符时终止%f或%e输入实数,以小数或指数形式输入均可

%%输入一个%

5参数地址表:由若干变量的地址组成的列表,用逗号分隔

6函数scanf中的格式修饰符:在%和格式符中间插入格式修饰符

英文字母l加在格式符d,o,x,u之前,用于输入long型数据;加在f,e之前,用于输入double型数据

英文字母L加在格式符f,e之前,用于输入longdouble型数据

英文字母h加在格式符d,o,x时,用于输入short型数据

输出域宽mm为正整数,指定输入数据的宽度,系统自动按此宽度截取所需数据

显示精度.nn为0或正整数,scanf没有精度格式修饰符,输入时不能规定精度疏忽输入修饰符*表示对应的输入项在读入后不赋给相应的变量

7函数scanf输入数值型数据时,被认为输入终止的几种处境:遇空格符、回车符、制表符;达成输出域宽;遇非法字符输入

8假设函数scanf的格式操纵字符串中存在除格式转换说明符以外的其他字符,务必将这些字符原样输入

#include

voidmain

inta,b;

scanf%d%d,a,b;//以空格作为分隔符,等价于scanf%d%d,a,b,等价于scanf%d%d,a,b,

printfa=%d,b=%d\n,a,b;//实际输入时,空格、回车符、制表符都可作为分隔符,即输入:12空格3412回车3412制表符34均可,

#include

voidmain

inta,b;

scanf%d,%d,a,b;//输入时务必以逗号作为分隔符,即只能输入:12,34

printfa=%d,b=%d\n,a,b;

#include

voidmain

inta,b;

scanfa=%d,b=%d,a,b;//输入时务必将a=和b=原样输入,即只能输入:a=12,b=34printfa=%d,b=%d\n,a,b;

C语言根基学识总结

#include

voidmain

inta,b;

scanf%2d%2d,a,b;//输入时将前两位数读入存到a中,接着两位存到b中,然后终止读取,即输入:1234,或123456结果一样

printfa=%d,b=%d\n,a,b;

#include

voidmain

inta,b;

scanf%d%d,a,b;

printfa=\%d\,b=\%d\\n,a,b;//输出a=12,b=34

#include

voidmain

inta,b;

scanf%d%*c%d,a,b;//任意字符都可作为分隔符,即输入:12,34或12?34或12+34结果都一样

printfa=%d,b=%d\n,a,b;

#include

voidmain

inta,b;

scanf%2d%*2d%d,a,b;//疏忽两位,输入123456

printfa=%d,b=%d\n,a,b;//输出a=12,b=56

对于程序

#include

voidmain

inta,b;

scanf%d%d,a,b;

printfa=%d,b=%d\n,a,b;

假设输入1234a回车,那么结果a=12,b=3,程序在遇到非法字符a时,会导致程序输入终止,此时a会读入12,b会读入3

假设输入123a回车,那么结果a=123,b=-858993460,程序在遇到非法字符a时,会导致程序输入终止,此时a会读入123,而b未能读入指定数据项数

假设在scanf函数中忘却在变量前加取地址运算符,会导致非法内存访问

13.%c格式符使用几种处境:

1用%c格式读入字符时,空格字符和转义字符包括回车都会被当做有效字符读入例:键盘输入一个整数加法算式:操作数1+操作数2,输出:操作数1+操作数2=计算结果

#include

voidmain

intdata1,data2;

charop;//输入:12空格+空格3回车//输出:12-858993460=-858993448

printfEnterdata1+data2\n;//输入:12空格3回车//输出:123=15

scanf%d%c%d,data1,op,data2;//输入:12+3回车//输出:12+3=15printf%d%c%d=%d\n,data1,op,data2,data1+data2;

2先输入一个数据后再输入字符型变量时,输入一个数据后,输入的回车符将被当做有效字符读给字符型变量

例:编程从键盘先后输入int型、char型和float型数据,要求每输入一个数据就显示这个数据的类型和数据值

voidmain

inta;

charb;

floatc;

printfPleaseinputaninteger:;

scanf%d,a;

printfinteger:%d\n,a;

//在输入一个整型数据后,输入的回车符被当做有效字符读给了字符型变量b了

printfPleaseinputacharacter:;

scanf%c,b;

printfchracter:%c\n,b;

printfPleaseinputafloatnumber:;

scanf%f,c;

printffloat:%f\n,c;

14.%c格式符存在问题的解决方法

1用函数getchar将数据输入时存入缓冲区中的回车符读入,以制止被后面的字符型变量作为有效字符读入

#include

voidmain

inta;

charb;

floatc;

printfPleaseinputaninteger:;

scanf%d,a;

printfinteger:%d\n,a;

getchar;//将存于缓冲区中的回车符读入,制止在后面作为有效字符读入

//函数getchar的返回值是一个回车符,已经制止了错误,不需要再将其赋给字符型变量使用

printfPleaseinputacharacter:;

scanf%c,b;

printfchracter:%c\n,b;

printfPleaseinputafloatnumber:;

scanf%f,c;

printffloat:%f\n,c;

2在%c前面加一个空格,将前面数据输入时存于缓冲区的回车符读入,制止被后面的字符型变量作为有效字符读入

voidmain

inta;

charb;

floatc;

printfPleaseinputaninteger:;

scanf%d,a;

printfinteger:%d\n,a;

printfPleaseinputacharacter:;

scanf%c,b;//在%c前面加空格,将存于缓冲区中的回车符读入

printfchracter:%c\n,b;

printfPleaseinputafloatnumber:;

scanf%f,c;

printffloat:%f\n,c;

//解释:在%c前加空格为什么能将存于缓冲区中的回车符读入

由于假设函数scanf的格式操纵字符串中存在除格式转换说明符以外的其他字符,务必将这些

字符原样输入,所以在%c前加空格,就务必在输入字符型数据前先原样输入空格,而空格,回车符,制表符在

函数scanf输入数值型数据时都代表输入终止,由实践可知,空格符、回车符、制表符在输入时等效

所以,缓冲区中的回车将代替需要原样输入的空格,因此,实际上,在%c前增加空格或者Tab键都可以完成,

并且与增加的`数量无关,且可以混合增加

3*经典例题:编程实现键盘任意输入字符,统计字母、数字、空格、其他字符数量首选字符串的方法:

#include

#defineN100

intmain

chara[N];

inti,m=0,n=0,b=0,c=0;

printf请输入字符:\n;

getsa;

fori=0;a[i]!=\0;i++

ifa[i]=aa[i]=z||a[i]=Aa[i]=Zm++;

elseifa[i]=0a[i]=9n++;

elseifa[i]==b++;

elsec++;

printf字母个数:%d\n,m;

printf数字个数:%d\n,n;

printf空格个数:%d\n,b;

printf其他字符个数:%d\n,c;

return0;

单个字符输入的方法,但是要解决缓冲区的问题

#include

intmain

charch;

inta,b,c,d;

a=b=c=d=0;

printf请输入字符:\n;

do

ch=getchar;

getchar;//除掉缓冲区的回车键,不然会当做其次个字符读入

ifch!=//用Tab键操纵输入终止,他在程序中只会展现一次并且统计一次,//然后终止,所以要去掉它,可以使用if语句,也可在前面初始化为d=-1ifch=ach=z||ch=Ach=Za++;

elseifch=0ch=9b++;

elseifch==c++;

elsed++;

whilech!=;

printf字母个数:%d\n,a;

printf数字个数:%d\n,b;

printf空格个数:%d\n,c;

printf其他字符个数:%d\n,d;

return0;

//解释:你可以把Tab操纵终止改成其他任意字符,包括字母、数字、/;都可以,

就是不能直接使用回车操纵终止,由于你在实际键盘输入时,需要打回车才能把前面的字符读入,当你输完回车后,就已经换行了,再回车就达不到你要的效果了,不成能把他读入,但是他会留在缓冲区下一次使用,所以说,理论上任意字符都可以操纵终止,但是不能直接使用回车再回车的方法,而getchar函数一次只能读一个字符,当你回车读入字符后,回车符就会留在缓冲区下一次使用,你可以试试,你把getchar这行语句解释,然后一次输入两个字符再回车的话,那么这时他也只能读入第一个字符,其次个字符和回车就会计入其次次、第三次的结果。

总结:这种方式与用字符串的识别在于,字符串可以统计任何字符,但是这种方式不能统计你用来操纵终止的字符,譬如说,你用/操纵终止,那么就不能统计/的数量了,而且你要把他去掉,由于在整个程序中/只会展现一次,然后就终止了

**当程序中展现两次或以上的键盘输入时,就有可能展现缓冲区的问题,只有一次输入,回车直接终止没有这种问题

15.考点题型:字符串常量的长度问题:

1字符串常量ab\\c\td\376的长度是A

A7B12C8D14

//ab\\c\td\376

2语句printf%d,strlenabs\no12\1\\;的输出结果是C

A11B10C9D8

//abs\no12\1\\

16.考点题型:赋值运算、关系运算的混合运算问题:

1设m,n,a,b,c,d的值均为0,执行m=a==b||n=c==d,m,n的值是C

A0,0B0,1C1,0D1,1

//==是算术运算符,=是赋值运算符,优先级:算术运算符赋值运算符,先判断a==b?是否正确

正确那么为真,把1赋给m,||是或运算,前面已经为真,所以||后面的就不会再运算了,结果就为真

所以m=1,n=0不变

2inta,b,m,n;初值依次为4,3,2,1,经计算m=a=bn=m

A1,1B1,0C0,1D0,0

//a=b为假,是并,前面已经为假,后面就不会再运算了,结果就为假,把0赋给m,即m=0,n=1不变

四、选择操纵布局

1.沃思提出"数据布局+算法=程序'只在面向过程的语言如C语言成立

2.算法的正确性衡量方法:

1有穷性2确定性3有效性4允许没有输入或者有多个输入5务必有一个或者多个输出

3.算法的描述方法:

1自然语言描述2流程图描述3NS布局化流程图描述4伪码描述

4.关系表达式:用作判断条件,结果只有真和假,n%2!=0等价于n%2,0表示假,非0表示真

5.分支布局:当条件P成立时,执行A操作,否那么执行B操作;假设B操作为空,即为单分支布局;

假设B操作不为空,即为双分支布局;假设B操作中又包含另一选择布局,那么构成多分支选择布局;

6.单分支例题:计算输出两整数最大值

单分支一般形式:if表达式P语句A

#include

voidmain

inta,b,max;

printfEntera,b:;

scanf%d%d,a,b;

ifab//单分支:if表达式P语句A

max=a;

ifa=b//单分支:if表达式P语句A

max=b;

printfmax=%d\n,max;

7.双分支例题:计算输出两整数最大值

双分支一般形式:if表达式P语句1

else语句2

#include

voidmain

inta,b,max;

printfEntera,b:;

scanf%d%d,a,b;

ifab

max=a;

else

max=b;

printfmax=%d\n,max;

8.条件运算符是C语言中唯一的三元运算符,需要三个操作数

9.条件运算符例题:计算输出两整数最大值

条件运算符一般形式:表达式1?表达式2:表达式3

含义:若表达式1为非0,那么结果为表达式2的值,否那么是表达式3的值

#include

voidmain

inta,b,max;

printfEntera,b:;

scanf%d%d,a,b;

max=ab?a:b;

printfmax=%d\n,max;

10.多分支操纵条件语句一般形式:

if表达式1语句1

elseif表达式2语句2

...

elseif表达式m语句m

else语句m+1

11.条件语句在语法上只允许每个条件分支中带一条语句,而要在分支里处理多条语句就要使用花括号,构成复合语句

12.随机数的使用方法:

1符号常量RAND_MAX在头文件#include中定义,标准C规定RAND_MAX不大于双字节整数的最大值32767

2随机函数rand产生的是一个在0~RAND_MAX之间的整数,即[0,32767]之间的整数

3利用求余运算rand%b可将函数rand生成的随机数变化到[0,b-1]

4利用rand%b+a可将随机数的取值范围平移到[a,a+b-1]

例:产生1~100的随机数:rand%100+1

13.例题:猜数嬉戏:计算机想一个数,人猜对了提示Right!,否那么提示Wrong!,并报告大小#include

#include

voidmain

intmagic,guess;

magic=rand;//随机数

printfPleaseguessanumber:;

scanf%d,guess;

ifguessmagic//多分支

printfWrong!Toobig!\n;//复合语句

elseifguess

printfWrong!Toosmall!\n;

else

printfRight!\n;

printfThenumberis:%d\n,magic;

14.switch语句:用于多路选择,一般处境大于三种,用开关语句代替条件语句

1switch语句一般形式:

switch表达式

case常量1:

可执行语句序列1//留神:语句序列不使用花括号

case常量2:

可执行语句序列2

case常量n:

可执行语句序列n

default:

可执行语句序列n+1

2switch语句相当于一系列的if-else语句

3switch后圆括号内的表达式只能是char型或int型

4关键字case后接常量,类型与表达式类型一致,常量的值务必互不一致

5常量与case中间至少有一个空格,常量后面是冒号

6case本身并没有条件判断的功能,若case后面的语句省略不写,那么表示它与后续case执行一致的语句

7switch语句的执行过程:

第一步,计算switch后表达式的值

其次步,将表达式的值依次与case后的常量对比

第三步,假设相等,执行case后的代码段,执行完毕,可使用break语句跳出switch语句

假设没有break语句,不会再对比,程序将依次执行下面的case后的语句,直到遇到break或者switch的为止

15.例题:编程实现简朴计算器功能

#include

voidmain

intdata1,data2;

charop;

printfEnteryourexpression:;

scanf%d%c%d,data1,op,data2;

switchop

case+:

printf%d+%d=%d\n,data1,data2,data1+data2;

break;

case-:

printf%d-%d=%d\n,data1,data2,data1-data2;

break;

case*:

casex:

caseX:

printf%d*%d=%d\n,data1,data2,data1*data2;

break;

case/:

if0==data2//也可写成data2==0,写0==data2的好处:

//由于赋值表达式左值务必是变量,假设把==误写成=,会提示错误

printfDivisionbyzero!\n;

else

printf%d/%d=%d\n,data1,data2,data1/data2;

break;

default:

printfInvalidoperator!\n;

//break;这句一般不需要,由于没有break就会依次执行下面的步骤直到break或者switch的

//这里已经是switch的了

16.例题:编程实现简朴计算器功能,能举行浮点数运算,操作数与运算符之间可参与任意多个空格

#include

#include

voidmain

floatdata1,data2;

charop;

printfEnteryourexpression:;

scanf%f%c%f,data1,op,data2;

switchop

case+:

printf%f+%f=%f\n,data1,data2,data1+data2;

break;

case-:

printf%f-%f=%f\n,data1,data2,data1-data2;

break;

case*:

casex:

caseX:

printf%f*%f=%f\n,data1,data2,data1*data2;

break;

case/:

iffabsdata2=1e-7

printfDivisionbyzero!\n;

else

printf%f/%f=%f\n,data1,data2,data1/data2;

break;

default:

printfInvalidoperator!\n;

//内存中的浮点数所表示的精度是有限的,所以对比实型变量data2与0是否相等时,不能像整型变量与0对比那样直接用相等关系运算符与0对比,而应使用如下方式判断实型变量data2的值是否位于0邻近的一个很小的区间内,即:iffabsdata2=1e-7

17.规律运算符和规律表达式

规律非:!,单目运算符,右结合,优先级最高

规律与:,双目运算符,左结合,优先级较高

规律或:||,双目运算符,左结合,优先级较低

例:判断某一年year是否是闰年的条件:

1能被4整除,但不能被100整除;

1能被400整除

规律表达式:year%4==0year%100!=0||year%400==0

或:year%4==0year%100!=0||year%400==0

18.更加留神:在计算含有规律运算符和||的表达式时,通常尽量使用最少的操作数来确定表达式的值,这就意味着表达式中的某些操作数可能不会被计算。

例:ifa1b++2c--!=0中,仅在条件表达式a1为真时,才会计算后面的值

19.程序测试:

1程序测试只能证明程序有错,不能证明程序无错

2例:编程输入三角形三边长a,b,c,判断他们能否构成三角形,能构成什么三角形#include

#include

#defineEPS1e-1

voidmain

floata,b,c;

intflag=1;

printfEntera,b,c:;

scanf%f,%f,%f,a,b,c;

ifa+bcb+caa+cb

iffabsa-b=EPSfabsb-c=EPSfabsc-a=EPS

printf等边;

flag=0;

elseiffabsa-b=EPS||fabsb-c=EPS||fabsc-a=EPS

printf等腰;

flag=0;

iffabsa*a+b*b-c*c=EPS||fabsb*b+c*c-a*a=EPS||fabsa*a+c*c-b*b=EPS

printf直角;

flag=0;

ifflag

printf一般;

printf三角形\n;

else

printf不是三角形\n;

3例:编程将输入的百分制劳绩转换为五分制劳绩输出

#include

voidmain

intscore,mark;

printfEnterscore:;

scanf%d,score;

ifscore0||score100

mark=-1;//这个if语句很重要,假设去掉,边界测试101~109,-1~-9会出错

else

mark=score/10;

switchmark

case10:

case9:

printf%d-优!\n,score;

break;

case8:

printf%d-良!\n,score;

break;

case7:

printf%d-中!\n,score;

break;

case6:

printf%d-及格!\n,score;

case5:

case4:

case3:

case2:

case1:

case0:

printf%d-不及格!\n,score;

break;

default:

printfInputerror!\n;

20.对输入非法字符的检查与处理

1例:输入两个整型数,计算并输出两个整数的最大值

#include

voidmain

inta,b,max;

printfEntera,b:;

scanf%d,%d,a,b;

max=ab?a:b;

printfmax=%d\n,max;

//隐含问题:在VisualC++下

1.假设输入3.2,1那么输出3

2.假设输入1,3.2那么输出3

3.假设输入q那么输出-858993460

//解决手段:

#include

voidmain

inta,b,max,ret;

do

printfEntera,b:;

ret=scanf%d,%d,a,b;

ifret!=2//返回在遇到非法字符前已告成读入的数据项数

//但是scanf函数不做类型检查,所以输入1,3.2会输出3

printfInputerror!\n;

whilegetchar!=\n;

else

max=ab?a:b;

printfmax=%d\n,max;

whileret!=2;

21.位运算符的使用

1位运算是对字节或字内的二进制数位举行测试、抽取、设置或移位等操作

2位运算的操作对象只能是char和int类型

3C语言中共有6种位运算符,只有按位取反是单目运算符,其他都是双目运算符

4关系运算和规律运算的结果要么是0,要么是1,而位运算结果可为任意值,但每一位都只能是0或1

56种位运算符:

按位取反~用于加密处理,一次求反加密,二次求反解密

左移位

右移位

按位与用于对字节中某位清零

按位异或^

按位或|用于对字节中某位置1

6按位取反~1=0,~0=1

例:~5=-6

~00000101

11111010是-6的补码

7按位与00=0,01=0,11=1

例:将15的最低位不变,其余位清零151=1

00001111

00000001

00000001

8按位或0|0=0,0|1=1,1|1=1

例:将15的最高位不变,其余位均置115|127=127

00001111

|01111111

01111111是127的补码

9按位异或0^0=0,0^1=1,1^1=0

例:3^5=6

00000011

^00000101

00000110是6的补码

10左移位

x

例:将15左移1、2、3位的二进制补码如下

初始字节内容00001111对应十进制15

左移1位字节内容00011110对应十进制30

左移2位字节内容00111100对应十进制60

左移3位字节内容01111000对应十进制120

11右移位

xn表示把x的每一位向右移n位,当x为有符号数时,左边空位补符号位值算术移位

当x为无符号位时,左边空位补0规律移位

例1:将15右移1、2、3位的二进制补码如下

初始字节内容00001111对应十进制15

右移1位字节内容00000111对应十进制7

右左移2位字节内容00000011对应十进制3

右移3位字节内容00000001对应十进制1

例2:将-15右移1、2、3位的二进制补码如下

初始字节内容11110001对应十进制-15

右移1位字节内容11111000对应十进制-8

右左移2位字节内容11111100对应十进制-4

右移3位字节内容11111110对应十进制-2

12无论左移位还是右移位,从一端移走的位不移入另一端,移走的位的信息就损失了

13左移位和右移位可以分表代替整数的乘法和除法,左移n位相当于乘以2^n,右移n为相当于除以2^n

14例:写出运行结果

#includex0000000000001100

voidmain~x1111111111110011

~x反码1000000000001100

intx=12,y=8;~x反码加一1000000000001101-13printf%5d%5d%5d\n,!x,x||y,xy;

printf%5u%5d%5d\n,~x,x|y,xy;

printf%5d%5d%5d\n,~x,x|y,xy;

输出:011

4294967283128

-13128

五、循环操纵布局

1.循环:包括计数操纵的循环和条件操纵的循环

2.布局化程序设计的三种根本布局:依次布局、选择布局、循环布局

3.循环布局的类型:

1当型循环布局:for语句适合循环次数已知,计数操纵的循环

2直到型循环布局:while语句、do-while语句适合循环次数未知,条件操纵的循环

4.while语句

1一般形式为:

while循环操纵表达式

|

语句系列|循环体

|

2循环操纵表达式在执行循环体之前测试

3执行过程:

计算循环操纵表达式的值

假设循环操纵表达式的值为真,那么执行循环体中的语句,并返回步骤1

假设循环操纵表达式的值为假,就退出循环,执行循环体后面的语句

5.do-while语句

1一般形式为:

do

|

语句系列|循环体

while循环操纵表达式;

2循环操纵表达式在执行循环体之后测试

3执行过程:

执行循环体中的语句

计算循环操纵表达式的值

假设循环操纵表达式的值为真,那么返回步骤1

假设循环操纵表达式的值为假,就退出循环,执行循环体后面的语句

6.for语句

1一般形式为:

for初始化表达式;循环操纵表达式;增值表达式

|

语句系列|循环体

|

2在每次循环体被执行之前,都要对循环操纵条件测试一次,每次循环体执行完以后都要执行一次增值表达式

3初始化表达式作用:循环变量初始化,即赋初值

4循环操纵表达式:是操纵持续执行的条件,当表达式的值为非0时重复执行循环

5增值表达式作用:每执行一次循环,循环操纵变量增值

6for语句三个表达式之间用分号分隔,有且只能有两个分号

7循环操纵表达式若省略,表示循环条件为永真

8初始化表达式和增值表达式都可省略,但是务必有其他语句回响其作用

7.例:从键盘输入n,然后计算输出1+2+3+??n的值

1while语句编程实现

#include

voidmain

inti=1,n,sum=0;//sum确定要初始化,不然会是随机值

printfEntern:;

scanf%d,n;

whilei=n

sum+=i;

i++;

printf1+2+3+??+%d=%d\n,n,sum;

2do-while语句编程实现

#include

voidmain

inti=0,n,sum=0;

printfEntern:;

scanf%d,n;

do

sum+=i;

i++;

whilei=n;

printf1+2+3+??+%d=%d\n,n,sum;

3for语句编程实现

#include

voidmain

inti=1,n,sum=0;

printfEntern:;

scanf%d,n;

fori=1;i=n;i++

sum+=i;

printf1+2+3+??+%d=%d\n,n,sum;

8.逗号运算符

1全体运算符中优先级最低,左结合

2作用:可实现对各个表达式的依次求值

3结果:将结果一个表达式的值作为整个逗号表达式的值

4例:从键盘输入n,然后计算输出1+2+3+??n的值

C语言根基学识总结

#include

voidmain

inti,j,n,sum=0;

printfEntern:;

scanf%d,n;

fori=1,j=n;i=j;i++,j--

sum+=i+j;

printf1+2+3+??+%d=%d\n,n,sum;

9.空语句

1仅由一个分号构成的语句

2作用:什么也不做,只起延时作用

3例:fori=1;i50000000;i++

;

或fori=1;i50000000;i++

或fori=1;i50000000;i++;

fori=1;i=n;i++;

sum+=i;

等价于

fori=1;i=n;i++

;

sum+=i;

4例:从键盘输入n,然后计算输出1+2+3+??n的值

#include

voidmain

inti,j,n,sum=0;

printfEntern:;

scanf%d,n;

fori=1,j=n;i=j;i++,j--;

sum+=i+j;

printf1+2+3+??+%d=%d\n,n,sum;

//输出结果:101

10.死循环

1while语句行末加分号将导致死循环

2例:i=1;

whilei=n;//行末加分号导致死循环

sum+=i;

i++;

相当于

i=1;

whilei=n//当输入大于1的n值,循环体中没有语句可以变更操纵变量i//使得循环条件为永真,导致死循环

;

sum+=i;

i++;

11.while语句和do-while语句的识别

1while先判断后执行,有可能一次都不执行,do-while先执行后判断,至少执行一次

2例:n=101;n=101;

whilen100do

printfn=%d\n,n;printfn=%d\n,n;

n++;n++;

whilen100;

//循环一次也不执行//结果:输出n=101,循环执行一次

3例:分别用while和do-while语句编程,输入一组数据,然后显示每次输入数据举行累加运算的结果,输入0终止

do-while语句实现:

#include

voidmain

intnum,sum=0;

do

printfEnternum:;

scanf%d,num;

sum+=num;

printfsum=%d\n,sum;

whilenum!=0;

while语句实现

#include

voidmain

intnum=1,sum=0;//给num赋任意非0值都可以

whilenum!=0

printfEnternum:;

scanf%d,num;

sum+=num;

printfsum=%d\n,sum;

12.计数操纵的循环:循环次数事先已知的循环

1例1:编写一个程序,从键盘输入n,计算输出n!#include

voidmain

inti,n,sum=1;

printfEntern:;

scanf%d,n;

fori=1;i=n;i++

sum*=i;

printf%d!=%ld\n,n,sum;

2例2:编写一个程序,从键盘输入n,计算输出1!,2!??n!#include

voidmain

inti,n,sum=1;

printfEntern:;

scanf%d,n;

fori=1;i=n;i++

sum*=i;

printf%2d!=%ld\n,i,sum;

3例:键盘输入n,编程计算1!+2!+3!+??+n!

#include

voidmain

intterm=1,sum=0,i,n;

printfEntern:;

scanf%d,n;

fori=1;i=n;i++

term*=i;

sum+=term;

printf1!+2!+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论