C语言第二讲数据类型2
- 格式:doc
- 大小:150.50 KB
- 文档页数:9
C/C++程序设计第2 章数据类型及表达式计算机学院C/C++程序设计课程组C/C++程序设计第2章主要内容本章主要介绍:基本数据类型和存储类型的说明方法,以及基本运算符的运算规则和表达式的构成方法,为后续章节的学习奠定一个基础。
C/C++程序设计2.1 C 语言的数据类型使用高级语言编写程序,主要工作有两项:一是描述数据,二是描述数据加工的方法。
数据类型图 2.1C 语言的数据类型基本类型整型实型字符型带符号长整型(简称长整型)带符号整型无符号整型无符号整型无符号短整型无符号长整型单精度型双精度型空类型构造类型指针类型枚举类型数组类型结构体类型共用体类型C/C++程序设计2.2 常量常量是程序运行过程中其值不发生变化的数据。
2.2.1 整型常量表2.1 整型数据的表示方式2.2.2 实型常量3.14、.9999、-3.14159、834.、–0.666 、6.89E-52.2.3 字符常量’x’,’a’,’A’,’b’,’$’,’#’ ,printf("\tab\rcd\n\’ef\\g");2.2.4 符号常量#define 符号常量字符串#define PI 3.14159C/C++程序设计【例2.1】求一个圆柱体体积,用符号常量代替π。
#include <stdio.h>#define PI 3.14159 /*定义PI为符号常量*/void main(){float r,h,v;scanf("%f,%f",&r,&h);v=PI*r*r*h; /* PI相当于3.14159,参与运算*/printf("Volume=%f",v);}运行时输入:3,2↙运行结果为: Volume=56.548618C/C++程序设计2.2.5 字符串常量"\tab\rcd\n\’ef\\g“"I am a student" 、"x"、""注意:’\0’和’0’不同,’\0’是编码为0的字符,而’0’则是数字0,其编码为48。
C语言第二讲C语言的基础知识版本:v2011.0.1 教学内容:1、Makefile的原理与使用2、printf格式化输出和sizeof()。
3、常量的使用目的4、指针变量指向一个地址,为什么要定义指针变量的数据类型呢?5、指针+1的计算方法6、结构体的含义和使用技巧教学重点:1、创建Makefile文件,快捷编译C语言程序2、printf与sizeof3、数组与结构4、for,while,do..while课后作业:1、用整型和字符型数据两种方法输出00 01 (09)10 11 (19)……90 91 (99)2、用数组和结构体数据类型初始化五个人的学号,姓名,单科成绩[3],,然后求出总分,名次,最后按总分由高到底(总分最高名次为1)输出如NO. Name cj1 cj2 cj3 sum mingci教学过程:教学目标一:在ubuntu中怎么开始编写和编译C语言1、使用gedit编写C语言程序分析一个简单的C语言程序:test1.c。
#include <stdio.h>main(){printf("Hello C!");}建议:统一在主文件夹中进行文件创建。
2、程序的编译执行编译的方法:1、gcc test1.c -c test1.o//用gcc编译test1.c生成一个名为test1.o的链接文件。
2、gcc test1.o -o test1 //用gcc编译test1.o生成一个名为test1的可执行文件。
这里只有一个test1.c的文件,如果是一个工程呢?会包含多个.c的文件,如果用gcc我们需要每次编译时都要把修改的程序手动编译,如果用make,则可以加快编译速度,缩短时间。
就像是windows中的批处理文件。
gcc -v查看gcc的版本号:这个对于以后编译后的程序有关系2、Makefile的用途:Makefile带来的好处就是——―自动化编译‖或者说―批处理编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释Makefile中指令的命令工具,Makefile是make的默认名,也可以使用其他名称,例如mak,使用的时候使用make -f mak。
先来看一个简单实例:在刚才的那个文件中新建一个文件,名为Makefile(注意没有扩展名),打开后输入如下:test1: test1.c //反映依赖关系,不一定所有的操作都有依赖关系gcc test1.c –o test1 编译方式第行,test1代表的编译完成后的程序名,―:‖后的表示该程序依赖的源程序是test1.c;第行指利用gcc进行编译。
test1: test1.cgcc test1.c -o test1test2: test2.cgcc test2.c -o test2clean: //不需要依赖其他rm -f test1如果要执行clean,可输入make clean自动识别程序是否进行了修改,依据的时间关系。
后面的课程中还会讲到更多与Makefile相关的知识,以后进一步加深。
p rintf:格式化打印1、%d,%c,%f,%p,%x,%o,%s,%03d,%6.3d,%-5d#include<stdio.h>void main(){int a,b,*p;char m,n[9]={'c','o','m','p','u','t','e','r'};float f;a=10,b=10,p=&a;m='c';f=10.0219;printf("a=%d\n b=%x\n p=%p\n",a,b,p);Printf("%d\n",*p);printf("m=%c\n m=%d\n n=%s\n",m,m,n);printf("a=%03d\n",a); //表示不足3位时在前面补0printf("a=%-6d\n",a); // "-"表示左对齐printf("f=%f\n",f);printf("f=%6.3f\n",f); //6.3指包含小数点共6位,其中小数部分3位,如果大于3位,会自动四舍五入。
}输出多个数的对应关系换行问题八进制十进制十六进制举例:#include <stdio.h>int main(){int i;printf("i=%d\n",015);printf("i=%x\n",015);printf("i=%o\n",015);printf("-----------\n");printf("i=%d\n",15);printf("i=%x\n",15);printf("i=%o\n",15);printf("-----------\n");printf("i=%d\n",0x15);printf("i=%x\n",0x15);printf("i=%o\n",0x15);}常量#define pi 3.14#define x 2+3 //会计算x=5吗?常量是指在程序中它的值不允许被修改。
define定义的常量开始时没有占用内存空间,当在程序编译时时,就会把定义的值代替常量的名称。
常量的好处有两点:1、提高了程序的可读性2、便于修改,如果有很多处相同需要修改,最好先定义为常量。
3、但是注意define定义的常量没有数据类型,因此在使用时要注意,比如:printf(“%d\n”,x*x),这个结果应该是多少呢?可能大家会觉得x为2+3,就是5,5*5应该是25,实际上是这样吗?我们测试一下。
结果不是25,而是11,出现这种情况的原因是因为在替换时,是把2+3替换为x,变成了2+3*2+3=11。
可以重新定义一下改成#define x (2+3),这样就对了。
操作符sizeof(数据类型)非指针变量类型及取值范围,引入操作符sizeof,返回数据类型占用内存空间的大小,对以后学习嵌入式编程的底层结构有帮助1、int:整型,sizeof(int)=42、unsigned int:无符号整型,size of(unsigned int)=43、short int:短整型,sizeof(short int)=24、unsigned short int:无符号短整型,sizeof(unsigned short int)=25、long int:长整形,sizeof(long int)=46、unsigned long int:无符号长整形,sizeof(unsigned long int)=47、float:浮点型,sizefo(float)=48、double:双精度浮点型,sizeof(double)=89、char:字符型,sizeof(char)=1构造类型数组:数组在内存中开辟了一个存储同一数据类型的连续的存储空间定义数组:char arr[5]注意:1、数据名arr表示数组开始的地址。
2、读取数据中的数据方法是:arr[下标]。
3、下标是从0开始,所以数组中的第一个是arr[0]。
数组赋值1、char arr[5]; //先定义后赋值可以吗?arr[5]={'h','e','l','l','o'};2、arr[0]='h';……arr[4]='o';3、char arr[6]="hello"; //最后有一个"\0"表示字符串结束位分析:求arr[5]的sizeof和输出arr[5]int main(){char arr[5];for(i=0;i<5;i++){printf("%c",arr[i]);}printf("%s\n",arr);printf("%d\n",sizeof(arr));printf("%d\n",sizeof(arr[0]));}指针类型指针类型如int *p1,p1为一个指向整型的指针变量,p1中存放的是一个地址,int则表示该指针指向的是一个整数型的数据。
如指针存放的是一个地址,为什么要定义指针的数据类型呢?假如下面是数组在内存中的存放Arr1[1] Arr2[7] Arr2[6] Arr2[5]p1+1 Arr2[4]Arr1[0]Arr2[3]Arr2[2] p2+1 Arr2[1]p1 p2 Arr2[0]请问*p1和*p2的结果分别是什么?*p1=1,*p2=1,这两个1相同吗?显然不同,一个是整数型,占4个字节,一个是字符型,占一个字节。
请问*p1+1和*p2+1呢?根据什么可以找到p1+1和p2+1呢?根据的就是指针变量所指向的数据类型。
如果不定义指针的数据类型,那么我们在取值时就不知道指针的下一个地址指向的数据怎么取值了。
分析程序:#include <stdio.h>int main(){int arr1[8]={1,2,3};int *p1=arr1;char arr2[8]={'1','2','3','4','5','6'};char *p2=arr2;printf("arr1=%p p1=%p p1+1=%p\n",arr1,p1,p1+1);printf("arr2=%p p2=%p p2+1=%p\n",arr2,p2,p2+1);printf("*p1=%d\n",*p1);printf("*p2=%c\n",*p2);printf("*(p1+1)=%d\n",*p1+1);printf("*(p2+1)=%c\n",*p2+1);}结构体有时我们需要将不同类型的数据组合成一个有机的整体,以便于引用,这些组合在一个整体中的数据是互相联系的,例如描述一个人有姓名,性别,年龄等。