




已阅读5页,还剩91页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程序设计 问题 如果需要处理1名学生的10门课程的成绩 用什么来存储这些数据 方法一 定义10个变量 每个变量中存放1门成绩 方法二 定义一个可以存储10门成绩一维数组 变量 杯子 一个变量只能存放一个数据 数组 带多个杯子的托盘 一个数组可以存放多个数据 数轴上的一维向量x 1 2 2 1 0 3 就相当于一维数组 直角坐标系中的矩阵就相当于二维数组 4 1一维数组4 2二维数组4 3字符数组 一维数组定义格式 类型说明符数组名 整型常量表达式 例如 inta 10 就定义了一个包含10个整型元素的数组a 它的内存大小可以存放10个整型数据 4 1 1一维数组的定义 类型说明符数组名 整型常量表达式 int char等都可以 说明此数组中每个元素都属于此类型 命名规则与变量一致不能和其他变量重名 指定元素的个数 最小为0 不能是变量 defineN3inta N inta 3 5 inta 1 5 intn scanf d n inta n inta inta 3 inta b 3 intn 3 inta n 例4 1 判断以下数组定义是否合法 并说明原因 1 inta 2 5 2 inta 3 3 inti 3 4 inti inta i scanf d 4 1 2一维数组元素的引用 一维数组引用格式 数组名 下标 a 0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 注意 1 数组必须先定义 再使用 2 只能逐个引用数组元素 不能一次引用整个数组 例如 inta 10 可以使用a 0 a 1 a 9 若有a 1 或者a 10 1 出错 a 10 不代表整个数组 它是下标为10的元素 越界 1 3 下标可以是常量或变量 它表示元素的序号 例如 inti 3 a 10 a i 1 表示给下标为3的元素赋值为1 4 一维数组在内存中连续存放 先存放下标为0的元素 再存放下标为1的元素 依次直至存放完所有元素 例4 2 定义一个包含3个整型元素的数组a 输出其元素值 只定义数组 不给数组元素赋值 数组元素中存放的是随机值 一般要先给数组元素赋值 再使用 数组名a中存放的是数组起始元素的地址 例4 3 定义一个包含3个整型元素的数组a 从键盘给数组元素输入值 然后输出 例4 4 定义一个包含10个整型元素的数组a 从键盘给数组元素输入值 然后输出 4 1 3一维数组的初始化 定义一维数组的同时给数组元素赋初值称为一维数组的初始化 其一般格式为 类型说明符数组名 N 初值1 初值2 初值N 其中 N是表示数组元素个数的常量 一维数组的初始化方式有以下几种 1 全部元素初始化 chara 3 1 2 n intb 5 2 11 3 14 5 intb 2 11 3 14 5 intb 4 2 11 3 14 5 在对数组的所有元素赋初值时 可以不指定数组长度 系统自动定义其长度为5 初值个数不能超过数组长度 否则 会出现语法错误 2 全部元素初始化 inta 10 0 1 2 chara 10 1 2 3 全部元素初始化为0 inta 10 0 将a 0 a 2 依次初始化为0 1 2 未赋值的元素a 3 a 9 值全部被初始化为int中表示假的值0 将元素a 0 a 9 全部初始化为0 将a 0 a 1 依次初始化为 0 1 未赋值的元素a 2 a 9 值全部被初始化为char中表示假的值 0 若想全部初始化为1inta 10 1 错误 例4 5 定义一个含有10个元素的整型一维数组并全部初始化 将数组中所有元素逆序输出 例4 6 用冒泡法对5个数排序 解 冒泡排序过程如后面图所示 其中 红圈以内为已排好序的记录 规则 令相邻位置的数依次比较 若上面的数大 则交换 4 1 4 1 3 5 2 4 1交换 4 3交换 3 4 5不交换 5 2 5 2交换 1 1 3不交换 3 4 3 4不交换 2 4 2交换 5 1 3 2 4 5 1 3不交换 3 2交换 1 2 3 4 5 1 2不交换 结果1 2 3 4 5 R 第0趟 第1趟 第2趟 第3趟 第0次 第1次 第2次 第3次 for i 0 iR j 1 的值 则交换j增1for j 0 j 4 i j 内循环如果 R j 的值 R j 1 的值 则不交换j增1 冒泡算法逻辑过程 i j i 0 j 1 比较R j 和R j 1 的大小inttemp 定义新的存储单元如果 R 1 的值 R 2 的值 tempR 1 R 1 R 2 R 2 temp j增加1 比较R j 和R j 1 的大小如果 R j 的值 R j 1 的值 j增加1 比较R j 和R j 1 的大小 实现交换 R 1 R 2 4 3 temp 2 交换过程与核心程序 4 3 4 inti intj for i 0 i 3 i for j 0 j 3 i j inttemp if R j 的大小 R j 1 的大小 tempR j R j R j 1 R j 1 temp 3 循环与核心程序的组合 inti j 类型一样 合并在一起 外循环 将处理5个数推广到处理n个数 for i 0 i n 2 i 内循环 for j 0 j n i 2 j 定义新的存储空间 置前 防止重复定义 inttemp 比较大小判断是否满足交换条件 if R j R j 1 满足交换条件 则交换 在程序中将赋值箭头转换为赋值等号 temp R j R j R j 1 R j 1 temp 标出交换的起始位置 标出内循环的起始位置 标出外循环的起始位置 4 冒泡算法整理 inti j 定义int类型的变量i jinttemp 定义新的存储单元tempfor i 0 iR j 1 比较数组R 中相邻元素值的大小 开始交换temp R j 先将R j 中的值赋给tempR j R j 1 再将R j 1 中的值赋给R j R j 1 temp 最后又把temp中的值赋给R j 1 结束交换 内循环for2结束 外循环for1结束 经过n 1 4次循环 完成排序功能 5 冒泡算法真实程序 6 优化推广程序 改进的冒泡排序算法 例如 待排序的数组元素为 3 1 2 5 4 3 1 3 1 2 4 5 3 1交换 3 2交换 2 2 4不交换 4 5 1 1 3不交换 2 3 3 4不交换 4 5 4 5不交换 1 2不交换 结果1 2 3 4 5 R i 0 i 1 j 0 j 1 j 2 j 3 设置一个标识量 若某趟中一次交换也没有进行 设置标识量的值 代表数据已完全排好 不需要进行后面的排序 例4 7 改进冒泡排序算法 例4 8 从键盘输入10个学生成绩 计算出平均成绩 并输出高于平均分的学生成绩 例 求fibonacci数列的前20项 并输出 fibonacci 1 1 2 3 5 8 13 21 4 1一维数组4 2二维数组4 3字符数组 问题 如果需要处理3名学生的期末成绩 每名学生有4门课程的成绩 用什么来存储这些数据 方法一 定义12个变量 每个变量存储1个学生的1门课程成绩 方法二 为3名学生各定义3个数组 每个数组可以存放4门成绩 方法三 用一个3行4列的二维数组来存储 4 2 1二维数组的定义 1 格式 类型说明符数组名 常量表达式M 常量表达式N 例 floata 3 4 012 0123 M和N只能是正整数 例 floata 3 4 2 二维数组可以看成是由一维数组组成的 3 二维数组在内存中连续存放 先顺序存放第一行的元素 再存放第二行的元素 依次直至存放完所有元素 4 2 2二维数组的引用 引用格式 数组名 行下标 列下标 例 inta 2 3 a 0 0 a 0 1 a 0 2 a 1 0 a 1 1 a 1 2 常出现的错误 下标越界 a 2 3 3 应为a 1 2 3 4 2 3二维数组的初始化 1 分行赋初值 例 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 123456789101112 2 全部数据写在一个花括号内 按数组排列的顺序对各元素赋初值 例 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 赋初值时 数组的行下标可以省略 例如 inta 4 3 对部分元素赋初值 1 inta 3 4 0 1 2 012000000000功能 仅对a 0 0 a 0 1 a 0 2 赋值 其余为0 2 inta 3 4 1 5 6 9 100056009000功能 仅对a 0 0 a 1 0 a 1 1 a 2 0 赋值 其余为0 例4 9 求一个3 4矩阵的最大值及其所在行列下标 例4 10 3名学生各有4门课程的成绩 计算每个学生的平均成绩 例4 11 打印输出杨辉三角形 输出前10行 多维数组定义格式 类型数组名 常量表达式1 常量表达式2 例 inta 3 3 3 注意 多维数组的元素在内存中的排列顺序是按行存放 引用格式 数组名 下标 下标 例 a 0 0 0 100 a 0 1 2 20 a 2 2 2 50 一个n维数组可以看成由多个n 1维数组构成 4 1一维数组4 2二维数组4 3字符数组 在程序中如果要存储姓名 地址等类型的数据 例如 小明 成都市高新西区西园大道1号 等需要使用什么样的类型呢 这些是字符串 C语言中没有专门的字符串变量 如果要存储字符串 需要用到字符数组 字符数组是专门用来存放字符数据的 字符数组中的一个元素存放一个字符 4 3 1字符数组 字符数组中可以存储普通字符序列 也可以存储字符串 两者依据字符数组末尾是否有字符串结束符 0 来区分 例如 1 charc 11 Iamhappy 或charc Iamhappy 2 charc 11 Iamhappy 或charc Iamhappy 3 charc 11 I a m h a p p y 0 或charc I a m h a p p y 0 4 charc 11 I a m h a p p y 这四种方式 字符数组c存储的是字符串 5 charc 10 I a m h a p p y 或charc I a m h a p p y 这种方式 字符数组c存储的是普通字符序列 若要重新给字符数组 字符串变量 赋值 使它改而存放别的字符串 应注意以下几点 1 应充分估计新字符串所需的最大空间 不要出现越界情况 例如 charc fish 数组c的长度是5 若要将 chicken 赋给c 新字符串需要8个字节的内存空间 就会出错 为了防止这类的错误发生 习惯上将字符数组长度设置大一些 例如 charc 20 fish 2 不能使用赋值语句对字符串变量集体赋值 而应该使用赋值语句为每个字符数组元素单独赋值 例如 charc fish 若要将数组c的内容修改为 cat 直接写为 c cat 或者c cat 都是错误的 可以对c中的元素逐个重新赋值 c 0 c c 1 a c 2 t c 3 0 注意 不要省略给c 3 赋值为 0 否则c中新的字符串内容为 cath 4 3 2字符数组的输入输出 一 使用scanf函数输入字符串到字符数组中 1 以单个字符的格式逐个输入 例如 charc 5 scanf c c c c c 数组元素跟普通变量一样 前面要加取地址符 2 以字符串的格式输入 例如 charc 5 scanf s c 说明 1 s 是字符串的格式字符 数组名代表数组的起始地址 因此输入表列中只需要给出数组名即可 若写为 c 程序出错 2 输入字符串时 空格或者回车键是输入结束符 不能作为有效的字符输入 假如从键盘输入cat 或者cat 数组c中存入cat后 C编译系统会自动在后面补上一个 0 3 输入的字符串长度应该比字符数组的长度短 例如 从键盘输入catcat 数组c中存入catca 没有 0 的位置 容易出现内存错误 4 可以用scanf输入多个字符串 输入时以空格键或回车键隔开 例如 charc1 5 c2 5 c3 5 scanf s s s c1 c2 c3 从键盘输入Cat or dog 二 使用printf函数将字符数组中的字符串输出 1 以单个字符的格式逐个输出 例如 charc 5 printf c c c c c c 0 c 1 c 2 c 3 c 4 2 以字符串的格式输出 将数组名写在输出表列中 例如 charc 5 printf s c 注意 1 若数组长度大于字符串的实际长度 也只输出到遇到 0 结束 例如 charc 10 China printf s c 2 如果一个字符数组中包含一个以上 0 则遇第一个 0 时输出就结束 例4 12 删除字符串中的空格 并输出 三 使用scanf和printf为二维数组输入输出字符串二维数组可看作由一维数组组成 如果将一维字符数组看作是存放字符串的变量 那么二维字符数组就可以看作是存放字符串的一维字符串数组 例如 定义charc 3 5 相当于定义了3个字符串变量 c 0 c 1 c 2 分别是3个字符串的起始地址 可以使用scanf和printf函数为其输入 输出字符串 例4 13 利用二维字符数组输入 输出字符串 例 输出一个菱形图 4 3 3字符串处理函数 C语言提供了多个常用的字符串处理函数 字符串输入函数 输出函数 比较函数 连接函数及求字符串长度等函数 注意 字符串函数均在头文件string h中定义 要使用这些函数 需将此文件包含进来 有的编译器会自动包含 1 字符串输出函数puts 格式 puts 字符串 功能 将字符串结束符 0 转换成 n 后输出字符串 例如 charc 6 China 执行函数 puts c 等价于 printf s n c puts函数也可以直接输出字符串常量 例如 puts China 2 字符串输入函数gets 格式 gets 字符数组 功能 从键盘输入一个字符串到字符数组中 例如 chars 10 执行函数 gets s 从键盘输入 China 将包括 0 在内的6个字符送到字符数组s中 gets puts与scanf printf函数的使用区别 1 gets puts 函数一次只能输入输出一个字符串 scanf printf 则可以输入输出多个字符串 例如 chars1 10 s2 10 1 gets s1 gets s2 puts s1 puts s2 2 scanf s s s1 s2 printf s n s n s1 s2 2 使用gets函数输入的字符串以回车符结束 而scanf函数以空格或回车符结束字符串的输入 例如 chars1 30 s2 30 从键盘输入HELLOWORLD 1 执行gets s1 gets s2 执行结果 s1中存入字符串 HELLOWORLD 光标等待用户再次输入字符串 从键盘输入helloworld s2中获得字符串 helloworld 例如 chars1 30 s2 30 从键盘输入HELLOWORLD 2 执行scanf s s s1 s2 执行结果 s1中存入字符串 HELLO s2中存入字符串 WORLD 3 字符串连接函数strcat 格式 strcat 字符数组1 字符数组2或字符串 功能 把字符数组2中的字符串连接到字符数组1中的字符串的后面 结果放到字符数组1中 注意 1 数组1必须足够大 以容纳连接后的新字符串 2 连接时串1后面的 0 被覆盖 只在新串后保留1个 0 字符数组2可为字符串常量 1呢 例如 chars 10 te strcat s st 执行过程中数组s的存储情况 例4 14 使用strcat函数实现两个字符串连接的功能 例4 15 不使用strcat函数实现两个字符串连接的功能 4 字符串复制函数strcpy 格式 strcpy 字符数组1 字符数组2或字符串 功能 将字符串2复制到字符数组1中 该字符数组1中原有内容被覆盖 说明 1 字符数组1必须足够大 能容纳复制过来的字符串 2 复制时连同 0 一起复制到字符数组1中 3 不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组 例如 charstr1 30 China str2 30 str2 str1 4 可以用strncpy函数将字符串2中的前n个字符复制到字符数组中 字符数组其他位置的元素不发生变换 例如 charstr1 30 Chengdu charstr2 30 Beijing strncpy str1 str2 2 执行结果 str1为Beengdu 例4 16 使用strcpy函数实现字符串的拷贝 例4 17 不使用strcpy函数实现字符串的拷贝 5 字符串比较函数strcmp 格式 strcmp 字符串1 字符串2 功能 比较 字符串1 和 字符串2 比较规则 自左至右逐个字符比较ASCII码 直到遇到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 面试必 备:主题演讲面试题目及答案精 编
- 2022年青少年法律意识法制教育专题
- zcs随堂2市公开课金奖市赛课一等奖课件
- 知识题库-降碳低碳知识竞赛试题及答案
- 北师大课标七年级数学下册平方差公式学习教案
- 西医能量合剂组方解读
- 高级面试指导:代驾面试题目精 编衍生题库
- 经济管理知识挑战:贵州经贸面试题目及答案解读与提升策略
- 体育游戏概念讲解
- 企业员工培训汇报
- 《福州智慧水利建设项目技术规范书(定稿)》
- 《胸腔引流管的护理》课件
- 医院窗帘、隔帘采购 投标方案(技术方案)
- 2024-2025学年江苏省苏州市星海实验中学高一(上)期中考试物理试卷(含答案)
- 《QC小组培训》课件
- 2024年海南省中考道德与法治试题卷(含答案解析)
- 糖尿病健康宣教五架马车
- 【标准】城市森林碳汇计量监测技术规程
- 超市货架油漆翻新协议样本
- 江西省吉安市2024-2025学年高二地理下学期期末考试试题
- 顽童变成小书迷(2023年吉林长春中考语文试卷记叙文阅读题及答案)
评论
0/150
提交评论