版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE10HelloWorld 1源程序 1C语言版 11.1.2.C++版 11.1.3.hellowordcollection 1注释 1从源程序到可执行程序 2集成开发环境: 2手动编译: 2致敬大师 3Linux常用基础命令 5版本选择 5内核版本 5发行版本 5目录结构 6系统目录 6分区与目录 8常用命令 10命令格式 10目录切换 10文件操作 10用户管理 11网络命令 11Ubuntu下软件安装 11vim文本编辑 11vim编辑器中有三种状态模式 12vim编辑器的启动与退出 12文件操作 12光标移动操作 12编辑操作 13查找与替换操作 13学习工具vimtutor 14vim最简易配置 14vim与HHKB 14C语言与自然语言 16语法规则 16程序与流程 163.2.1.程序 16流程和流程图 17常用制图工具 18常/变量与数据类型(DataType) 19C语言中的关键字 19变量(Variable) 19变量的定义 19变量的命名规则: 19交换两个变量的内容 20驼峰命名法 20内存模型 21物理基础 21CPU读写内存 22读写流程: 22代码演示 23计算机的基石补码 24计算机编码基础 24补码的编码规则 244.4.3.小结 26数据类型 26类型总揽 27基本类型之数值类型 27基本类型之字符类型 29常量(Constant) 33常量类型 33常量的大小 34格式输入与输出 35printf 35scanf 38putchar&&getchar 40输入输出缓冲 41类型转化(TypeCast) 41隐式转化 41强制转化 43浮点数跟0值比较 434.9.练习 444.9.1.printf返回值有意义吗? 44运算符与表达式(Operator&&Express) 45运符符的优先级和结合性 45常见运符算符及构成的表达式 47赋值运算符与赋值表达式 47算术运算符与算术表达式 48关系运算符与关系表达式 49逻辑运算符与逻辑表达式 50条件运算符与条件表达式 52逗号运算符与逗号表达式 53sizeof运算符及其表达式 535.2.8.小结 54运算符综合练习 55if(x==y)与if(x=y)之间的区别。 555.3.2.表达式3==3==3的值是多少? 555.3.3.表达式100<=a<=300,能表达[100,300]这样的区间吗? 555.3.4.如何判断,我们输入的字符在[a,z]之间。 555.3.5.求[100,999]内的水仙花数 55判断输入的年份,是否为润年。 55判断数字是否是回文数。 55程序结构设计 566.1.选择 56Ifelse 56switch 596.1.3.小结 616.1.4.练习判断按键 616.2.循环 62循环三要素 62while“当”型循环 63dowhile“直到”型循环 65for“列表”型循环 68循环小结 69循环的嵌套 70循环建议 726.2.8.练习 736.3.跳转 75break 75continue 76return 77goto 786.3.5.练习 786.4.练习 786.4.1.打印如下图形 78数组(Array) 80一维数组 80逻辑与声明 80初始化 81一维数组的存储 83数组三要素 84关于变长数组 84课堂练习 85二维数组 89逻辑与声明 89二维数组的存储 89初始化 92课堂练习 94数组名的二义性 97一维数组名 97二维数组名 987.4.练习 99写出冒泡排序的逻辑,并实现冒泡排序。 99无序数组查找,返回下标(线性查找) 99有序数组查找(折半查找) 99合并两个有序数组到第三个中去,并使其依然保持有序 99求出矩阵两条对角线上的元素之和 100有序数组去重,并返回去重后数组元素新个数。 100二维数组按列移位 100五子棋判输赢 100指针(Pointer) 101认识内存 101线性的内存 101变量的地址与大小 102间接访问内存 103指针常量 103指针是有类型地址常量 103指针变量 1058.3.1.定义 1058.3.2.解析 105指针变量大小 105初始化及间接访问 106指向/被指向/更改指向 106NULL(色即空) 1088.3.7.练习 108指针运算 109赋值运算 109算术运算 109关系运算 1108.4.4.小结 110数组遇上指针 111一维数组的访问方式 111二维数组的访问方式 1138.6.练习 116用指针法逆序打印一个数组。 116往指定内存写入数据 116判判是否是回文串 116函数(Function) 117c标准库及库函数 117库存在的意义 117如何使用库函数 1179.1.3.示例 1189.1.4.常用库函数 123自定义函数 124语法格式 124调用方法 125前向声明 125函数返回值 126传值与传址 126传值与传址的比较 126图解传值与传址 128如何来传递一个一维数组 129如何来传递一个二维数组 1319.3.5.小结 131函数调用 131实参与形参 131普通调用 131递归调用 132函数递归 133递归定义 133递归小结 135递归与循环论述 135递归练习 1379.6.练习 137如何产生[m,n]以内的随机数。 137产生30个不重复的随机数 137请用函数封装基于数组的冒泡排序,选择排序。 137用函数的思想来支解选择法排序 137请用函数封装基于数组的二分查找。 138求中位数 138变量作用域/生命周期/修饰符 139作用域(Scope) 13910.1.1.作用域 139变量之分 139图示作用域 140作用域叠加 140全局作用域 141生命周期(Duration) 142局部变量 142全局变量 142修饰符(StorageDescription) 142auto(大将军) 142register(小太监) 142extern(通关文牒) 143static(柱国老臣|限离出境) 14510.4.小结 147字符串(String) 14811.1.引入 148字符串常量 148字符串大小 149字符串存储 149C语言是如何处理字符串常量 150字符串与字符数组 150常量字符串不可更改 150字符串与字符数组比较 150字符数组存储字符串 15111.3.4.小结 152字符串的输入与输出 15311.4.1.输出 15311.4.2.输入 153字符串操作函数 154字符数组原生操作 154库函数操作 155字符串操作函数自实现 158myStrlen 158myStrcpy 159多文件编程 16011.7.1.函数声明(.h) 16011.7.2.函数实现(.c) 16011.7.3.头文件包含#include 161指针数组 16111.8.1.定义 16111.8.2.应用 16211.8.3.思考 164你所追过的那些“零” 164零所代表的意义 164实例分析 16411.10.作业 165自实现myStrcat 165自实现myStrcmp 165以下代码能打印什么? 166内存管理(Memory) 167进程空间 167进程vs程序 167进程空间图 167栈内存(Stack) 167栈存储的内容 167栈存储的特点 16812.2.3.栈大小 16812.2.4.常见栈溢出案例 168堆内存(Heap) 169堆内存特点 16912.3.2.堆大小 169堆内存的申请与释放 169应用模型 173常见错误案例剖析 173VLD工具使用 175开放的地址空间 175堆与栈空间的返回 176栈空间不可以返回 176堆空间可以返回 176结构体(Struct) 17713.1.引例 177为什么要引入结构体 178开放类型定义 178从单变量->数组->结构体 178结构体类型定义 179无名构造类型 180有名构造类型 181别名构造体类型 18113.3.4.小结 181结构体变量初始化及成员访问 181初始化及访问 182成员运算符本质 18413.4.3.赋值 185结构体数组 186定义及初始化 186内存存储形式 18713.5.3.实战 188结构体嵌套 189结构体中可以嵌套结构体 189嵌套结构体变量定义和初始化 189结构体类型作参数和返回值 190结构体变量作参数和返回值 190结构体指针作参数 190获取当前时间函数的使用 191结构体类型的大小 192结构体成员内存分布 192内存对齐 192结构体中嵌套构造类型成员的对齐 193结构体使用注意事项 193向结构体内未初始化的指针拷贝 193未释放结构体内指针所指向的空间 194深拷贝与浅拷贝 19513.10.练习 19513.10.1.栈的自实现 195typedef类型重命名 196typedef作用 196定义新类型 196typedef和#define的区别 19713.11.4.小结 198类型大总结 198共用(Union)与枚举(Enum) 19914.1.共用体 199类型定义与变量定义 199内存分析 199共用体小结 20214.1.4.应用 20214.2.枚举 204枚举类型定义 204枚举变量与初始化 205枚举常量 20614.2.4.应用 20614.3.练习 207输出一个整型数据的字符形式 207实现short类型变量高低位互换 207将下面程序中case分支常量用宏和枚举来实现 207单向链表(List) 209链表价值 209静态链表 209链表节点定义 209图示节点 209图示链表结构 209代码实现 210动态链表 210链表图示 211链表名字解释 21115.3.3.创建(尾插法) 21115.3.4.创建(头插法) 21215.3.5.遍历 21315.3.6.求长度 21315.3.7.插入 21315.3.8.查找 21415.3.9.删除 21415.3.10.排序 215链表反转 216链表销毁 217环形链表 21715.4.作业 218输入一字符串,用链表形式储存。 218用选择法实现单向链表的排序。 218倒序打印单链表。 218合并链表 218文件(File) 21916.1.文件流 219文件流概念 219文件类型 219文件缓冲 221文件的打开和关闭 222FILE结构体 222fopen 223fclose 224一次读写一个字符(文本操作) 224fputc 224225关于feof的问题 22616.3.4.练习 227一次读写一行字符(文本操作) 229fputs 229fgets 230关于feof的问题 231注意事项 23216.4.5.练习 232一次读写一块字符(二进制操作) 234fwrite/fread 234试读文本文件 234二进制读写才是我的本质 236文件指针偏移 240rewind 240ftell 240fseek 240空洞文件 241注意事项 241\n与\r\n的区别 24116.8.练习 242文本文件内容排序(行数不能变) 242读写文件生成链表 244修改文件内容 248位操作(BitOperation) 249位操作与逻辑操作 249数据的二进制表示 2498位二进制数据的补码 249二进制打印 25017.3.位操作 25017.3.1.位与(&) 25017.3.2.位或(|) 25017.3.3.位取反(~) 25117.3.4.位异或(^) 25117.3.5.左移(<<) 25217.3.6.右移(>>) 25217.4.优先级 252计算如下值: 253简记结论 25317.5.应用 25317.5.1.掩码(mask) 25317.5.2.功能 25417.5.3.生成 25417.5.4.练习 25417.6.提高 255无参交换 255异或加密(文本与二进制) 256循环移位加密(文本与二进制) 25817.7.练习 259下面表达式的运算结果是什么? 259依数据的符号们判断正负。 259练习加密二进制文件 259预处理(PreCompile) 261发生时机 261宏(Macro) 261不带参宏 261带参宏(宏函数) 26218.2.3.取消宏 263条件编译(ConditionCompile) 264单双路(#ifdef/#ifndef#else#endif) 264单双多路(#if#elif#endif) 264头文件包含(#include) 265包含的意义 265包含的方式 265多文件编程 266定义头文件 267相互包含的避免 26918.5.其它 269#运算符利用宏创建字符串 269##运算符预处理的粘和剂 270预定义宏 27118.6.练习 27218.6.1.宏展开有次序吗? 27219.项目 273项目简介 273概要设计 273详细设计 27319.4.实现 273界面菜单实现 273链表实现 273文件读写实现 27319.5.SVN版本管理控制 273附录(Appendix) 274参考书目 274ascii码表详解 274ascii特殊字符解释 275运算符优先级 275易错优先级集锦 27820.6.vs2013中使用技巧 27820.6.1.禁用_s版本函数的方法 278附练习答案 278第六章程序设计 278第七章数组 278章节思维导图 280常变量与数据类型 280运算符与表达式 28020.8.3.数组 28020.8.4.函数 28020.8.5.作用域与运算符 28020.8.6.字符串 28020.8.7.文件 28020.8.8.位运算 28020.8.9.预处理 28011HelloHelloworldC语言的作者,DennisRitchie(丹尼斯·里奇)在他的名著《\hC程序设计语言(TheCProgrammingLanguage)》中第一次引入,传为后世经典,其它语言亦争相效仿,以示致敬。源程序}return}return0; //main//程序的入口,表示计算机从哪里开始执行此程序,有且,只有一个intmain(){printf("HelloWorld!\n");//HelloWorld!#include<stdio.h>//程序中因为用到了printfprintfC++版}}return0; //main//程序的入口,表示计算机从哪里开始执行此程序,有且,只有一个intmain(){cout<<"HelloWorld!"<<endl;//通过类对象cout向屏幕输出HelloWorld!#include<iostream> //程序中因为用到了coutcoutusingnamespacestd;//用到的命名空间\hhttp://helloworldcollection.de/helloword\hhttp://helloworldcollection.de/注释从源程序到可执行程序源程序就是一个.txt的普通文本文件,是经历了哪些过程,变为可执行性文件的呢?大体上分为四个步骤:预处理->编译->汇编->链接四个过程。集成开发环境:对于集成开发环境(IDE,IntegratedDevelopmentEnvironment)而言,减少了环境配置,合并了流程,使其便于快速开发。就Qt开发环境而言,只需一步即可:手动编译:unix/linuxvimgcc为编译器为例,演示。123412345gcc -E hello.c -o hello.i //处理文件包含,宏和注gcc -S hello.i -o hello.s //编译为汇编文件gcc -c hello.s -o hello.o //经汇编后为二进制的机器指gcc hello.o -o hello //链接所用的到库1预处理:预处理相当于根据预处理命令组装成新的C程序,不过常以i为扩展名。123编 译:将得到的i文件翻译成汇编代码.s23汇 编:将汇编文件翻译成机器指令,并打包成可重定位目标程序的O文件该文件是二进制文件,字节编码是机器指令。4链 接:将引用的其他O文件并入到我们程序所在的o文件中处理得到最终的可执行文件。4Linux环境虽然简陋,但是向我们呈现出的是本质的东东,一上手,就用集成开发环境可能有些细节,可能很久都搞不明白。致敬大师DennisRitchie KenThompson“牛顿说他是站在巨人的肩膀上,如今,我们都站在里奇的肩膀上。” 克尼汉“他是虔诚而纯粹的计算机天才,侵犯他人电脑是绝不干的。” 潘嘉杰。“40C语言,UnixPlan9,无论哪一项,在软件发展史上都有着C++C语言的普及和深PascalNiklausWirth交流时,C++C语言的利器,Wirth先生不无惋惜地表示,后来他开发的Pascal2。”著名的计算机科学家如是说。22Linux 常用基础命令本章节旨在简略的介绍linux的基本使用,可能会在讲解语言的过程中作一些平台差异对比。目的只有一个就是混个脸熟,我们后面会有专业课堂来讲解。版本选择内核版本Linux内核是开源,开源地址:\h/如此好的东东,都开源了,想想都鸡动。作者LinusTorvalds,Linux最开始是由linus完成,然后开源,全世界的程序员都在为它贡献代码。大神级别的人物,无需赘言,只需膜拜。查看内核版本的命令如下:版本信息:发行版本内核是不能直接运行在某个具体的机型上,需要适配,于是就有了各种发行版本。在众多的版本中,我们为什么会选择CentOS/Ubuntu?CentOSCommunityEnterpriseOperatingSystem的简称,我们有很多人叫它社区linux的一个发行版本。CentOS,来自大名鼎RedHatRHEL(RedHatEnterpriseLinux)RHEL在系统的稳定RHELRedHatCentOSREHLlinuxRedHat付任何的费用。乌班图是一个以\h桌面\hLinux操作系统\h洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu基于Debian发行版和\hGNOME桌面环境,Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由\h自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。目录结构系统目录打开我的电脑的一瞬间,大家的第一反应就是,怎么一堆文件夹,我的盘符(c盘,d盘等)怎么不见了?Windows分区在盘符下面,而linux分区挂在文件目录下面。可以通过命令查看树结构 tree / -L2目录描述/根目录/bin做为基础系统所需要的最基础的命令就是放在这里。比如ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。/bootLinux的内核及引导系统程序所需要的文件,比如vmlinuzinitrd.img文件都位于LILO装载文件存放位置,如kernels,initrd,grub。一般是一个独立的分区。/dev一些必要的设备,声卡、磁盘等。还有如/dev/null./dev/console/dev/zero/dev/full等。/etc系统的配置文件存放地.一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;/etc/opt:/opt对应的配置文件/etc/X11:Xwindows系统配置文件/etc/xml:XML配置文件……/home用户工作目录,和个人配置文件,如个人环境变量等,所有的账号分配一个工作目录。一般是一个独立的分区。/lib库文件存放地。bin和sbin需要的库文件。类似windows的DLL。/mediaCD-ROMsU/mnt临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom等目录。可以参看/etc/fstab的定义。/opt可选的应用程序包。/proc操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统,它的定义可以参见/etc/fstab。/rootRoot用户的工作目录/sbin和bin类似,是一些可执行文件,不过不是所有用户都需要的,一般是系统管理所需要使用得到的。/tmp系统的临时文件,一般系统重启不会被保存。/usr包含了系统用户工具和程序。/usr/bin:非必须的普通用户可执行命令/usr/include:标准头文件/usr/lib:/usr/bin/和/usr/sbin/的库文件/usr/sbin:非必须的可执行文件/usr/src:内核源码/usr/X11R6:XWindowSystem,Version11,Release6./srv该目录存放一些服务启动之后需要提取的数据分区与目录Linux下磁盘分区和目录的关系如下:任何一个分区都必须挂载到某个目录上(同一分区可以同时挂载到不同的目录)。目录是逻辑上的区分,分区是物理上的区分。Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。例linuxU盘(FAT32模式)的使用:U盘是否接入[root@localhostDeviceBootDesktop]#Startfdisk-lEndBlocksId System/dev/sdb1 *16524057082112c W95FAT32(LBA)建立挂载节点[root@localhostDesktop]#mkdir/mnt/usb[root@localhost[root@localhostDesktop]#mkdir/mnt/usb[root@localhostDesktop]#ls /mnt/hgfsusb挂载命令[root@localhostDesktop]#[root@localhostDesktop]#mount/dev/sdb1 /mnt/usb/[root@localhostDesktop]#cd /mnt/usb/[root@localhostusb]#ls160307222636.BMP autorun.inficon.ico SystemVolumeInformation360DrvMgrInstaller_net.exeGHO ISO卸载命令[root@localhostmnt]#umount/mnt/usb/[root@localhostmnt]#ls/mnt/[root@localhostmnt]#umount/mnt/usb/[root@localhostmnt]#ls/mnt/hgfs2-2-常用命令命令格式目录切换命令参数释意示例ls-l -a查看当前目录中的文件ls/rootpwd显示当前路径pwdcd切换至不同的目录cd/optcd...当前目录,即缺省目录..上一级目录文件操作命令参数释意示例touch创建空文件touchaa.cmkdir创建空文件夹mkdirmydirrm-r-f删除文件或目录rm-rfaa.ccp-r拷贝文件去某个目录,若后面跟不是文件夹,是为复制文件。cpcpaa.caa.c/optaa.c.bakmv剪切文件去某个目录,若后面跟的不是目录,则为重命名mvcpaa.caa.c/optbb.cfind在给定目录下,按名字查找文件或目录。find/opt-nameaa.cfind/opt-typelfind/opt-size+10000kcat在终端中显示文本内容。cataa.cless可进行翻页的文本内容查看。lessaa.chead-n查看文件开头的n行。cat-n10hello.ctail-n查看文件结尾的n行。cat-n30hello.c用户管理命令参数释意示例useradd添加一个用户useraddjimpasswd给新添加用户设密passwd jimuserdel-r删除某个用户(并工作目录)userdel-rjimsu切换当前用户为其它用户su root网络命令命令参数释意示例ifconfig查看当前网络状态ifconfigping-c查看网络联接状态pingsetupsetup设置网络setupservicenetwork重启网络servicenetworkrestartserviceiptables关闭防火墙serviceiptablesstopchkconfigiptables禁用防火墙chkconfigiptablesoffsestatus查看selinux状态setenforce0关闭selinuxsetenforce0Ubuntu下软件安装命令释意示例apt-getupdate获取最新软件列表apt-getupdateapt-getupgrade升级最新列表软件apt-getupgradeapt-cachesearch查询软件列表apt-cachesearchvimapt-getinstall安装软件apt-getintallqt5-defaultqtcreatorqt5-docapt-getremove卸载软件apt-getremovevim2.4.vim文本编辑有人曾戏说,世界上只有三种编辑器,VIM、EMACS和其它。vimlinux/unix的开发经验。2.4.1.vim编辑器中有三种状态模式2.4.2.vim编辑器的启动与退出命令释意$vi直接进入编辑环境$vimyfile进入编辑环境并打开(新建)文件:q退出vi编辑环境文件操作命令释意:w保存对vi编辑器中已打开文件的修改:wmyfile将vi编辑器中的内容另存为指定文件名:wq对vi编辑器中的文件进行保存并退出vi编辑器:q!放弃对文件内容的修改,并退出vi编辑器光标移动操作命令光标操作释意光标移动h向左移动光标l向右移动光标k向上移动光标j向下移动光标翻页Ctrl+f向下翻整页Ctrl+b向上翻整页Ctrl+u向上翻半页Ctrl+d向下翻半页行内移动光标^将光标快速跳转到本行的行首字符$将光标快速跳转到本行的行尾字符文件内跳转:setnu在编辑器中显示行号:setnonu取消编辑器中的行号显示1G(gg)跳转到文件的首行G跳转到文件的末尾行#G跳转到文件中的第#行编辑操作命令光标操作释意进入输入模式i在当前光标处进入插入状态a在当前光标后进入插入状态o行首,进入插入状态O行首,进入插入状态c(n)w插入状态c$删除当前光标到行尾的字符,并进入插入状态c^命令删除当前光标之前(不包括光标上的字符)到行首的字符,并进入插入状态删除操作x删除光标处的单个字符(n)dd删除光标所n行:3,5d删除从第3行到第5行的内容dw(包括空格的所有字符de(不包括单词尾部的空格)的所有字符d$删除当前字符到行尾的所有字符d^删除当前字符到行首的所有字符J(大写)前行和下一行的内容拷贝和粘贴(n)yy复制当前行整行的内容到vi缓冲区:3,6co(m)12复制(剪切)3-6行,到第12行处p读取vi缓冲区中的内容,并粘贴到光标当前的位置(不覆盖文件已有的内容)撤销与恢复u取消最近一次的操作,并恢复操作结果可以多次使用u命令恢复已进行的多步操作U取消对当前整行进行的所有操作Ctrl+r对使用u命令撤销的操作进行恢复查找与替换操作命令光标操作释意查找/word从上而下在文件中查找字符串“word”?word从下而上在文件中查找字符串“word”n定位下一个匹配的被查找字符串N定位上一个匹配的被查找字符串替换:s/old/new将当前行中查找到的第一个字符“old”串替换为“new”:s/old/new/g将当前行中查找到的所有字符串“old”替换为“new”:#,#s/old/new/g在行号“#,#”范围内替换所有的字符串“old”为“new”:%s/old/new/g在整个文件范围内替换所有的字符串“old”为“new”vimtutor在命令行中输入vimtutor默认是英文版的,可以使用中文版vimtutor-gzh。2.4.8.vim最简易配置在用户当前的家目录中,输入vim ~/.vimrc(本用户)或vim/etc/vim/vimrc(全局用户)该文件是一个隐藏文件,如果没有则创建它,该文件中保存一些,vim的常用配置。////代码显示行号//关键词高亮显示//c语法自动缩进//新行自动缩进//缩进宽度4//tab4//制表符宽度4//不备份setnusyntaxonsetcindentsetautoindentsetshiftwidth=4settabstop=4setsofttabstop=4setnobackupvim应用提高:\h/linux_wgl/article/details/514465122.4.9.vim与HHKB大师&Vim&HHKB:RichardMatthewStallman BjarneStroustrup3-3-C语言与自然语言语法规则(数学语言)程序与流程程序生活中:程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合计算机中:流程和流程图流程即算法如何来描述算法呢?比如,我现在要计算一个长方形的面积。我就要用自然语言去描述他。算法如下:121234如果大于零,将长度和宽度两个值相乘得到面积,否则显示输入错误;显示面积流程图为了更易于表达清楚,常采用流程图的方式:它使用一组预定义的符号来说明如何执行特定任务。请用流程图将a,b,cmax中并输出。常用制图工具4-4-常/变量与数据类型4.1.C语言中的关键字Ccharshortintlongfloatdoubleifelsereturndowhileforswitchcasebreakcontinuedefaultgotosizeofautoregisterstaticexternunsignedsignedtypedefstructenumunionvoidconstvolatile(Variable)变量的定义类型类型 变量名;变量的命名规则:变量名可以由字母、数字和_(下划线)组合而成。变量名不能包含除_以外的任何特殊字符,如:%、#、逗号、空格等。变量名必须以字母或_(下划线)开头。变量名不能包含空白字符(换行符、空格和制表符称为空白字符)。C语言中的某些词(例如int和float等)称为保留字,具有特殊意义,不能用作变量名。C语言区分大小写,因此变量price与变量PRICE是两个不同的变量。如下名字是合法的a_ba_b a1b _Ab如下名字则不合法的a@ba@b2ab a-bintmain(){intmain(){inta=5;intb=6;printf("a=%db=%d\n",a,b);//a=b;b=a;//printf("a=%db=%d\n",a,b);intt;t=a;a=b;b=t;printf("a=%db=%d\n",a,b);return0;}驼峰命名法myFirstNamemyLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。骆驼式命名法的命名规则可视为一种惯例内存模型物理基础32ByteBytebit,1Byte8bit。1B=8b1B=8b1KB =1024B1MB =1024KB1G =1024MBFFFFFFFFFFFFFFFEFFFFFFFFFFFCFFFFFFFBFFFFFFFA000000050000000400000003000000020000000100000000CPU读写内存CPU存储单元的地址(地址信息)or写(控制信息)读写的数据(数据信息)地址总线CUP通过地址总线要寻址,指定存储单元。可见地址总线上能传送多少个不同的信息,CPU10根地址总线,就能传送1021001023。也就是2n=最大传输n=多少地址总线。CPU地址总线的宽带决定了CPU的寻址能力。数据总线CPU8根数据总线一8位二进制数据。162个字节。数据总线的宽度决定了CPU和外界的数据传输速度。控制总线CPU对外部部件的控制时通过控制总线来进行的。控制总线是个总称,控制总线是有不同的控制线来集合的。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。控制总线的宽带决定了CPU对外部部件的控制能力。读写流程:读取流程(3单元读取数据)地址线1233B地址线1233B数据线9C08831控制线23AB内存读写指令01234561CPU通过地址线将地址信息3发出。12CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据。23存储器将3号单元中的数据8 通过数据线送入CPU。3写入流程:(263)地址线1233B地址线1233B数据线9C262631控制线23AB内存读写指令012345612CPU通过地址线将地址信息312CPU通过地址线发出内存写命令,选中存储器芯片,并通知它,要其写入数据。3CPU通过数据线将数据26送入内存3单元中。3代码演示#include<stdio.h>intmain(){#include<stdio.h>intmain(){inta=3;intb=4;intc=areturn0;}.汇编代码66[1] inta=3;0x40161e<+0x000e> c744240c03000000movl $0x3,0xc(%esp)7[1] intb=4;0x401626<+0x0016> c744240804000000movl $0x4,0x8(%esp)8[1] intc=a+b;0x40162e<+0x001e> 8b54240c mov 0xc(%esp),%edx0x401632<+0x0022> 8b442408 mov 0x8(%esp),%eax0x401636<+0x0026>01d0add%edx,%eax0x401638<+0x0028>89442404mov%eax,0x4(%esp)9[1] return0;0x40163c<+0x002c>b800000000mov$0x0,%eax计算机的基石补码计算机编码基础对于一个字节(8位),他所能表示的范围有多大呢?所有可能编码如下,共256种。111111111111101111101111110010000000111111000010100001000000011000001000000010000000补码的编码规则如何来利用这些硬件的基础来表示我们需要的数据范围呢?就是编码。模的概念模的概念可以帮助理解补数和补码。012n~2n-2。例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6;另一种是顺拨8小时:10+8=12+6=6。12844运算,都可以用8来代替。对“模”而言,8412模的系统中,111,102,93,75,66都有这个特性。共同的特点是两者相加等于模。对于计算机,其概念和方法完全一样。nn=8,所能表示的最大111111111100000000(9位),81自然丢00000000828把补数用到计算机对数的处理上,就是补码。补码运算正整数的补码是其二进制表示,\h与原码相同负数求补求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1。【例1】求-5的补码。-5 => |-5| => 00000101=>11111010 =>11111011【例2】数0的补码表示是唯一的。0 =>00000000 =>11111111 => 00000000补码求原unsigned signed255254253255254253252543210111111111111101111101111110010000000111111000010100001000000011000001000000010000000-1-2-3-4-128127543210小结补码解决了,符号位参与运算,不需要单独标识。0的表示方法。补码实现了,减法变加法,同样也适应于乘法和除法。数据类型数据类型,打个比方的话,就类似于部队中,前面我们己经给部队中人的起了名字,类型总揽基本类型之数值类型#include<stdio.h>intmain(void)#include<stdio.h>intmain(void){printf("char size=%d\n",sizeof(char));printf("short size=%d\n",sizeof(short));printf("int size=%d\n",sizeof(int));printf("long size=%d\n",sizeof(longint));printf("longlong size=%d\n",sizeof(longlong));printf("float size=%d\n",sizeof(float));printf("double size=%d\n",sizeof(double));printf("longdoublesize=%d\n",sizeof(longdouble));return0;}整型数表示范围类型位数(32位机)符号范围科学计数char8unsigned0-2550-28-1[signed]-128-+127-27-+27-1short16unsigned0-655350-216-1[signed]-32768-+32767-215-+215-1int32unsigned0-232-1[signed]-231-+231-1long32unsigned0-232-1[signed]-231-+231-1longlong64unsigned0-264-1[signed]-263-+263-1浮点数的表示方法和范围一个浮点数(FloatingPointNumber)由三个基本成分构成:符号(Sign)、阶码(Exponent)和尾数(Mantissa)。通常,可以用下面的格式来表示浮点数:SPM其中S是符号位,P是阶码,M是尾数。对于32/64位的单/双精度浮点型如下:类型位数(32位机)范围简算精算有效位数float32[2-128,2127][10-38,1038]6-7[-2127,-2-128][-1038,-10-38]6-7double64[2-2048,22047][10-308,10308]15-16[-22047,-2-2048][-10308,-10-308]15-16#include<stdio.h>#include<stdio.h>intmain(void){floatfvar=0.1234567654321;printf("fvar= %.13f\n",fvar);doubledvar=0.1234567654321;printf("dvar= %.13f\n",dvar);return0;}}基本类型之字符类型引入ASCII编码表。该表的本质就是一种对应关系。表示形式字符的表现形式,就是用单引号,引起来的一个字符。形如下:intmain(void)intmain(void){charval= 'a';for(;val<='z';val++){printf("%c\t",val);}return0;}ASCII编码目前使用最广泛的西文字符集及其编码是ASCII字符集和ASCII码(ASCII是AmericanStandardCodeforInformationInterchange的缩写它同时也被国际标准化组织InternationalOrganizationforStandardization,ISO)批准为国际标准。基本的ASCII字符集共有128个字符,其中有96个可打印字符,包括常用的字母、数字、标点符号等,另外还有32个控制字符。下表展示了基本ASCII字符集及其编码:ASCIIASCII字符ASCII字符ASCII字符ASCII字符0NUL32space64@96`1SOH33!65A97a2STX34"66B98b3ETX35#67C99c4EOT36$68D100d5ENQ37%69E101e6ACK38&70F102f7BEL39'71G103g8BS40(72H104h9TAB41)73I105i10LF42*74J106j11VT43+75K107k12FF44,76L108l13CR45-77M109m14SO46.78N110n15SI47/79O111o16DLE48080P112p17DC149181Q113q18DC250282R114r19DC351383S115s20DC452484T116t21NAK53585U117u22SYN54686V118v23ETB55787W119w24CAN56888X120x25EM57989Y121y26SUB58:90Z122z27ESC59;91[123{28FS60<92\124|29GS61=93]125}30RS62>94^126~31US63?95_127自实现打印#include<stdio.h>#include<stdio.h>intmain(void){unsignedchara;//用有符号来打印,则容易溢出for(a=0;a<128;a++){printf("%d-->%c\t\t",a,a);if(a%8==0)printf("\n");}return0;}打印结果转义字符另外一个别的意义。转意字符常起到控制的作用。转义字符及其意义字符意义ASCII值备注\b退格(BS)当前位置向后回退一个字符8转义后,值发生了改变,通常在0-32以内表示控制字符。\r回车(CR),将当前位置移至本行开头13\n换行(LF),将当前位置移至下一行开头10\t水平制表(HT),跳到下一个TAB位置9\0用于表示字符串的结束标记0用作字符串结束标志\\代表一个反斜线字符\92改变,解决了因被占的错误。\"代表一个双引号字符"34\'代表一个单引号字符'39%%代表一个百分号%37\ddd1到3位八进制所代表的任意字符八进制数制可表示任意的字符。注意跟后续字符沾连的问题。\xhh1到2位十六进制所代表的任意字符十六进制数值案例:#include<stdio.h>#include<stdio.h>intmain(void){#if0printf("r=%dn=%dt=%d\n",'r','n','t');printf("r=%dn=%dt=%d\n",'\r','\n','\t');printf("\r=%d\n=%d\t=%d\n",'\r','\n','\t');printf("\\r=%d\\n=%d\\t=%d\n",'\r','\n','\t');printf("aaaaaaa\rbbbbbbbbbbbb\n");//回车覆盖printf("aaaaaaa\r\nbbbbbbbbbbbb\n");printf("aaaaaaa\nbbbbbbbbbbbb\n");printf("mmmmmmm\tgggggggggggggg");#endifprintf("ilikefootball\n"); //ilike"football"// printf("ilike"football"");printf("ilike\"football\"\n");printf("thisisliming\'book\n");printf("therateis%d%%\n",95);printf("aaaaaaaaaaaaa\xdbbbbbbbbbbbbbb\n");printf("aaaaaaaaaaaaa\xdbbbbbbbbbbbbbb\n");printf("aaaaaaaaaaaaa\xd\bbbbbbbbbbbbbb\n");printf("ilike\x22football\x22\n"); //ilike"football"printf("ilike\x22\bfootball\x22\n");return0;}charcharchabcd';//编译亦可以通过常量(Constant)常量是程序中不可改变的量,常以字面量(Literal),或者宏(Macro)的方式出现。主要用于赋值或是参与计算,并且常量也是用类型的。#include<stdio.h>#include<stdio.h>#definePI3.1425926#definePRICE200intmain(void){inta=50;return0;}常量类型整型常量整型常量有三种表形式十进制表示:00(0开头的数字串会被解释成八进制数,后缀'l或'L表示长整型,'u或'U表示无符号数。例:345 31684 0 -23456 459L 356l 56789u 567LU八进制表示:以数字0开头的一个连续数字序列,序列中只能有0-7这八个数字。例:045 -076 06745l 0177777u十六进制表示:0X0x0-9A-Fa-f这些数字a、b、c、d、e、f10、11、12、13、14、15,大小写均可。例:0x10 0X255 0xd4ef 0X6a7bL实型常量实型常量有两种表示形式:1小数形式。由数字和小数点组成,必须有小数点。例:4.23、0.15、.56、78.、0.0指数形式:以幂的形式表示,以字母e或E后跟一个以10为底的幂数。eE之前后必须要有数字。eEeE的前后及数字之间不得有空格。double型,后缀为“f”或“Ffloat型,后缀“l”或“L”longdouble型。例:2.3e 500e-2.5 .5E3 4.5e0 34.2f .5F 12.56L 2.5E3L请问有哪些不合法呢?字符常量字符常量的表现形式比较简单。以单引号引起来的一个字符。例:'a' 'b' 'c'字符串常量字符串常量的表现形式比较简单。以单引号引起来的一串字符。例:"a" "abcdefg"常量的大小默认的整型常量是int类型,默认的实型是double类型。intmain(void)intmain(void){printf("const sizeof(0.0)=%d\n",sizeof(0.0));//doubleprintf("const sizeof(0.0f)=%d\n",sizeof(0.0f));//0.0Ffloatprintf("const sizeof(0.0L)=%d\n",sizeof(0.0L));//0.0llongdoubleprintf("const sizeof(0) =%d\n",sizeof(0));//intprintf("const sizeof(0l) =%d\n",sizeof(0l));//longprintf("const sizeof(0ll)=%d\n",sizeof(0ll));//longlong//常量背后,背的标识,多数是为了节省空间printf("const sizeof(0ll)=%d\n",sizeof(2147483648));//0x7fffffff不同平台实现略用差异printf("const sizeof(0ll)=%d\n",sizeof(2147483648u));return0;}格式输入与输出printf基本使用介绍printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。printf函数调用的一般形式:printf(“格式控制字符串“,输出表列);%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:“%d“表示按十进制整型输出。“%f“表示按实型数据输出。“%c“表示按字符型输出等。非格式字符串原样输出,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。格式串形式:“%[标志][输出最小宽度][.精度][长度]类型”类型:类型字符用以表示输出数据的类型,其格式符和意义如下表所示:类型语义Exampled/i有符号10进制整型392u无符号10进制整型7235o无符号8进制整型610x无符号16进制整型7faX无符号16进制整型(大写)7FAf单精度浮点型392.65e科学计数e3.9265e+2E科学计数E3.9265E+2g%eor%f的缩短版392.65G%Eor%F的缩短版392.65c字符as字符串samplep地址b8000000宽度:0。标志:标志意义-左对齐;默认右对齐+当一个数为正数时,前面加上一个+号,默认不显示0右对齐时,用0填充左边未使用的列;默认用空格填充空格输出值为正时冠以空格,为负时冠以负号#对c、s、d、u类无影响对o类,在输出时加前缀o对x类,在输出时加前缀0x精度:精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则长度:lengthdiuoxXfFeEgGacsp(none)intunsignedintfloat/doubleintchar*void*hhsignedcharunsignedcharhshortintunsignedshortintllongintunsignedlongint\hwint_twchar_t*lllonglongintunsignedlonglongintLlongdouble示例:#include<stdio.h>#include<stdio.h>intmain(void)intmain(void){intvar=1234;printf("%d\n",var);printf("%d%%\n",var);printf("%o\n",var);printf("%x\n",var);printf("=============\n");printf("%d\n",var);printf("%#o\n",var);printf("%#x\n",var);//0开头//0xprintf("%d\n",var);printf("%d%%\n",var);printf("%o\n",var);printf("%x\n",var);printf("=============\n");printf("%d\n",var);printf("%#o\n",var);printf("%#x\n",var);//0开头//0x开头printf("=============\n");printf("%10d\n",var);printf("%010d\n",var); //printf("%1d\n",var);printf("%-10d\n",var); //左对齐printf("=============\n");printf("%+d\n",var);var=-var;printf("%+d\n",var);//显示正负号printf("=============\n");var=-1;printf("%d\n",var);printf("%u\n",var);//很大很大的数哟printf("=============\n");//////////////////////////////charc='\x41';printf("%c\n",c);printf("%d\n",c);printf("%x\n",c);printf("%#x\n",c);printf("%#x\n",c);printf("=============\n");//////////////////////////////float f=123.4567;printf("%f\n",f);printf("%7.2f\n",f);printf("%-7.2f\n",f);printf("%e\n",f);printf("%g\n",f);printf("=============\n");/////////////////////////////shorta=32;longintb=64;longdoublecd=100.001;printf("%hd\n",a);printf("%ld\n",b);printf("%Lf\n",cd);//32位机下支持并不好,64适用return0;}scanf基本使用介绍scanf函数的一般形式为:scanf(scanf(“格式控制字符串”,地址表列);printf地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。例如:&a、&b分别表示变量a和变量b的地址。a、bC语言中,使用了C格式串格式字符串的一般形式为:%[*][输入数据宽度][长度]类型其中有方括号[]的项为任选项。各项的意义如下。类型:格式字符意义d输入十进制整数o输入八进制整数x输入十六进制整数u输入无符号十进制整数f输入实型数c输入单个字符s输入字符串* :用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。宽度:长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf),h表示输入短整型数据。注意事项:1,待输入变量,必是以其地址的方式呈现。2,除格式字符,空格,回车,Tab外,其它需要原样输入。3,空格,Tab,回车,均可作为输入间隔,以回车作为结束。4,scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。5,在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。6,如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。#include<stdio.h>#include<stdio.h>intmain(void){// inta=1,b=2,c=3;// scanf("%d%d%d",&a,&b,&c);// printf("a=%d b=%d c=%d\n",a,b,c);// scanf("%d%*d%d",&a,&b,&c);//忽略缓冲区中间的输入//// chara=1,b=2,c=3;// scanf("a=%c,b=%c,c=%c",&a,&b,&c);// printf("a=%c b=%c c=%c\n",a,b,c);floatvar;scanf("%d",&var); return0;}printf("a=%c b=%c c=%c\n",a,b,c);%c,%c",&a,&b,&c);scanf("%c,////// chara=1,b=2,c=3;// scanf("%c%c%c",&a,&b,&c);// printf("a=%c b=%c c=%c\n",a,b,c);// scanf("%4d%4d",&a,&b);// printf("a=%d b=%d\n",a,b);// scanf("%5d",&a);// printf("a=%d\n",a);// printf("a=%d b=%d c=%d\n",a,b,c);putchar&&getcharintputchar(intcharacter);向屏幕输出一个字符intputchar(intcharacter);向屏幕输出一个字符intgetcharvoid 从键盘获得一个字符#include<stdio.h>intmain(void){charch;printf("plsinputachar:");putchar(10);ch=getchar();putchar(ch);rreturn0;}输入输出缓冲类型转化(TypeCast)隐式转化不需要人为参与溢出,截断和有无符号c提高,会有更为详细的介绍。算术转化整形提升:charshortint等类型在一起运算时,首先提升到int。这种现象叫作整型提升。混合提升:在进行运算时,以表达式中最长类型为主,将其他类型位据均转换成该类型,如:(1)若运算中最大范围为double,则转化为double。(10308)(2)若运算中最大范围为float则转化为float。(1038)(3)若运算中最大范围为longlong则转化为longlong。(264)(4)若运算中最大范围为int则转化为int。(232)(5)若运算中有charshort则一并转化为int。(28216232)#include<stdio.h>intmain(void)#include<stdio.h>intmain(void){chara;shortb;intc;longlongd;floate;doublef;printf("sizeof(a)=%d\n",sizeof(a));printf("sizeof(b)=%d\n",sizeof(b));printf("sizeof(c)=%d\n",sizeof(c));printf("sizeof(a+b)=%d\n",sizeof(a+b));printf("sizeof(a+c)=%d\n",sizeof(a+c));printf("sizeof(b+c)=%d\n",sizeof(b+c));printf("sizeof(d)=%d\n",sizeof(d));printf("sizeof(a+d)=%d\n",sizeof(a+d));c=3;e=5.6;c=3;e=5.6;printf("%f\n",c+e);//%dintfloat了。e=10.0;printf("%f\n",e/c);//int->floatprintf("sizeof(a)=%d\n",sizeof(a));printf("sizeof(a)=%d\n",sizeof(f));printf("sizeof(d+e)=%d\n",sizeof(d+e));//4printf("sizeof(a+f)=%d\n",sizeof(a+f));//8return0;}赋值转化整型和实型之间是可以相互赋值的。赋值的原则是,一个是加零,一个是去小数位。#include<stdio.h>#include<stdio.h>intmain(void){inta=5; floatb=10.5;intaa=5;floatbb=10.5;a=b;printf("a=%d\n",a);bb=aa;printf("bb=%f\n",bb);return0;}隐式转化规则高低doublefloatlonglonglongintcharshort强制转化格式:(类型)待转表达式#include<stdio.h>#include<stdio.h>intmain(void){inta=3;intb=10;// floatc=b/a;// printf("%f\n",c); //3.3的时候floatc=(float)b/a;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年重庆市巫溪县数学中考三模
- 医疗笔试试题及答案
- 急性心梗考试题及答案
- 洁净服管理规程
- 水泥厂能耗降低办法
- 某家具厂工艺改进准则
- 生成式大模型项目实战教案 项目7 实现 AIGC 视频工业化-数字人创作与智影平台全链路解析
- 202暑假培训机构代课教师短期聘用协议三篇
- 安徽省2026八年级数学下册第17章一元二次方程及其应用17.4一元二次方程的根与系数的关系课件新版沪科版
- 2026年农资门店安全管理试题及答案
- 混凝土养护委托协议书
- 雨课堂在线学堂《马克思与当代欧陆思想》单元考核测试答案
- 安全工伤培训总结课件
- 山东省潍坊市2024-2025学年高二下学期期末考试政治试题(含答案)
- 2025年1月国家开放大学汉语言文学本科《外国文学专题》期末纸质考试试题及答案
- 轧钢机械装备及其智能化技术 课件 第7章 剪切机
- 04S520埋地塑料排水管道施工标准图集
- 锅炉更换烟管安装施工方案
- 安徽大学《数据结构与算法》2023-2024学年第一学期期末试卷
- 中建企业定额数据库(劳务分包库)
- 四川省成都市第十一中学2024-2025学年高一上学期入学分班质量检测数学试题(原卷版)
评论
0/150
提交评论