程序设计实习讲义.ppt

上传人:xin****828 文档编号:7263842 上传时间:2020-03-17 格式:PPT 页数:89 大小:488KB
返回 下载 相关 举报
程序设计实习讲义.ppt_第1页
第1页 / 共89页
程序设计实习讲义.ppt_第2页
第2页 / 共89页
程序设计实习讲义.ppt_第3页
第3页 / 共89页
点击查看更多>>
资源描述
程序设计实习 李文新 内容提要 课程简介输入输出位运算函数指针命令行参数库函数程序风格 课程简介 课程定位课程内容授课方式成绩评定教材进度安排课程网页 信息学院课程体系图 课程内容 1 掌握vc 编程环境能够使用该环境进行基于控制台输入输出及文件输入输出的C及C 程序的源代码编辑 编译连接 调试和运行2 巩固和增强程序设计和代码实现能力高精度计算 日期的处理 字符串的处理 链表的概念 实现和应用 枚举和递归的求解方法 3 学习用C 语言编程基本概念 类 对象 数据抽象 重载 继承 虚函数 多态等 及其语法实现 C 程序基本构成 输入输出流及文件处理 模板 字符串处理 文件处理及标准模板库等 授课方式 课上讲授 练习及测验复习 自学和书面作业上机实习并完成上机作业期中及期末考试 成绩评定 期中考试15 上机考试期末考试50 有B卷 考试内容为作业平时成绩 作业和课堂表现35 平时作业成绩与B卷成绩加权作业包括课堂上留的 每周两个小时的到机房上机 期中考试前 以及期中考试后的Blocks程序对战 不必到机房 按比赛成绩给分 教材 程序设计导引及在线实践 C 大学教程 第二版 HarveyM DeitelPaulJamesDeitel邱仲潘等译冯平审校电子工业出版社2004 进度安排 暂定 第一讲 C 基础知识巩固第二讲 简单计算题和数制转换以及日期处理第三讲 字符串处理第四讲 高精度计算第五讲 枚举第六讲 递归第七讲 搜索第八讲 动态规划第九讲 链表和二叉树第十讲 习题课 进度安排 暂定 第十一讲 类和对象 一 第十二讲 类和对象 二 第十三讲 运算符重载第十四讲 继承第十五讲 多态第十六讲 输入 输出流 文件操作第十七讲 类模板 函数模板 string类第十八讲 标准模板库 一 第十九讲 标准模板库 二 第二十讲 标准模板库 三 第二十一讲 标准模板库 四 第二十二讲 习题课第二十三讲 总结和答疑 课程网页 内容提要 课程简介输入输出位运算函数指针命令行参数库函数程序风格 C语言的输入输出语句 include scanf 将输入读入变量 printf 将变量内容输出 scanf 语句 函数 intscanf constchar 参数可变的函数第一个参数是格式字符串 后面的参数是变量的地址 函数作用是按照第一个参数指定的格式 将数据读入后面的变量参数可变的函数的参考阅读 不要求掌握 scanf返回值 0成功读入的数据项个数 0没有项被赋值 EOF第一个尝试输入的字符是EOF 结束 对POJ上某些题 返回值为EOF可以用来判断输入数据已经全部读完 printf 语句 函数 intprintf constchar 参数可变的函数第一个参数是格式字符串 后面的参数是待输出的变量 函数作用是按照第一个参数指定的格式 将后面的变量在屏幕上输出 返回值 成功打印的字符数 返回负值为出错 d读入或输出int变量 c读入或输出char变量 f读入或输出float变量 s读入或输出char 变量 lf读入或输出double变量 e以科学计数法格式输出数值 x以十六进制读入或输出int变量 I64d读入或输出 int64变量 64位整数 p输出指针地址值 5lf输出浮点数 精确到小数点后5位 格式字符串里的格式控制符号 includeintmain inta charb charc 20 doubled 0 floate 0 intn scanf d c s lf f intn scanf d c s lf f input 123ateststring8 99 2output 123ateststring8 9000009 200000e 0009 2000005input 123ateststring8 99 2output 123ateststring8 9000009 200000e 0009 2000005input 123ateststring8 99 2output 123a0 0000000 000000e 0000 0000003 includeintmain inta b charc chars 20 int64n 9876543210001111 scanf d c s x I64d input 28K testffee1234567890123456output 28ffffffe44294967268test0012FF60ffee655181234567890123456 main char s scanf s s 错在何处 常见错误 错在s不知道指向何处 往其指向的地方写入数据 不安全 char gets char s 从标准输入读取一行到字符串s如果成功 返回值就是s地址如果失败 返回值是NULL可以根据返回值是NULL判定输入数据已经读完调用时要确保s指向的缓冲区足够大 否则可能发生内存访问错误 读取一行 includeintmain chars 200 char p gets s printf s s s p return0 input WelcometoBeijing output WelcometoBeijing WelcometoBeijing 读取一行 intsscanf constchar buffer constchar format address 和scanf的区别在于 它是从buffer里读取数据intsprintf char buffer constchar format argument 和printf的区别在于 它是往buffer里输出数据 sscanf函数和sprintf函数 includeintmain inta b charc chars 20 charszSrc 28K testffee1234567890123456 charszDest 200 int64n 9876543210001111 sscanf szSrc d c s x I64d output 28ffffffe44294967268test0012FF60ffee655181234567890123456 五个函数 一个概念 scanfprintfsscanfsprintfgets补码 内容提要 课程简介输入输出位运算函数指针命令行参数库函数程序风格 位运算 有时我们需要对某个整数类型变量中的某一位 bit 进行操作 比如 判断某一位是否为1 或只改变其中某一位 而保持其他位都不变 C C 语言提供了 位运算 的操作 能够做到类似的操作 C C 语言提供了六种位运算符来进行位运算操作 按位与 按位或 按位异或 取反 右移 按位与 按位与运算符 是双目运算符 其功能是将参与运算的两操作数各对应的二进制位进行与操作 只有对应的两个二进位均为1时 结果的对应二进制位才为1 否则为0 例如 表达式 21 18 的计算结果是16 即二进制数10000 因为 21用二进制表示就是 0000000000000000000000000001010118用二进制表示就是 00000000000000000000000000010010二者按位与所得结果是 00000000000000000000000000010000 按位与 按位与运算通常用来将某变量中的某些位清0或保留某些位不变 例如 如果需要将int型变量n的低8位全置成0 而其余位不变 则可以执行 n n如何判断一个int型变量n的第7位 从右往左 从0开始数 是否是1 只需看表达式 n 0 x80 的值是否等于0 x80即可 按位与 按位或运算符 是双目运算符 其功能是将参与运算的两操作数各对应的二进制位进行或操作 只有对应的两个二进位都为0时 结果的对应二进制位才是0 否则为1 例如 表达式 21 18 的值是2321 0000000000000000000000000001010118 0000000000000000000000000001001021 18 00000000000000000000000000010111按位或运算通常用来将某变量中的某些位置1或保留某些位不变 例如 如果需要将int型变量n的低8位全置成1 而其余位不变 则可以执行 按位或 n 0 xff 按位异或运算符 是双目运算符 其功能是将参与运算的两操作数各对应的二进制位进行异或操作 即只有对应的两个二进位不相同时 结果的对应二进制位才是1 否则为0 例如 表达式 21 18 的值是7 即二进制数111 21 0000000000000000000000000001010118 0000000000000000000000000001001021 18 00000000000000000000000000000111异或运算的特点是 如果a b c 那么就有c b a以及c a b 此规律可以用来进行最简单的加密和解密 按位异或 按位非运算符 是单目运算符 其功能是将操作数中的二进制位0变成1 1变成0 例如 表达式 21 的值是无符号整型数0 xffffffea21 00000000000000000000000000010101 21 11111111111111111111111111101010而下面的语句 printf d u x 21 21 21 输出结果就是 22 4294967274 ffffffea 按位非 左移运算符 是双目运算符 其计算结果是将左操作数的各二进位全部左移若干位后得到的值 右操作数指明了要左移的位数 左移时 高位丢弃 右边低位补0 左移运算符不会改变左操作数的值 左移运算符 例如 常数9有32位 其二进制表示是 00000000000000000000000000001001因此 表达式 9 4 的值 就是将上面的二进制数左移4位 得 00000000000000000000000010010000即为十进制的144 实际上 左移1位 就等于是乘以2 左移n位 就等于是乘以2n 而左移操作比乘法操作快得多 左移运算符 includemain intn1 15 shortn2 15 unsignedshortn3 15 unsignedcharc 15 n1 15 n2 15 n3 15 c 6 printf n1 x n2 d n3 d c x c 4 d n1 n2 n3 c c 4 上面程序的输出结果是 n1 78000 n2 32768 n3 32768 c c0 c 4 3072 n1 00000000000000000000000000001111n2 0000000000001111n3 0000000000001111c 00001111n1 15 变成78000 00000000000001111000000000000000n2 15 变成 32768 1000000000000000n3 15 变成32768 1000000000000000c 6 变成c0 11000000c 4这个表达式是先将c转换成整型00000000000000000000000011000000然后再左移 c 4 3072 右移运算符 是双目运算符 其计算结果是把 的左操作数的各二进位全部右移若干位后得到的值 要移动的位数就是 的右操作数 移出最右边的位就被丢弃 对于有符号数 如long int short char类型变量 在右移时 符号位 即最高位 将一起移动 并且大多数C C 编译器规定 如果原符号位为1 则右移时左边高位就补充1 原符号位为0 则右移时高位就补充0 右移运算符 对于无符号数 如unsignedlong unsignedint unsignedshort unsignedchar类型的变量 则右移时 高位总是补0 右移运算符不会改变左操作数的值 实际上 右移n位 就相当于左操作数除以2n 并且将结果向下取整 25 4 2 2 4 118 4 1 右移运算符 includemain intn1 15 shortn2 15 unsignedshortn3 0 xffe0 unsignedcharc 15 n1 n1 2 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 n1 00000000000000000000000000001111n2 1111111111110001n3 1111111111100000c 00001111n1 2 变成300000000000000000000000000000011n2 3 变成 21111111111111110n3 4 变成ffe0000111111111110c 3 变成100000001 思考题 有两个int型的变量a和n 0 n 31 要求写一个表达式 使该表达式的值和a的第n位相同 答案 a n 1或 a 1 n 六个函数 按位与 按位或 按位异或 取反 右移 内容提要 课程简介输入输出位运算函数指针命令行参数库函数程序风格 函数指针 程序运行期间 每个函数都会占用一段连续的内存空间 而函数名就是该函数所占内存区域的起始地址 也称 入口地址 我们可以将函数的入口地址赋给一个指针变量 使该指针变量指向该函数 然后通过指针变量就可以调用这个函数 这种指向函数的指针变量称为 函数指针 函数指针 函数指针定义的一般形式为 类型名 指针变量名 参数类型1 参数类型2 其中 类型名 表示被指函数的返回值的类型 参数类型1 参数类型2 中则依次列出了被指函数的所有参数的类型 例如 int pf int char 表示pf是一个函数指针 它所指向的函数 返回值类型应是int 该函数应有两个参数 第一个是int类型 第二个是char类型 函数指针 可以用一个原型匹配的函数的名字给一个函数指针赋值 要通过函数指针调用它所指向的函数 写法为 函数指针名 实参表 下面的程序说明了函数指针的用法 includevoidPrintMin inta intb if a b printf d a elseprintf d b intmain void pf int int intx 4 y 5 pf PrintMin pf x y return0 上面的程序输出结果是 4 函数指针应用 快速排序库函数qsort voidqsort void base intnelem unsignedintwidth int pfCompare constvoid constvoid base是待排序数组的起始地址 nelem是待排序数组的元素个数 width是待排序数组的每个元素的大小 以字节为单位 pfCompare是一个函数指针 它指向一个 比较函数 该比较函数应是返回值为int 有两个参数为constvoid 的函数int函数名 constvoid elem1 constvoid elem2 快速排序库函数qsort 排序就是一个不断比较并交换位置的过程 qsort如何在连元素的类型是什么都不知道的情况下 比较两个元素并判断哪个应该在前呢 答案是 qsort函数在执行期间 会通过pfCompare指针调用 比较函数 调用时将要比较的两个元素的地址传给 比较函数 然后根据 比较函数 返回值判断两个元素哪个更应该排在前面 这个 比较函数 不是C C 的库函数 而是由使用qsort的程序员编写的 在调用qsort时 将 比较函数 的名字作为实参传递给pfCompare 程序员当然清楚该按什么规则决定哪个元素应该在前 哪个元素应该在后 这个规则就体现在 比较函数 中 qsort函数的用法规定 比较函数 的原型应是 int函数名 constvoid elem1 constvoid elem2 该函数的两个参数 elem1和elem2 指向待比较的两个元素 也就是说 elem1和 elem2就是待比较的两个元素 该函数必须具有以下行为 1 如果 elem1应该排在 elem2前面 则函数返回值是负整数 任何负整数都行 2 如果 elem1和 elem2哪个排在前面都行 那么函数返回03 如果 elem1应该排在 elem2后面 则函数返回值是正整数 任何正整数都行 快速排序库函数qsort include includeintMyCompare constvoid elem1 constvoid elem2 unsignedint p1 p2 p1 unsignedint elem1 p2 unsignedint elem2 return p1 10 p2 10 下面的程序 功能是调用qsort库函数 将一个unsignedint数组按照个位数从小到大进行排序 比如8 23 15三个数 按个位数从小到大排序 就应该是23 15 8 defineNUM5intmain unsignedintan NUM 8 123 11 10 4 qsort an NUM sizeof unsignedint MyCompare for inti 0 i NUM i printf d an i return0 上面程序的输出结果是 101112348 思考题 如果要将an数组从大到小排序 那么MyCompare函数该如何编写 内容提要 课程简介输入输出位运算函数指针命令行参数库函数程序风格 命令行参数 将用户在DOS窗口输入可执行文件名的方式启动程序时 跟在可执行文件名后面的那些字符串 称为 命令行参数 命令行参数可以有多个 以空格分隔 比如 在Dos窗口敲 copyfile1 txtfile2 txt copy file1 txt file2 txt 就是命令行参数如何在程序中获得命令行参数呢 命令行参数 intmain intargc char argv 参数argc就代表启动程序时 命令行参数的个数 C C 语言规定 可执行程序程序本身的文件名 也算一个命令行参数 因此 argc的值至少是1 argv是一个数组 其中的每个元素都是一个char 类型的指针 该指针指向一个字符串 这个字符串里就存放着命令行参数 例如 argv 0 指向的字符串就是第一个命令行参数 即可执行程序的文件名 argv 1 指向第二个命令行参数 argv 2 指向第三个命令行参数 请看例子程序 includeintmain intargc char argv for inti 0 i argc i printf s n argv i return0 将上面的程序编译成sample exe 然后在控制台窗口敲 samplepara1para2s txt54输出结果就是 samplepara1para2s txt54 内容提要 课程简介输入输出位运算函数指针命令行参数库函数程序风格 C语言标准库函数 数学函数数学库函数声明在math h中 主要有 abs x 求整型数x的绝对值cos x x 弧度 的余弦fabs x 求浮点数x的绝对值ceil x 求不小于x的最小整数floor x 求不大于x的最小整数log x 求x的自然对数log10 x 求x的对数 底为10 pow x y 求x的y次方sin x 求x 弧度 的正弦sqrt x 求x的平方根 字符处理函数在ctype h中声明 主要有 intisdigit intc 判断c是否是数字字符intisalpha intc 判断c是否是一个字母intisalnum intc 判断c是否是一个数字或字母intislower intc 判断c是否是一个小写字母intislower intc 判断c是否是一个小写字母intisupper intc 判断c是否是一个大写字母inttoupper intc 如果c是一个小写字母 则返回其大写字母inttolower intc 如果c是一个大写字母 则返回其小写字母 字符串和内存操作函数字符串和内存操作函数声明在string h中 常用的有 char strchr char s intc 如果s中包含字符c 则返回一个指向s第一次出现的该字符的指针 否则返回NULLchar strstr char s1 char s2 如果s2是s1的一个子串 则返回一个指向s1中首次出现s2的位置的指针 否则返回NULLchar strlwr char s 将s中的字母都变成小写char strupr char s 将s中的字母都变成大写char strcpy char s1 char s2 将字符串s2的内容拷贝到s1中去char strncpy char s1 char s2 intn 将字符串s2的内容拷贝到s1中去 但是最多拷贝n个字节 如果拷贝字节数达到n 那么就不会往s1中写入结尾的 0 字符串和内存操作函数char strcat char s1 char s2 将字符串s2添加到s1末尾intstrcmp char s1 char s2 比较两个字符串 大小写相关 如果返回值小于0 则说明s1按字典顺序在s2前面 返回值等于0 则说明两个字符串一样 返回值大于0 则说明s1按字典顺序在s2后面 intstricmp char s1 char s2 比较两个字符串 大小写无关 其他和strcmp同 void memcpy void s1 void s2 intn 将内存地址s2处的n字节内容拷贝到内存地址s1void memset void s intc intn 将内存地址s开始的n个字节全部置为c 字符串转换函数有几个函数 可以完成将字符串转换为整数 或将整数转换成字符串等这类功能 它们定义在stdlib h中 intatoi char s 将字符串s里的内容转换成一个整型数返回 比如 如果字符串s的内容是 1234 那么函数返回值就是1234doubleatof char s 将字符串s中的内容转换成浮点数 字符串转换函数char itoa intvalue char string intradix 将整型值value以radix进制表示法写入string 比如 charszValue 20 itoa 32 szValue 10 则使得szValue的内容变为 32 itoa 32 szValue 16 则使得szValue的内容变为 20 内容提要 课程简介输入输出位运算函数指针命令行参数库函数程序风格 标识符的命名 匈牙利命名法为C程序标识符的命名定义了一种非常标准化的方式 这种命名方式是以两条规则为基础的 a 变量的名字以一个或者多个小写字母前缀开头 前缀能够体现变量数据类型 作用域等信息 b 在标识符内 前缀以后就是一个或者多个第一个字母大写的单词 这些单词清楚地指出了该标识符的作用 推荐一种C程序标识符命名法 1 变量命名加前缀ccharucunsignedcharsshortnintuunsignedintllongdwunsignedlongb取值只为真和假的整型变量如bValidsz以 0 结尾的字符串或字符数组f浮点数 float hHANDLE 句柄 ddouble 推荐一种C程序标识符命名法 p指针psz指向字符串的指针pn整型指针m 类成员变量g 全局变量a数组fp文件指针FILE eenum类型g 全局变量参数后面加 如intSum intx inty 推荐一种C程序标识符命名法 2 变量名中单词开头字母大写 其他字母小写但是常用的意义明显的变量 如i j k 坐标x y等不必遵循1 2 3 常量和宏都是大写 单词之间用 分隔 defineMAX WIDTH5 defineABS x x 0 x x 推荐一种C程序标识符命名法 4 函数名字中每个单词的头一个字母大写 其他字母小写 一般采用动词 名词形式voidPrintMessage intWriteIdToFile FILE fp int nId 5 结构定义加大写字母S作为前缀structSPerson intnId intnAge 推荐一种C程序标识符命名法 6 类定义加大写字母C作为前缀classCPerson intm nId 7 类型定义全部大写typedefstructSPersonPERSON typedefstructSPerson PPERSON 指针加 P 标识符命名应注意的一些细节 标识符号应能提供足够信息 最好是可以发音的 为全局变量取长的 描述信息多的名字 为局部变量取短名字名字太长时可以适当采用单词的缩写 但要注意 缩写方式要一致 要缩写就全都缩写 比如单词Number 如果在某个变量里缩写成了 intnDoorNum 那么最好包含Number单词的变量都缩写成Num 4 注意使用单词的复数形式 如intnTotalStudents nStudents 容易让人理解成代表学生数目 而nStudent含义就不十分明显 标识符命名应注意的一些细节 5 对于返回值为真或假的函数 加 Is 前缀如 intIsCanceled intisalpha C语言标准库函数BOOLIsButtonPushed 6 对于获取某个数值的函数 加 Get 前缀char GetFileName 7 对于设置某个数值的函数 加 Set 前缀voidSetMaxVolume 8 一般变量和结构名用名词 函数名用动词或动宾词组 程序书写格式注意事项 正确使用缩进首先 一定要有缩进 否则代码的层次不明显 缩进应为4个空格较好 需要缩进时一律按Tab键 或一律按空格键 不要有时用Tab键缩进 有时用空格键缩进 一般开发环境都能设置一个Tab键相当于多少个空格 此时就都用Tab键 程序书写格式注意事项 2 行宽与折行 一行不要太长 不能超过显示区域 以免阅读不便 太长则应折行 折行最好发生在运算符前面 不要发生在运算符后面如if Condition1 Condition2 Condition3 程序书写格式注意事项 3 注意 位置不可随意 要统一如果写了 if condition1 DoSomething 别处就不要写if condition2 DoSomething 程序书写格式注意事项 4 变量和运算符之间最好加1个空格intnAge 5 nAge 4 if nAge 4 printf d nAge for i 0 i 100 i 一些好的编程习惯 1 尽量不要用立即数 而用const定义成常量 以便以后修改constintMAX STUDENTS 20structSStudentaStudents MAX STUDENTS 比structSStudentaStudents 20 好 defineTOTAL ELEMENTS100for i 0 i TOTAL ELEMENTS i 一些好的编程习惯 2 使用sizeof 宏 不直接使用变量所占字节数的数值intnAge for j 0 j 100 j fwrite fpFile 好 一些好的编程习惯 4 稍复杂的表达式中要积极使用括号 以免优先级理解上的混乱n k j 不好n k j 好一点5 不很容易理解的表达式应分几行写 n k j 应该写成 n k j k 一些好的编程习惯 6 不提倡在表达式中使用 形式 而用if else语句替代xp 2 k n m c k 1 d k if 2 k n m xp c k 1 elsexp d k 一些好的编程习惯 7 嵌套的ifelse语句要多使用 if Condition1 if condition2 DoSomething elseNoCondition2 不够好 应该 if Condition1 if condition2 DoSomething elseNoCondition2 一些好的编程习惯 8 应避免ifelse的多重嵌套 而用并列的完成 if Condition1 if Condition2 if Condition3 Condition123 else NoCondition3 else NoCondition2 else NoCondiction1 一些好的编程习惯 替换为 if condition1 NoCondition1 elseif condition2 NoCondition2 elseif condition3 NoCondition3 else Condition123 一些好的编程习惯 9 写出来的代码应该容易读出声比如if n m 一些好的编程习惯 参考书目 C 编码规范 陈世忠编著摩托罗拉公司审校人民邮电出版社 1 用一条语句将整型变量n中的第i位 变成和整型变量m的第i位一样 而n的其他位保持不变2 用一条语句将整型变量n中的第i位取反 而n的其他位保持不变3 用一条语句将整型变量n中的左边i位都取反 而n的其他位保持不变 第一讲思考题
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!