一章数据类型.ppt
第2章 数据类型,第2次课,本章内容,2.1案例中的数据类型与数据类型的分类2.2 整型数据2.3 实型数据2.4 字符型数据2.5 格式化输入/输出函数2.6 数据类型转换2.7一维数组的基本概念2.8 结构体类型,【学习目标】掌握C语言的基本数据类型掌握C语言中常量和变量的使用方法掌握格式化输入/输出函数的使用理解数据类型转换了解数组的概念及其使用方法了解结构体的概念及其使用方法,在定义变量时必须指定变量的类型。为什么要指定变量的类型呢?因为定义变量后,系统要在内存中为它分配存储单元,而不同类型的数据占用存储空间的大小和数据的存储方式是不同的,明确地说明其类型有利于内存的分配。,2.1案例中的数据类型与数据类型的分类,设计学生信息管理系统时,首先要解决的问题是:大量的学生信息如何有效地组织起来,以方便访问和处理。如果数据组织得好,将能够简化后面的编程工作,收到事半功倍的效果,数据类型的定义和使用对于应用系统的开发非常重要。,【例2-1】学生信息管理系统中学生信息的定义,该定义包含在student.h头文件中。,struct stu_typechar num15;/学号char name10;/姓名int age;/年龄int c;/C语言分数int math;/数学分数int en;/英语分数int sum;/总分float ave;/平均分;,2.1.2 数据类型的分类,一、数据类型,#include stdio.h#define PI 3.14159main()float r;float area;r=2;area=PI*r*r;printf(area=%fn,area);,if(sex=f|sex=F)if(age=55)printf(She is retire.n);else printf(She is working.n);,程序中处理的数据有不同的类别,数据表达的方式可以有常量,可以有变量,实数,字符及字符串,2.2 整型数据 2.2.1 整型变量,整型变量是用来保存整数的变量。例如,在学生信息管理系统中,整型变量的定义如下:int age;/年龄int c;/C语言分数int math;/数学分数int en;/英语分数,变量定义,必须先定义后引用定义形式:数据类型 变量名表;,定义变量后,系统要在内存中为它分配存储单元,以便存放数据,而不同类型的数据占用存储单元的长度是不同的。,根据变量所占存储空间的大小和取值范围的不同,整型变量可以分为基本整型、短整型和长整型三种。,根据整型变量的值能否取负数,将上面的每种类型又进一步分为以下两种:有符号:signed无符号:unsigned 对于有符号整数,关键词signed可以省略。例如:singed int age;等价于 int age;学生的年龄不可能为负数,因此,也可以定义为无符号类型:例如:unsinged int age;,2.2.2 整型常量,整型常量即整数,在程序中可用以下三种进制来表示:十进制整型常量(如:212、0、-25)八进制整型常量(用数字0作为前导,如:0236,042,0321)十六进制整型常量(用0 x作为前导,如:0 x2AF,0 x42,0 x3E1),整型常量,#include stdio.h void main()int a,b,c;a=11;b=011;c=0 x11;printf(a=%d,b=%d,c=%dn,a,b,c);,%d代表输出的格式是十进制整数形式,2.3 实型数据 2.3.1 实型变量,实型(也称浮点型)变量用来保存具有小数点的实数。例如:float ave;/平均分,根据实型变量的取值范围和有效数字位数(也称精度)的不同,将实型变量分为单精度型和双精度型两种。,实型常量,/*ch3_003.c 实型常量*/#include void main()float x,y;double z;x=12.342;y=1.234e-5;z=-12E-2;printf(x=%f,y=%f,z=%lfn,x,y,z);,%f代表以小数形式输出单、双精度数,默认6位小数;,在vc+中实型常量无论是小数形式,还是指数形式系统都自动按双精度型(double)处理,指数形式表示时字母e(或E)之前必须有数字,且e后面的指数必须为整数。e3、13e2.3都是错误的,实型常量有两种表现形式:十进制小数形式。指数形式。,字符型变量用来保存一个字符,在内存中占一个字节,以标识符char表示。例如,在学生信息管理系统中,用户删除一个学生信息的程序代码如下:,2.4 字符型数据字符型变量,char m;/输入要删除学生的学号的程序代码,略printf(确认删除该学生的信息吗?(y/n):);m=getche();if(m=y|m=Y)/删除学生信息程序代码,略,#include void main()char c1;/定义字符变量c1 scanf(%c,/按字符形式(%c)输出变量c1的值,【例2-2】写出下面程序的运行结果。,实际上字符型数据在内存中存储的是字符的ASCII码值。,2.4.2 字符型常量,在程序中有以下二种形式的字符型常量:(1)普通字符常量用一对单撇号将一个字符括起来。例如:char c1=a,c2=A;(2)转义字符转义字符是以反斜杠()开头的字符序列,是一种特殊形式的字符常量。例如:n,转义字符,反斜杠后面跟一个字符,表示特定的功能,如:n。反斜杠后面跟一个字符的ASCII码值,表示其对应的字符。如:101或x41表示ASCII码值为十进制数65对应的字符,即A,这种方式常用来表示那些不能显示的ASCII字符。例如,用0来表示ASCII码值为0的字符。,常量与变量,转义字符举例(ch3_006.c)#include stdio.h”void main()printf(101 x42 Cn);printf(I say:How are you?n);printf(C Programn);printf(Turbo C);,运行结果:(屏幕显示)A B CI say:”How are you?”C ProgramTurbo C,ch3_007.c#include stdio.h”void main()printf(“Yb=n”);,运行结果:屏幕显示:=打印机输出:,2.4.3 字符串常量,字符串常量用一对双撇号将若干个字符括起来,双撇号是定界符,不是字符串的内容。例如:学号“2011110101“、姓名“张小天”等。,字符串常量,/*ch3_005.c 字符串常量*/#include stdio.h”void main()printf(Turbo C);,字符串常量以双撇号定界!abc既不是字符常量也不是字符串常量,为什么?,字符常量与字符串常量的区别,编译程序在每个字符串的后面自动加上0以示结束。字符串”Visual C+”共有11个字符,除本身10个(空格也算一个)外,还加上0。“x”与 x的不同点:“x”在存储的时候会占2个字节x只有1个字节,C语言中没有字符串变量类型字符型数据只能存储于字符型变量中,例如,char max=”How are you doing!”,这样的语句使用是错误的。如果要存储字符串数据的话,那么只能以字符数组或指针形式实现。,1.下面不正确的字符串常量是()A)abc B)“1212”C)“0”D)“”2.若有说明语句:char c=72;,则变量c()A)包含1个字符 B)包含2个字符C)包含3个字符 D)说明不合法,c的值不确定3.在C语言中,char型数据在内存中的存储形式是()补码B)反码C)原码D)ASC码4.下面正确的字符常量是()A)“c”B)”C)W D),变量在使用前必须定义,且应该初始化:1.在定义变量同时使变量初始化:int a=3;/指定a为整型变量,初值为3 float f=3.56;/指定f为实型变量,初值3.56 char c=a;/指定c为字符型变量,初值为a2.可以使定义的一部分变量赋初值,如:int a,b,c=5;3.如果对几个变量赋以同一个初值,不能写成:int a=b=c=5;而要写成:int a=5,b=5,c=5;或 int a,b,c;a=b=c=5;,变量赋初值(变量初始化),符号常量,#include#define PI 3.14159/定义符号常量PIvoid main()int r;float area;scanf(%d,/*输出结果到标准输出设备上*/,数据类型,/*ch3_009数据溢出的错误*/#include stdio.hvoid main()int a;a=3400000000;printf(a=%dn,a);,超过了整数的范围上溢出,由于不同数据类型所占据的存储空间不同,在定义变量的类型时应充分考虑变量的取值范围。例如,整型(int)类型的变量取值范围为-231 231-1。如果在运算中,数值超出这个范围则称为溢出,大于231-1称为上溢,小于-231称为下溢,小结,整型、实型和字符型是三种应用最广泛的数据类型,被称为基本数据类型。根据整型变量所占存储空间的大小和取值范围的不同,将整型分为基本整型(int)、短整型(short int)和长整型(long int)三种。根据整型变量能否取负数,将上面的每种类型又进一步分为:有符号(signed)和无符号(unsigned)两种。根据实型变量的取值范围和有效数字位数的不同,将实型分为单精度型(float,有效数字为6位)和双精度型(double,有效数字15位)两种。字符常量分为字符常量和字符串常量两种,c语言无字符串变量。字符常量采用单撇号作为定界符,只能包含一个字符。字符串常量采用双撇号作为定界符,可以包含若干个字符,并且字符串常量的末尾由系统自动加上字符串结束标志(0)。,数据的输入和输出格式化输入函数 scanf()格式化输出函数 printf()字符输入函数 getchar()字符输出函数 putchar(),输入和输出函数,一、格式化输出,格式:printf(“格式控制串”,输出项列表)功能:按指定格式向显示器输出数据,格式字符:%d%f%c 等代换成变量的值,普通字符原样输出!,一、格式化输出,例ch4_001main()int a;float b;char c;a=12;b=123.456;c=d;printf(“a=%d,b=%f,c=%c,a,b,c);,输出变量的值,一、格式化输出,#include void main()int a=4;float b=234.56;char c=a;printf(b=%en,b);,常用格式符有:%d,%f,%e,%c等,格式符归纳如下:%修饰符格式字符,一、格式化输出,一、格式化输出,例ch4_002main()int a=4;float b=2;char c=a;printf(a=%5d,b=%5.1f,c=%5cn,a,b,c);printf(a=%-5d,b=%-5.1f,c=%-5cn,a,b,c);,%修饰符格式字符:修饰符常用的有:整数、-、+、(小写字母l)%ld:表示输出十进制长整型%lf:表示按double型输出。%-5d,表示输出整数占5个字符宽,左对齐。%+d,表示在整数前加+号,二、格式化输入,scanf函数:格式输入函数格式:scanf(“格式控制串”,地址表)功能:按指定格式从键盘读入数据,存入指定的地址对应的存储单元中地址表:变量的地址,常用取地址运算符&格式控制字符:d,i,u,o,x(X),c,s,f,e(P20表1.2),二、格式化输入,/*例ch3_003*/#include void main()int a,b,c;scanf(“%d%o%x”,空格、回车是整数、实数型数据输入过程合法的分隔符!,二、格式化输入,/*例 ch3_004*/#include void main()int a,b;scanf(%d,%d,第2个数据没有正确送到变量b中,二、格式化输入,例 scanf(“%d:%d:%d”,输入 12:30:45 则12 h,30 m,45 s,例 scanf(“a=%d,b=%d,c=%d”,输入 a=12,b=24,c=36,例 scanf(%4d%2d%2d,输入 19991015 则1999yy,10 mm,15 dd,例 scanf(%3d%*4d%f,输入 12345678765.43 则123k,8765.43f,*表示本输入项在读入后不赋给相应的变量,二、格式化输入,请大家思考:如何让屏幕给出适当的提示信息?如 屏幕输出”a=“,然后用户输入一个数据到a中;紧接着,屏幕输出”b=“,然后用户输入一个数据到b中。,#include void main()int a,b,c;printf(a=);scanf(%d,scanf函数本身没有输出功能!一定要借助printf给用户一个清楚的提示信息!,格式化输入(字符数据输入),例:ch3_007#include void main()char a,b,c;scanf(%c%c%c,所有空格字符、转义字符都将作为有效字符被接收;因此不能再使用空格字符或其他字符进行数据项的分隔。,格式化输入,字符串的输入和输出方式#include void main()char c10;scanf(%s,c);printf(“%sn,c);,例:从键盘输入一个小写字母,在显示屏上显示对应的大写字母。要求有输入、输出提示信息。程序代码如下:#include/注明输入输出函数使用的头文件void main()/定义主函数char c1,c2;/定义变量printf(请输入一个小写字母:);/显示输入提示信息scanf(%c,/显示大写字母,字符的输入和输出,字符输入函数格式:getchar()功能:从键盘读一字符返值:返回读取的代码值;字符输出函数格式:putchar(c)参数:c为字符常量、变量或表达式功能:把字符c输出到显示器上返值:为显示的代码值;,在使用标准库函数putchar()和 getchar()时,需要包含头文件stdio.h,字符的输入和输出,运行结果:A B,/*ch4_009.c*/#include void main()int c;char a;c=65;a=B;putchar(c);putchar(n);putchar(a);,注意:putchar()函数本身没有换行的功能!,字符的输入和输出,#include void main()int c;printf(Enter a character:);c=getchar();printf(%c-hex%xn,c,c);,运行结果:Enter a character:AA-hex41,三种控制结构,程序只有三种基本结构顺序结构选择结构循环结构,顺序结构举例,N_S流程图(算法描述),顺序结构举例,将该例修改成由键盘输入三个系数。,程序中的运算,运算符与表达式1.算术运算符2.赋值运算符3.关系运算符4.逻辑运算符5.条件运算符6.逗号运算符7.长度运算符,程序中的运算,运算符与表达式1.算术运算符双目(二元)运算符+-*/%单目(一元)运算符+-改变优先级(),注意:/的两个操作数如果为同种类型,结果也是同样的类型,1/2=等于?%只能用于两个整数之间!10%3结果为1,算术运算示例,课堂练习,已知华氏温度转换为摄氏温度的公式如下:其中C为摄氏温度,F为华氏温度,编写程序将任意的华氏温度转换为摄氏温度输出:void main()int F,C;F=300;C=5/9(F-32);printf(%dn,C);请问程序中有几处错误?如何修改?,程序中的运算,求余运算符“%”要求左操作数和右操作数都是整数,运算结果是两个操作数相除的余数。,求余运算符“%”,算术运算符及其表达式,1.基本的算术运算符+(加),-(减),*(乘),/(除),%(求余)2.自增、自减运算符m=+i;等价于i=i+1;m=i;m=i+;等价于m=i;i=i+1;因此,+i(前置)和i+(后置)的作用都是将变量i的值加1,两者的区别在于表达式本身的值不同。表达式+i的值为变量i加1之后的值,而表达式i+的值为变量i加1之前的值。-i和i-与之类似。,程序中的运算,自增和自减运算符只能用于变量,不能用于常量或表达式,如3+,x-2-是错误的。,注意:+-若为后缀,则先计算,后自加(减);+-若为前缀,则先自加(减),后计算,#include void main()int i,j,k;j=3;i=2;k=+j/i+;printf(k=%d,j=%d,i=%d,k,j,i);,K=2,j=4,i=3,例3.13:,示例ch3_013单目运算+-,printf()中输出表达式的运算顺序#include main()int a=1,b=2;printf(“x=%d,y=%dn”,+a+b,+b+a);执行结果为x=5,y=4printf()中输出表达式的运算顺序是从右向左的,程序中的运算,运算符与表达式算术运算符赋值运算符逗号运算符,注意:赋值号左边只能是变量名,不能是常量、表达式。,程序中的运算,赋值运算符简单赋值运算=复合赋值运算符+=,-+,*=,/=,%=,赋值表达式,赋值表达式是由赋值运算符连接常量、变量、表达式等构成的式子,它的一般格式如下:变量 赋值运算符 表达式例如:a=4+(b=6),括号内的b=6又是一个赋值表达式。赋值表达式的值为赋值后运算符左侧变量的值。变量a的值为多少?,程序中的运算,简单赋值运算=,例ch3_014:,程序中的运算,复合赋值运算符+=,-+,*=,/=,%=,/ch3_015复合赋值运算符示例#include stdio.hvoid main()int j=3,i=2;i+=3;j+=i;printf(j=%dn,j);,i+=3相当于i=i+3j+=i 相当于j=j+i;,思考:int j=3,i=2,k=1;k-=j-=i;运算之后 i,j,k,2 1 0,程序中的运算,例ch3_016:复合赋值运算示例,程序中的运算,运算符与表达式算术运算符赋值运算符逗号运算符,程序中的运算 逗号运算符,逗号运算符 用逗号将几个表达式分隔,构成一个逗号表达式。,/*逗号运算符*/void main()int a,b,c;a=3;b=4;c=(+a,+b);printf(%dn,c);,C=5,注意:逗号表达式的值等于最后面一个表达式的值;逗号表达式的优先级最低,想一想,括号取消会影响运行结果吗?,长度运算符,长度运算符用关键词sizeof表示,用来计算某种类型的数据在内存中所占的字节数。其语法格式如下:sizeof(常量或变量名)或sizeof(类型名)例如:double s=1.0;printf(%d,sizeof(2);printf(%d,sizeof(s);printf(%d,sizeof(short);,典型错误,#include#include void main()int a,b,c,p,area;p=(a+b+c)/2;area=sqrt(p(p-a)(p-b)(p-c);printf(请输入三边长a b c:/n);scanf(a=%d,b=%d,c=%d/n,可以看出,在顺序结构程序设计中,语句出现的先后次序决定了语句的 执行顺序!,运算过程中的类型转换,在表达式中进行运算时,通常会将不同类型的数据混合使用,此时就会关系到类型转化的问题。如:5*4.5一般转换规则即:由占存储空间少的数据类型向占存储空间多的数据类型转换。,运算过程中的类型转换,类型转换:第一类:自动转换,char c;c=a-32;,隐式转换1:运算转换,,int a=5,b=3;float c;c=a%b;,隐式转换2:赋值转换,再如以下语句:char c=A;double y=2.1;y=30+c+y;处理过程如下:(1)计算30+c。由于c是char型,先将其转换成int型,另外,A的ASCII值是65,因此,计算结果为95。(2)计算95+y。先将整型常量95转换成double型,相加结果为97.1,再将它赋给变量y。,运算过程中的类型转换,float a=5,b=3;int c;c=(int)a%(int)b;,强制类型转换,一般形式:(类型名)(表达式)例(int)(x+y)(int)x+y(double)(3/2)(int)3.6,int a=5,b=3;float c;c=(float)a/b;,第二类:强制类型转换程序设计中有时需要将表达式的值转换为某一特定类型时,自动转换不一定能产生正确的结果。,程序中的运算,Ch3_017强制类型转换,运算过程中的类型转换,请大家分析下面程序中所包含的类型转换:#include void main()float x=4.5,y=1.5;printf(%f,(x+y)/3-(int)x%(int)y);,习题,1.以下选项中,不属于C语言的类型的是()A)signed short int B)unsigned long intC)unsigned int D)long short2.下面四个选项中,均是不合法的用户标识符的选项是()A)A P_0 do B)float 1a0 _AC)b-a goto int D)_123 temp INT3.以下选项中能用作数据常量的是()A)o15 B)0118C)1.5e1.5D)115L4.字符串“”EOFn=-61“”的长度是()A)8 B)9C)14D)非法字符串5.将字符g赋给字符变量c,正确的表达式是()A)c=147 B)c=147C)c=147D)c=0147,2.5 一维数组的基本概念,整型、实型、字符型都是基本数据类型,每个变量只能存储一个数据。例如,要保存100个学生的分数。再如,在学生信息管理系统中,学生的姓名、学号由多个字符组成,如学号“2011110101”。由于一个字符型变量只能保存一个字符,所以要保存学号“2011110101”,需要定义10个字符型变量c1、c2、c10,这样非常烦琐。,因此,定义了以下两个字符型数组来保存学生的学号和姓名:char num15;/学号char name10;/姓名一维数组定义的一般格式如下:类型说明符 数组名数组长度;例如:int a5;定义了一个整型数组a,它包含5个数组元素。需要注意的是:数组元素的下标从0开始,并且所有元素在内存中连续存放。因此,数组a的5个元素在内存中的存储形式如图2-3所示。,【例2-3】定义一个保存学生分数的数组score5,然后将50、60、70、80、90分别赋给数组的5个元素,接着从键盘输入一个数组下标号,输出该下标对应的学生分数。,#include void main()int score5,i;score0=50;score1=60;score2=70;score3=80;score4=90;printf(请输入数组下标号:);scanf(%d,【例2-4】从键盘输入一个学生的学号后,在屏幕上输出该学号。,#include void main()char num15;/定义学生学号scanf(%s,num);/输入学生学号printf(“该学生的学号为:%sn”,num);/输出,2.6 结构体类型,在学生信息管理系统中,学生信息中的学号、姓名、年龄等项目不是一个个孤立的数据,而是相互联系的一个整体,那么在编程时如何体现出它们之间的联系呢?,2.6.1 结构体类型的定义,在定义结构体变量之前,先要定义结构体类型,结构体类型的定义格式如下:struct 结构体名类型说明符 成员名1;类型说明符 成员名2;类型说明符 成员名n;,例如,表示学生信息的结构体类型定义如下:struct stu_typechar num15;/学号char name10;/姓名int age;/年龄;,2.6.2 结构体变量的定义和引用,1.结构体变量的定义结构体类型只是一种数据类型,类似于int,它本身不能保存数据,但是可以用它来定义变量,然后将数据保存到结构体变量中。结构体变量的定义格式如下:struct 结构体名 变量列表;例如,定义三个学生结构体变量,方法如下:struct stu_type stu1,stu2,stu3;上面的定义类似于我们用整型int定义三个整型变量,如:int i,j,k;,2.结构体变量的引用有了结构体变量,我们就可以使用其成员,引用格式如下:结构体变量名.成员名例如:stu1.c表示第1个学生的C语言成绩。如果要从键盘输入第一个学生的C语言成绩,加10分后输出该成绩,可采用以下语句:scanf(“%d”,可以看出:结构体成员stu1.c的使用方法和一般变量的使用方法相同。,【例2-5】从键盘输入一个学生的学号、姓名、年龄、各科分数,求总分和平均分后,在屏幕上输出他的所有信息。,#include void main()struct stu_typechar num15;char name10;int age;int c;int math;int en;int sum;float ave;struct stu_type stu1;printf(请输入学号:);scanf(%s,stu1.num);printf(请输入姓名:);scanf(%s,stu1.name);printf(请输入年龄:);scanf(%d,