版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、程序设计实习课程 (C+ Programming Practice)软件综合实践一第一讲课程简介与简单程序设计 北京大学程序设计实习课程2为什么要加强程序设计能力?o Programming之于计算机专业学生Gun之于士兵北京大学程序设计实习课程3内容提要o课程相关信息oC语言知识巩固和补充o代码风格o摸底测验北京大学程序设计实习课程4课程相关信息o 课程内容o 考核方式北京大学程序设计实习课程5课程内容1. 掌握VC+编程环境n 能够使用该环境进行基于控制台输入输出及文件输入输出的C及C+程序的源代码编辑、编译连接、调试和运行2. 巩固和增强程序设计和代码实现能力n 高精度计算,数制转换,字
2、符串的处理,链表的概念、实现和应用,枚举和递归的求解方法。北京大学程序设计实习课程6成绩评定o 平时成绩 :30%n 考勤n 作业(代码、实验报告)o 期末考试 :70%北京大学程序设计实习课程7内容提要o课程相关信息oC语言知识巩固和补充o代码风格o摸底测验北京大学程序设计实习课程8C语言知识巩固和补充o 位运算o 函数指针o 指针和动态内存分配o 命令行参数o C语言标准库函数北京大学程序设计实习课程9位运算o 有时我们需要对某个整数类型变量中的某一位(bit)进行操作,比如,判断某一位是否为1,或只改变其中某一位,而保持其他位都不变。C/C+语言提供了“位运算”的操作,能够做到类似的操作
3、。 C/C+语言提供了六种位运算符来进行位运算操作: & 按位与 | 按位或 按位异或 取反 右移北京大学程序设计实习课程10按位与o 按位与运算符“&”是双目运算符n 功能:将参与运算的两操作数各对应的二进制位进行与操作,只有对应的两个二进位均为1时,结果的对应二进制位才为1,否则为0。北京大学程序设计实习课程11按位与o 例如:表达式“21 & 18 ”的计算结果是16(即二进制数10000),因为:o 21 用二进制表示就是: 0000 0000 0000 0000 0000 0000 0001 0101 o 18 用二进制表示就是: 0000 0000 0000
4、 0000 0000 0000 0001 0010o 二者按位与所得结果是:0000 0000 0000 0000 0000 0000 0001 0000北京大学程序设计实习课程12按位与o 按位与运算通常用来将某变量中的某些位清0或保留某些位不变。o 例如,如果需要将int型变量n的低8位全置成0,而其余位不变,则可以执行:n = n & 0 xffffff00; 也可以写成:n &= 0 xffffff00;如果n是short类型的,则只需执行:n &= 0 xff00;o 如何判断一个int型变量n的第7位(从右往左,从0开始数)是否是1 ?n 只需看表达式 “n
5、 & 0 x80”的值是否等于0 x80即可。北京大学程序设计实习课程13按位或o 按位或运算符“|”是双目运算符。n 功能:将参与运算的两操作数各对应的二进制位进行或操作,只有对应的两个二进位都为0时,结果的对应二进制位才是0,否则为1。o 例如:表达式“21 | 18 ”的值是23(即二进制数10111)。o 按位或运算通常用来将某变量中的某些位置1或保留某些位不变。o 例如,如果需要将int型变量n的低8位全置成1,而其余位不变,则可以执行:n n |= 0 xff;北京大学程序设计实习课程14按位异或o 按位异或运算符“”是双目运算符。n 功能:将参与运算的两操作数各对应的二进
6、制位进行异或操作,即只有对应的两个二进位不相同时,结果的对应二进制位才是1,否则为0。o 例如:表达式“21 18 ”的值是7(即二进制数111)。o 异或运算的特点n 如果 ab=c,那么就有 cb = a以及ca=b。n 此规律可以用来进行最简单的加密和解密。北京大学程序设计实习课程15按位非o 按位非运算符“”是单目运算符。n 其功能是将操作数中的二进制位0变成1,1变成0。o 例如,表达式“21”的值是无符号整型数 0 xffffffea,而下面的语句: printf(%d,%u,%x,21,21,21);o 输出结果就是:-22,4294967274,ffffffea北京大学程序设计
7、实习课程16左移运算符o 左移运算符“”是双目运算符。n 其功能是将左操作数的各二进位全部左移若干位后得到的值,右操作数指明了要左移的位数。n 左移时,高位丢弃,右边低位补0。o 左移运算符不会改变左操作数的值。北京大学程序设计实习课程17左移运算符o 例如,常数9有32位,其二进制表示是:0000 0000 0000 0000 0000 0000 0000 1001o 因此,表达式“94”的值,就是将上面的二进制数左移4位,得:0000 0000 0000 0000 0000 0000 1001 0000即为十进制的144。o 实际上,左移1位,就等于是乘以2,左移n位,就等于是乘以2n。而
8、左移操作比乘法操作快得多。o 特别注意:有符号数的左移溢出情况。#include main() int n1 = 15; short n2 = 15;unsigned short n3 = 15;unsigned char c = 15;n1 = 15; n2 = 15;n3 = 15;c = 6; printf( n1=%x,n2=%d,n3=%d,c=%x,c4=%d,n1,n2,n3,c,c 4);上面程序的输出结果是:n1=78000,n2=-32768,n3=32768,c=c0,c”是双目运算符。n 其计算结果是把“ ”的左操作数的各二进位全部右移若干位后得到的值,要移动的位数就是
9、“”的右操作数。移出最右边的位就被丢弃。o 对于有符号数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将一起移动,并且大多数C/C+编译器规定,如果原符号位为1,则右移时左边高位就补充1,原符号位为0,则右移时高位就补充0。北京大学程序设计实习课程20右移运算符o 对于无符号数,如unsigned long,unsigned int, unsigned short, unsigned char类型的变量,则右移时,高位总是补0。o 右移运算符不会改变左操作数的值。o 实际上,右移n位,就相当于左操作数除以2n,并且将结果往小里取整。#include main(
10、)int n1 = 15; short n2 = -15;unsigned short n3 = 0 xffe0;unsigned char c = 15;n1 = n12; n2 = 3;n3 = 4;c = 3; printf( n1=%x,n2=%d,n3=%x,c=%x,n1,n2,n3,c);上面的程序输出结果是:n1=3,n2=-2,n3=ffe,c=1北京大学程序设计实习课程22思考题思考题o 有两个int型的变量a和n(0 = n = 31),o 要求写一个表达式,使该表达式的值和a的第n位相同。答案:答案: (a & (1 n 北京大学程序设计实习课程23函数指针o
11、程序运行期间,每个函数都会占用一段连续的内存空间。o 函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。o 将函数的入口地址赋给一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。北京大学程序设计实习课程24函数指针o 函数指针定义的一般形式为:类型名 (* 指针变量名)(参数类型1, 参数类型2,);n “类型名”表示被指函数的返回值的类型。n “(参数类型1, 参数类型2,)”中则依次列出了被指函数的所有参数的类型。例如:int (*pf)(int ,char);表示pf是一个函数指针,它所指向的函数,返回值类型应是i
12、nt,该函数应有两个参数,第一个是int 类型,第二个是char类型。北京大学程序设计实习课程25函数指针o 可以用一个原型匹配的函数的名字给一个函数指针赋值。o 要通过函数指针调用它所指向的函数,写法为: 函数指针名(实参表);o 下面的程序说明了函数指针的用法#include void PrintMin(int a, int b)if( ab )printf(%d,a);elseprintf(%d,b);int main() void (* pf)(int ,int); int x = 4, y = 5; pf = PrintMin; pf(x,y); return 0;上面的程序输出结果
13、是:4北京大学程序设计实习课程27函数指针应用:快速排序库函数qsorto void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *);n base是待排序数组的起始地址,n nelem是待排序数组的元素个数,n width是待排序数组的每个元素的大小(以字节为单位)n pfCompare是一个函数指针,它指向一个“比较函数”。北京大学程序设计实习课程28快速排序库函数qsorto 排序就是一个不断比较并交换位置的过程。o qsort如何在连元素的类型
14、是什么都不知道的情况下,比较两个元素并判断哪个应该在前呢?o 答案是,qsort函数在执行期间,会通过pfCompare指针调用一个 “比较函数”,用以判断两个元素哪个更应该排在前面。n 这个“比较函数”不是C/C+的库函数,而是由使用qsort的程序员编写的。n 在调用qsort时,将“比较函数”的名字作为实参传递给pfCompare。程序员当然清楚该按什么规则决定哪个元素应该在前,哪个元素应该在后,这个规则就体现在“比较函数”中。北京大学程序设计实习课程29快速排序库函数qsorto qsort函数的用法规定,“比较函数”的原型应是:int 函数名(const void * elem1,
15、const void * elem2);o 该函数的两个参数,elem1和elem2,指向待比较的两个元素。也就是说, * elem1和 * elem2就是待比较的两个元素。该函数必须具有以下行为:1) 如果 * elem1应该排在 * elem2前面,则函数返回值是负整数(任何负整数都行)。2) 如果 * elem1和* elem2哪个排在前面都行,那么函数返回03) 如果 * elem1应该排在 * elem2后面,则函数返回值是正整数(任何正整数都行)北京大学程序设计实习课程30#include #include int MyCompare(const void * elem1, con
16、st void * elem2 )unsigned int * p1, * p2;p1 = (unsigned int *) elem1; p2 = (unsigned int *) elem2; return (* p1 % 10) - (* p2 % 10 ); 快速排序库函数qsort的实现o 下面的程序,功能是调用qsort库函数,将一个unsigned int数组按照个位数从小到大进行排序。比如 8,23,15三个数,按个位数从小到大排序,就应该是 23,15,8#define NUM 5int main()unsigned int anNUM = 8,123,11,10,4 ;qs
17、ort(an, NUM, sizeof(unsigned int), MyCompare); for(int i = 0;i NUM; i + )printf(%d , ani); return 0;上面程序的输出结果是:10 11 123 4 8 北京大学程序设计实习课程32思考题思考题o 如果要将an数组从大到小排序,那么MyCompare函数该如何编写?北京大学程序设计实习课程33动态内存分配o 在C+中,通过“new”运算符来实现动态内存分配。new 运算符的第一种用法如下: P = new T; nT是任意类型名,nP是类型为T * 的指针。n这样的语句,会动态分配出一片大小为 si
18、zeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P。o 示例int * pn;pn = new int; /(1)* pn = 5;n语句(1)即动态分配了一片4个字节大小的内存空间,而pn 会指向这片空间,通过pn,可以读写该内存空间。北京大学程序设计实习课程34动态内存分配o new 运算符还有第二种用法,可以用来动态分配一个任意大小的数组:P = new TN;nT是任意类型名nP是类型为T * 的指针nN代表“元素个数”,它可以是任何值为正整数的表达式,表达式里可以包含变量、函数调用。n这样的语句动态分配出 N sizeof(T)个字节的内存空间,这片空间的起始地址被赋值
19、给P。o 示例int * pn;int i = 5;pn = new inti * 20;pn0 = 20;pn100 = 30; /编译没问题。运行时导致数组越界。 北京大学程序设计实习课程35动态内存分配o 如果要求分配的空间太大,操作系统找不到足够的内存来满足,那么动态内存分配就会失败。o 保险做法是在进行较大的动态内存分配时,要判断一下分配是否成功。o 判断的方法是:如果new表达式返回值是NULL,则分配失败,否则分配成功。例如:int * pn = new int200000;if( pn = NULL )printf( “内存分配失败”);elseprintf( “内存分配成功”
20、);北京大学程序设计实习课程36动态内存分配o 程序从操作系统动态分配所得的内存空间,使用完后应该释放,交还操作系统,以便操作系统将这片内存空间分配给其他程序使用。o C+提供 “delete” 运算符,用以释放动态分配的内存空间。o delete运算符的基本用法是:delete 指针;n该指针必须是指向动态分配的内存空间的,否则运行时很可能会出错。例如:int * p = new int;* p = 5;delete p;delete p;/本句会导致程序异常北京大学程序设计实习课程37动态内存分配o 如果是用new动态分配了一个数组,那么,释放该数组的时候,应以如下形式使用 delete
21、运算符:delete 指针;o 示例int * p = new int20;p0 = 1;delete p;北京大学程序设计实习课程38动态内存分配o 特别注意n New和Delete配对使用:用 new 运算符动态分配的内存空间,一定要用delete 运算符予以释放。n 否则即便程序运行结束,这部分内存空间仍然不会被操作系统收回,从而成为被白白浪费掉的内存垃圾。这种现象也称为“内存泄漏”。北京大学程序设计实习课程39命令行参数o 将用户在DOS窗口输入可执行文件名的方式启动程序时,跟在可执行文件名后面的那些字符串,称为“命令行参数”。命令行参数可以有多个,以空格分隔。o 例如,在DOS窗口输
22、入:copy file1.txt file2.txtn “copy”, “file1.txt”, “file2.txt” 就是命令行参数o 如何在程序中获得命令行参数呢?北京大学程序设计实习课程40命令行参数o int main(int argc, char * argv)o 参数argc就代表启动程序时,命令行参数的个数。C/C+语言规定,可执行程序程序本身的文件名,也算一个命令行参数,因此,argc的值至少是1。o 参数argv是一个数组,其中的每个元素都是一个char* 类型的指针,该指针指向一个字符串,这个字符串里就存放着命令行参数。nargv0指向的字符串就是第一个命令行参数,即可执
23、行程序的文件名nargv1指向第二个命令行参数nargv2指向第三个命令行参数。n例子程序:#include int main(int argc, char * argv)for(int i = 0;i =0?(x):-(x)北京大学程序设计实习课程54推荐一种C程序标识符命名法o 4)函数名字中每个单词的头一个字母大写,其他字母小写。一般采用 动词+名词形式void PrintMessage();int WriteIdToFile( FILE * _fp, int _nId);o 5)结构定义加大写字母S作为前缀struct SPerson int nId;int nAge;北京大学程序设计
24、实习课程55推荐一种C程序标识符命名法o 6) 类定义加大写字母C作为前缀class CPerson int m_nId;o 7) 类型定义全部大写typedef struct SPerson PERSON;typedef struct SPerson * PPERSON; /指针加P北京大学程序设计实习课程56标识符命名应注意的一些细节o 标识符号应能提供足够信息,最好是可以发音的。o 为全局变量取长的,描述信息多的名字,为局部变量取短名字o 名字太长时可以适当采用单词的缩写。但要注意,缩写方式要一致。要缩写就全都缩写。n比如 单词Number, 如果在某个变量里缩写成了:int nDoor
25、Num;那么最好包含 Number单词的变量都缩写成 Num。o 4)注意使用单词的复数形式。n如int nTotalStudents, nStudent; nTotalStudents容易让人理解成代表学生数目,而 nStudent 含义就不十分明显北京大学程序设计实习课程57标识符命名应注意的一些细节o 5) 对于返回值为真或假的函数,加“Is”前缀如:int IsCanceled();intisalpha(); / C语言标准库函数BOOL IsButtonPushed();o 6) 对于获取某个数值的函数,加 “Get”前缀char * GetFileName();o 7) 对于设置某
26、个数值的函数,加“Set”前缀void SetMaxVolume();o 8) 一般变量和结构名用名词,函数名用动词或动宾词组。北京大学程序设计实习课程58程序书写格式注意事项o 1)正确使用缩进n 首先,一定要有缩进,否则代码的层次不明显。n 缩进应为4个空格较好。需要缩进时一律按Tab键,或一律按空格键,不要有时用Tab键缩进,有时用空格键缩进。n 一般开发环境都能设置一个Tab键相当于多少个空格,此时就都用Tab键北京大学程序设计实习课程59程序书写格式注意事项o 2) 行宽与折行。n 一行不要太长,不能超过显示区域。以免阅读不便。太长则应折行。折行最好发生在运算符前面,不要发生在运算符
27、后面n 示例if( Condition1() & Condition2() & Condition3() ) 北京大学程序设计实习课程60程序书写格式注意事项o 3) 注意 , 位置不可随意,要统一n 如果写了:if ( condition1() ) DoSomething();n 别处就不要写if( condition2() DoSomething() ;北京大学程序设计实习课程61程序书写格式注意事项o 4) 变量和运算符之间最好加1个空格int nAge = 5;nAge = 4;if( nAge = 4 ) printf( “%d”,nAge);for( i = 0;
28、i 100; i + );北京大学程序设计实习课程62一些好的编程习惯o 1)尽量不要用立即数,而用#define (C+中用const)定义成常量,以便以后修改n #define MAX_STUDENTS 20n struct SStudent aStudents MAX_STUDENTS;n struct SStudent aStudents 20; /不好的范例n #define TOTAL_ELEMENTS 100for( i = 0; i TOTAL_ELEMENTS; i +) 北京大学程序设计实习课程63一些好的编程习惯o 2)使用sizeof()宏,不直接使用变量所占字节数的数
29、值n 好的范例int nAge;for( j = 0; j 100; j+ )fwrite( fpFile,& nAge, 1, sizeof(int);n 不好的范例for( j = 0; j 100; j+ )fwrite( fpFile,& nAge, 1, 4);北京大学程序设计实习课程64一些好的编程习惯o 3)稍复杂的表达式中要积极使用括号,以免优先级理解上的混乱n n = k + j; /不好n n = ( k + ) + j; /好一点o 4)不很容易理解的表达式应分几行写:n n = ( k + ) + j;应该写成:n n = k + j;k +;北京大学程
30、序设计实习课程65一些好的编程习惯o 5)不提倡在表达式中使用 ? : 形式,而用if . else语句替代n 不好的范例xp = 2 * k ( n-m) ? ck+1 : dk-;n 好的范例if( 2*k (n-m)xp = ck+1;elsexp = dk-;北京大学程序设计实习课程66一些好的编程习惯o 6)嵌套的if else 语句要多使用 n 不好的范例if( Condition1() ) if( condition2()DoSomething();elseNoCondition2();n 好的范例if( Condition1() ) if( condition2()DoSome
31、thing();elseNoCondition2(); 北京大学程序设计实习课程67一些好的编程习惯o 7)应避免 if else 的多重嵌套,而用并列的完成。if( Condition1() ) if ( Condition2() ) if( Condition3() ) Condition123();else NoCondition3();else NoCondition2();else NoCondiction1();if( ! condition1 ) NoCondition1();else if( ! condition2 ) NoCondition2();else if( ! co
32、ndition3) NoCondition3();else Condition123();北京大学程序设计实习课程68一些好的编程习惯o 8) 遵循一些惯例的写法,如:n 循环的固定写法: for( i = 0;i n ;i + ) arrayi = 0;而非 i = 0 ; while( i Next)o 一个字节一个字节读文件写法:n int c; while( ( c= fgetc(fp) != EOF ) 北京大学程序设计实习课程70一些好的编程习惯o 9)写出来的代码应该容易读出声n 示例1: if( !( n m ) & !( s t) /坏的例子if( ( m = n )
33、 & ( t =0)|(bIsReaded=TRUE)北京大学程序设计实习课程74一些好的编程习惯o12)可移植性 n1、高质量的代码要求能够跨平台,所以我们的代码应该考虑到对不同的平台的支持,特别是对windowsXP和windows NT的支持n 2、由于C语言的移植性比较好,故对算法函数尽可能用C代码而非C+代码。n 3、对不同的硬件与软件的函数要做不同的处理。o13)错误处理 n1、错误报告处理。编程中要求考虑函数的各种执行情况,尽可能处理所有的流程情况。将函数分为两类: 一类为与屏幕的显示无关(不与用户交换信息的函数):函数通过返回值来报告错误。 一类为与屏幕的显示相关(与用
34、户交换信息的函数):函数要负责向用户发出警告,并进行错误处理。 n2、 尽早发现程序中的错误:、 重视编译器中的警告信息。许多警告信息指示了程序中潜在的错误危险。所以要认真检查每一个警告信息,查看是否有某种隐患。尽量消除警告信息。、 利用断言来检查错误对于程序中的某种假设,或防止某些参数的非法值,利用断言来帮助查错是一种好的办法。 北京大学程序设计实习课程75一些好的编程习惯o 14)模块化规范 n为了提高软件的重用性,减少重复开发的工作量。同时也为了提高程序的可读性,方便程序的维护,必须加强软件的模块化工作。n模块化应该遵循以下几个基本规范:n1、 个函数应该作到精而小,函数的代码应该控制在一个适度的规模,每个函数的代
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年体能测试仪业行业分析报告及未来发展趋势报告
- 2026年胆维丁片行业分析报告及未来发展趋势报告
- 2026安徽皖信招聘铁塔阜阳市分公司技术人员笔试模拟试题及答案解析
- 2026湖南邵阳工业职业技术学院公开招聘工作人员18人考试模拟试题及答案解析
- 2026年其他寄递服务行业分析报告及未来发展趋势报告
- 2026年山东司法警官职业学院公开招聘人员(42名)笔试模拟试题及答案解析
- 2026年白城市神经精神病医院医护人员招聘笔试模拟试题及答案解析
- 2026广东中山大学附属口腔医院第二批招聘事业单位人员2人笔试模拟试题及答案解析
- 2026年西红柿行业分析报告及未来发展趋势报告
- 2026年安庆市政府采购中心(公共资源交易中心)人员招聘考试备考试题及答案详解
- 视野报告简单分析-课件
- 项目推进缓慢表态发言稿三篇
- 自然辩证法智慧树知到期末考试答案章节答案2024年浙江大学
- 2024年西藏开发投资集团有限公司招聘笔试参考题库含答案解析
- 第二章-生命的物质基础
- 我院药学专业药理课程期末试卷成绩分析与评价
- 四川省河长制湖长制基础数据表结构与标识符(试行稿)
- 维克多高中英语3500词汇
- 顶板危险源辨识及防范措施
- 2023年广东省佛山市南海区桂城街道东二社区工作人员考试模拟题及答案
- GB/T 18615-2002波纹金属软管用非合金钢和不锈钢接头
评论
0/150
提交评论