C语言程序设计教程(二)ppt.ppt_第1页
C语言程序设计教程(二)ppt.ppt_第2页
C语言程序设计教程(二)ppt.ppt_第3页
C语言程序设计教程(二)ppt.ppt_第4页
C语言程序设计教程(二)ppt.ppt_第5页
已阅读5页,还剩286页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计教程 二 第5章循环结构第6章数组第7章函数 第5章循环结构 循环结构与顺序结构 选择结构一起构成了解决各种复杂程序设计的基础 它主要用于处理那些需要重复执行的操作 相对于程序设计的三种结构 循环结构是最难掌握的 同时 它也是最重要的 C语言中构成循环结构的语句有三类 while循环 do while循环和for循环 通过本章学习 应掌握三类循环结构及其综合应用 强化循环的程序设计思想 5 1问题的提出 在许多问题中需要用到循环结构 我们先看两个实际问题 第一个问题是打印如图5 1所示图案 另外一个问题是计算从键盘输入n的阶乘 先不考虑溢出问题 图5 1菱形图案 5 1问题的提出 续 看到第一个问题 很多初学者觉得这个问题很简单 只要学习过printf语句 就能写出程序 includevoidmain printf n printf n printf n printf n printf n printf n printf n printf n printf n 5 1问题的提出 续 很显然 这个程序完全能够完成题目的要求 同时也能看出程序设计员没有利用循环结构 如果再按照相应的规律增加几十行 甚至几百行的话 那么又应该如何写此程序呢 第二个问题如果再不使用循环结构的话就不能完成了 因为在程序执行之前 程序员本身并不知道用户输入的n的值到底是多少 类似的问题应该如何解决呢 学习完本章的内容后 回头再来看这些问题 如果能熟练掌握循环结构程序设计思想的话 这些问题将迎刃而解 常用的循环语句包括三类 while循环 do while循环和for循环 5 2while循环结构 while语句是循环结构结构程序中很常用的语句 该语句通常用于构成 当型 循环结构 5 2 1while语句的基本形式 while语句的一般形式为 while 表达式 循环体语句 其执行过程为 先计算表达式的值 如果表达式的值为 真 非0 则执行循环体语句 同时修改相应的变量后 再计算表达式 重复该过程 直到表达式的值为 假 0 时退出循环 5 2 2while语句的应用 例5 1编程实现 从键盘输入n 计算n 本例不考虑溢出问题 分析 先从键盘输入n 先判断n是否大于0 若小于0则提示用户正确输入 若等于0或1 则输出结果为1 若大于1则利用公式计算n 的值 然后输出即可 程序代码如下 includevoidmain intn inti 1 sum 1 printf Pleaseinputanumber scanf d 5 2 2while语句的应用 续 if n1 while i n sum i i printf Theresultofn is d n sum 5 2 2while语句的应用 续 运行结果 Pleaseinputanumber 4 Error Enteragain 0 Theresultofn is1Pleaseinputanumber 4 Theresultofn is 24 5 2 2while语句的应用 续 例5 2编程实现 将从键盘输入的一串字符显示在屏幕上 遇到字符 时终止 用while语句实现 分析 输入一个字符 判断该字符是否为终止符号 若不是终止符号则继续输入 碰到回车符号开始接收输入 碰到 结束输入 本例不能输出 请读者思考如何设计程序使得能输出 5 2 2while语句的应用 续 程序代码如下 includevoidmain charc printf Pleaseinputastringendwith n c getchar while c putchar c c getchar 5 2 2while语句的应用 续 运行结果 Pleaseinputastringendwith 456780 456780Guangxi Guangxi 5 2 2while语句的应用 续 例5 3编程实现 输入某门课程的若干名同学的成绩 以 1作为结束输入的标志 计算该门课程的平均成绩 分析 先输入一个成绩 若输入 1 直接结束 否则 使用循环结构计算总成绩 同时用计数器记录输入成绩个数 最后利用公式 平均分 总成绩 输入成绩个数 来求取平均成绩 5 2 2while语句的应用 续 程序代码如下 includevoidmain intn 0 floatsum 0 score 0 printf Pleaseinputthescoreendwith 1 scanf f 5 2 2while语句的应用 续 if score 0 while score 1 sum score scanf f 5 2 2while语句的应用 续 运行结果 Pleaseinputthescoreendwith 1 4 Noscore Pleaseinputthescoreendwith 1 90864884 1 Theaveragescoreis77 00 5 2 2while语句的应用 续 注意 1 循环体若包含一个以上的语句 则要用花括弧把这些语句括起来 以复合语句形式出现 否则 可能与程序要求不符 因为while语句的范围只到while后面的第一个分号处 例5 2中若把while c putchar c c getchar 的花括弧去掉 写成 while c putchar c c getchar 则程序显然不能完成题目要求 并且会陷入死循环 5 2 2while语句的应用 续 2 在循环体中一定要有使循环趋向结束的操作 比如 例5 1的i 和例5 3的n 语句 否则 循环将永不结束 形成死循环 3 如果循环表达式的值为 0 或者假 则循环体语句一次也不执行 例如 while 0 sum i i 由于表达式的值为0 循环体语句一次也不执行 5 2 2while语句的应用 续 4 循环表达式的值为 1 或者 永真 的时候 可以通过if语句对循环进行控制 例5 1中的语句 While i n sum i i 两个循环体能完成相同的功能 其中的break语句用于跳出循环 break语句的用法参见本章第五节 5 while循环语句的循环体中又可以包含循环语句 称为循环语句的嵌套 又称为多重循环 While 8 sum i if i n i elsebreak 可以写成 5 3do while循环结构 do while语句也是循环结构结构程序中比较常用的语句 该语句类似于 直到型 循环结构 但它的循环继续条件与 直到型 相反 5 3 1do while语句的基本形式 while语句的一般形式为 do 循环体语句 while 表达式 其执行过程为 先执行一次循环体语句 然后计算表达式的值 如果表达式的值 真 非0 则再次执行循环体 同时修改相应的变量后 再计算表达式 重复该过程 直到表达式的值为 假 0 时退出循环 5 3 2while语句的应用 例5 4编程实现 从键盘输入正整数n 计算s 1 2 3 n 用while语句实现 分析 从键盘输入正整数n 利用公式计算s 1 2 3 n 然后输出s 程序代码如下 5 3 2while语句的应用 续 includevoidmain intn inti 0 s 0 printf Pleaseinputapositiveinteger scanf d 5 3 2while语句的应用 续 运行结果 Pleaseinputapositiveinteger 100 Theresultis5050Pleaseinputapositiveinteger 999 Theresultis 499500 5 3 2while语句的应用 续 例5 5编程实现 将从键盘输入的一串字符显示在屏幕上 遇到字符 时终止 用do while语句实现 分析 输入一个字符 判断该字符是否终止符号 不是终止符号则继续输入 碰到回车符号开始接收输入 碰到 结束输入 程序代码如下 5 3 2while语句的应用 续 includevoidmain charc printf Pleaseinputastringendwith do putchar c getchar while c 5 3 2while语句的应用 续 运行结果 Pleaseinputastringendwith Guangxi Guangxi233234746767hfas 233234746767hfas 5 3 2while语句的应用 续 注意 1 和while语句类似 do while循环体内也一定要有改变循环条件的语句 使循环趋向于结束 2 为了避免编译系统把do while语句的while当成while语句中的while语句的开始 do while的循环体即使只有一个语句 也需要用花括号括起来 例5 5中的do while循环体部分可以改写成 do putchar c getchar while c 这样的循环体同时能完成和例5 5一样的功能 但是若把花括号去掉 写成 doputchar c getchar while c 则编译系统可能把while c 部分当成一个while语句进行编译 5 3 2while语句的应用 续 3 do whlie循环先执行循环体语句 后判断表达式 也就是说不管其表达式的值是否总为 假 0 其循环体语句总能够被执行 例如 while 0 do printf While n printf Do while n while 0 上例很容易看出while语句和do while语句的不同之处 while语句执行的时候是没有输出的 但是do while语句执行的时候就会输出 Do while 可以得到结论 在两者有相同循环体的情况下 当while后面的表达式的第一次为 真 时 两个循环体得到的结果相同 否则 二者结果不同 4 do while循环语句的循环体中又可以包含循环语句以实现多重循环 5 4for循环结构 在三类循环结构语句中 for语句使用最为灵活 不仅可以用于循环次数已经确定的情况 而且也可以用于循环次数不确定而只给出循环结束条件的情况 它完全可以代替while语句 5 4 1for语句的基本形式 for语句的一般形式为 for 表达式1 表达式2 表达式3 语句 其执行过程为 先计算表达式1的值 再计算表达式2的值 同时判断表达式2的值 若为 假 0 循环结束 退出for语句循环 执行for语句下面的一条语句 若为 真 非0 则执行循环体中的语句 计算表达式3的值 然后再去计算表达式2的值 重复该过程 直到表达式2的值为 假 0 时退出循环语句 5 4 1for语句的基本形式 续 由流程图很容易得到结论 for语句实际上等价于下面的while语句 表达式1 While 表达式2 语句 表达式3 5 4 2for语句的应用 for语句在使用上比较灵活 表达式1可以放在循环语句前 表达式2可以放在循环体内 这时等价于表达式2的值为 真 非0 表达式3可放在循环体的后面 于是将会出现for语句的不同形式 如例5 6所示 例5 6编程实现 从键盘输入正整数n 计算s 1 2 3 n 用for语句实现 分析 从键盘输入正整数n 利用公式计算s 1 2 3 n 然后输出s 5 4 2for语句的应用 续 程序代码如下 includevoidmain charc printf Pleaseinputastringendwith do putchar c getchar while c 5 4 2for语句的应用 续 类似的程序代码形式有如下几种 第一种 includevoidmain intn inti s printf Pleaseinputapositiveinteger scanf d 此例是将循环体放入表达式 中 即循环体语句为空 注意 不能将for语句循环后的 去掉 5 4 2for语句的应用 续 第二种 includevoidmain intn inti 1 s 0 printf Pleaseinputapositiveinteger scanf d 此例是将表达式 放入循环体中 5 4 2for语句的应用 续 第三种 includevoidmain intn inti 1 s 0 printf Pleaseinputapositiveinteger scanf d 此例是用if语句来判断是否停止循环 5 4 2for语句的应用 续 第四种 includevoidmain intn inti 1 s 0 printf Pleaseinputapositiveinteger scanf d 5 4 2for语句的应用 续 运行结果 Pleaseinputapositiveinteger 100 Theresultis5050 Pleaseinputapositiveinteger 999 Theresultis 499500 5 4 2for语句的应用 续 例5 7编程解决猴子吃桃问题 猴子吃桃问题的描述 猴子第一天摘下若干个桃子 当即吃了一半 还不过瘾 又多吃了一个 第二天又将剩下的桃子吃掉了一半 又多吃了一个 以后每天将前一天剩下的桃子吃掉一半 再多吃一个 直到第十天只剩下一个桃子了 求第一天共摘了多少个桃子 分析 依照题目意思有容易知道 第十天剩下一个桃子 假设为x 第九天的桃子就是2 x 1 第八天的桃子就是2 2 x 1 1 依次类推 可以得到最后的值 并输出即可 5 4 2for语句的应用 续 程序代码如下 includevoidmain inti x 1 for i 1 i 10 i x 2 x 1 printf Totalis d n x 运行结果 Totalis1534 5 4 2for语句的应用 续 例5 8编程实现 从键盘输入一批非零整数 以0为终止符 输出这批数字中的最大值 分析 从键盘输入一批整数 利用max变量存放当前最大的整数 先把第一个变量作为最大值赋值给max 以后每输入一个数先和max比较 若比max大则直接赋值给max 使得max值总是最大 直到输入0结束 输出max即可 5 4 2for语句的应用 续 程序代码如下 includevoidmain intn max printf Pleaseinputnumbers lastoneis0 scanf d 5 4 2for语句的应用 续 运行结果 Pleaseinputnumbers lastoneis0 100 3234589730 Maxis100注意 1 关键字for后面括号里的三个表达式都可以省略 但是其中的两个 不能省略 否则 系统会报错 2 如果表达式1被省略 则应该在for语句之前给变量赋初值 例如inti 1 s 0 for i n i s i 5 4 2for语句的应用 续 3 如果表达式2被省略 则for循环语句将会无限循环 只有在循环体内加上退出循环的语句才有意义 通常加入语句 if 表达式 break 该if语句表示当满足某条件时 也就是说表达式的值为 真 非0 执行break语句 退出该重循环 4 如果表达式3被省略 则程序员可以把表达式3的内容加到循环体内 以保证循环能够正常结束 5 4 2for语句的应用 续 例如 inti 1 s 0 for i 1 i n s i i 5 循环体若包含一个以上的语句 则要用花括弧把这些语句括起来 以复合语句形式出现 否则 可能与程序要求不符 6 for循环语句也可以嵌套使用 也就是在它们的循环体内可以包含另外一种循环语句 C语言提供的3类循环语句 它们既可以自身嵌套 也可以相互嵌套 5 5转向语句 break语句continue语句goto语句 5 5 1break语句 break语句的一般格式为 break 该语句的功能是退出某段程序 该语句常用于两种情况 1 用于开关语句switch的语句序列中 表示退出该开关语句 2 用于循环语句的循环体中 终止最内层循环 即跳出循环体 直接执行循环结构后面的语句 一般与if语句连用 当满足某种条件时跳出循环体 5 5 1break语句 续 例5 9编程实现 从键盘输入小于100的正整数n 找出在n 100以内的自然数中可以被13整除第一个数 分析 从键盘输入正整数n 用for语句来实现对每个数的判断 当该数能被13整除时 输出该数 然后执行break语句 结束循环 当该数不能被13整除时 先使变量增1 然后进行下一次循环操作 直到找出第一个能被13整除的数 结束循环 输出该数 5 5 1break语句 续 程序代码如下 includevoidmain inti n ints 0 printf Pleaseinputapositiveinteger scanf d 5 5 1break语句 续 运行结果 Pleaseinputapositiveinteger 1 Thefirstnumberis13 Pleaseinputapositiveinteger 45 Thefirstnumberis52 5 5 2continue语句 continue语句的一般格式为 continue 该语句的功能是结束本次循环 转到循环头去判断是否继续循环 该语句只能用在循环语句的循环体中 一般也是与if语句连用 当满足某种条件时跳出循环体 5 5 2continue语句 续 例5 10编程实现 从键盘输入小于100的正整数n 找出在n 100以内的自然数中可以被13整除的数 分析 从键盘输入正整数n 用for语句来实现对每个数的判断 当该数能被13整除时 输出该数 然后执行continue语句 结束本次循环 当该数不能被13整除时 先使变量增1 然后进行下一次循环操作 直到找出全部能被13整除的数 5 5 2continue语句 续 程序代码如下 includevoidmain inti n ints 0 printf Pleaseinputapositiveinteger scanf d 5 5 2continue语句 续 运行结果 Pleaseinputapositiveinteger 1 Thenumberis13263952657891Pleaseinputapositiveinteger 45 Thenumberis52657891 5 5 3goto语句 goto语句的一般格式为 goto语句标号 该语句是无条件转向语句 它的功能是 把程序控制转移到标号指定的语句处 使程序从指定的标号处的语句开始继续执行 goto语句和结构化程序设计思想不符 实际编程时 最好不用goto语句 只有在使用该语句确实能使程序更加简练明了的时候 可以尝试使用该语句 5 5 3goto语句 续 例5 11编程实现 从键盘输入一段自然数范围 找出该范围内能同时被13和17整除的数 如果找不到 给出相应的提示信息 分析 从键盘输入两个正整数a和b 进行比较 使得a的值总是较小的 b的值总是较大的 用for语句来实现对这两个整数中间的自然数进行判断 当该数能同时被13和17整除时 输出该数 用goto语句跳到一条输出语句 如果找完了全部的数都不能找到 则输出提示信息 调用另一条goto语句 该条goto语句是一条空语句 5 5 3goto语句 续 程序代码如下 includevoidmain inti a b temp printf Entertwopositiveinteger scanf d d 5 5 3goto语句 续 for i a i b i if i 13 0 运行结果 Entertwopositiveinteger 6534 Notfound Entertwopositiveinteger 65230 221 5 6程序应用 例5 12编程实现 求解10000 的末尾有多少个0 分析 很显然不能用连乘来求出10000 的值以后再去数它的末尾有多少个0 而是应该判断从1到10000之间有多少个因子5 因为任何一个偶数乘以5都会得到一个0 5 6程序应用 续 程序代码如下 includevoidmain inti k intcount 0 for i 5 i 10000 i 5 k i while k 5 0 count k 5 printf Thereare dzerointheendof10000 n count 5 6程序应用 续 运行结果 Thereare2499zerointheendof10000例5 13编程实现 从键盘输入两个自然数 找出这两个数的最大公约数并输出 分析 从键盘输入两个自然数a和b 进行比较 使得a的值总是较小的 b的值总是较大的 再使用辗转相除法求出两个数的最大公约数 然后输出即可 5 6程序应用 续 程序代码如下 includevoidmain inta b r temp printf Entertwopositiveinteger scanf d d 5 6程序应用 续 while r 0 a b b r r a b printf d b 运行结果 Entertwopositiveinteger 1317 gcd 13 17 1Entertwopositiveinteger 5648 gcd 56 48 8 5 6程序应用 续 例5 14编程验证 任何一个自然数n的立方都等于n个连续的奇数之和 例如 13 1 23 3 5 33 7 9 11 输入 1时程序结束 分析 从键盘输入正整数n 当n为 1的时候 程序结束 当n为自然数时循环语句去寻找等式 直到找到符合条件的等式的时候把该等式输出即可 5 6程序应用 续 程序代码如下 includevoidmain inti n a b c printf Enterapositiveintegerendwith 1 scanf d 5 6程序应用 续 for i 1 i n i c b b 2 if c n n n break elsea 2 while 1 printf d d d n n n for i 1 i n i printf d a if i n printf a 2 5 6程序应用 续 printf nEnterapositiveintegerendwith 1 scanf d 运行结果 Pleaseinputapositiveinteger 4 4 4 4 13 15 17 19Pleaseinputapositiveinteger 7 7 7 7 43 45 47 49 51 53 55Pleaseinputapositiveinteger 1 5 6程序应用 续 例5 15打印如图5 1所示图案 分析 打印一个由若干行和若干列组成的二维图形的话 需要将程序设计成一个二层循环 通常外循环的循环次数对应与图形的总行数 内循环的循环次数对应于图形每一行打印的符号的个数 本例有两种方案供参考 一种是把图案分成上下两个三角形来打印 如方案一 另一种是按照整个菱形打印 如方案二 方案一 将图形分成上下两个三角形打印 上三角形的组成规律是 第一行打印一个 第二行打印三个 第三行打印五个 第四行打印七个 第五行九个 通过在 号前打印空格的方法使得图形呈三角形形状 打印空格的个数为 第一行打印 9 1 2 4个 第二行 9 3 2 3个 第三行2个 第四行1个 5 6程序应用 续 下三角形的组成规律是 四行的 个数分别是7 5 3和1个 下三角形打印空格的个数为 第一行1个 第二行2个 第三行3个 第四行4个 程序代码如下 includevoidmain inti j k for i 1 i 5 i for j 1 j 5 i j printf for k 1 k 2 i 1 k 5 6程序应用 续 printf printf n for i 4 i 1 i for j 1 j 5 i j printf for k 1 k 2 i 1 k printf printf n 5 6程序应用 续 运行结果 5 6程序应用 续 方案二 按菱形图案打印 该方案中 图形的行数按总行数考虑 编程时要考虑两点 1 每行输出 的起始位置 也就是前面输出空格的个数 若用m表示要输出的空格个数的话 可以用公式m abs 5 i 计算m的值 其中的i为行号 其中abs 为求绝对值的数学函数 2 每行打印 的个数k可以用公式k 2 n 1来计算 第5行前 n i 第5行以后n 10 i 其中的i为行号 程序代码如下 5 6程序应用 续 include includevoidmain inti j k m n for i 1 i5 n 10 i j 2 n 1 for k 1 k m k printf for k 1 k j k printf printf n 运行结果如方案一 习题 1 写出下列程序段的运行结果 1 inti 0 j 2 while i 3 i j 2 printf i d j d n i j 2 intk 4 n 0 for n k n if n 2 0 continue k printf k d n d n k n 习题 break语句和continue语句在循环体内是否具有相同的功能 比较它们的异同之处 编程求解百钱买百鸡问题 百钱买百鸡问题 鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买百鸡 问鸡翁 母 雏各几只 有一命题 任何一个自然数都可以表示为4个整数的平方和 例如47 62 32 12 12 试编程校验该命题在400000以内的自然数范围内是否成立 编程实现 打印出所有的 水仙花数 所谓 水仙花数 是指一个3位数 其各位数字的立方和等于该数本身 例如153是一个 水仙花数 因为 习题 编程实现 输出九九乘法表 1 1 11 2 22 2 41 3 32 3 63 3 9 编程实现 读入200名学生的C语言成绩 输出成绩在60 85分之间的学生总人数 编程实现 通过计算100个矩形的面积得到函数的数值积分 其中0 x b 现有393厘米的长杆一根 要求将它截成81厘米 41厘米 29厘米的短杆若干根 要求在81厘米和41厘米两种规格各截一根的前提下 编程求解该如何截才能使得剩下的余料最短 并输出最短的余料和三种规格各截得的根数 习题 编程求3000以内的亲密数 整数A和B称为亲密数的条件为 如果整数A的全部因子 包括1 不包括A本身 之和等于B 且整数B的全部因子 包括1 不包括B本身 之和等于A 编程验证5000以内的哥德巴赫猜想 对任何大雨4的偶数都可以分解为两个素数之和 一辆汽车违反交通规则 撞人以后逃离现场 现场有三人目击现场 但都没有记住车牌号码 只记下车牌号码的一些特征 A记得牌照的前两位数字是相同的 B记得牌照的后两位数字相同 C记得四位的车牌号刚好是一个整数的平方 编程求得该四位的车牌号并输出 第6章数组 数组是C语言提供的一种常用的构造型数据类型 它是由相同数据类型的数据按照一定的顺序组织起来的集合体 在C程序设计中应用非常广泛 本章从主要讲述一维数组和二维数组的声明格式 数组元素的表示方法和数组的赋值以及数组在程序中如何应用等 6 1问题的提出 到目前为止 我们使用的都是属于基本的数据类型 即int float double char以及int和float的一些变体 的数据 尽管这些数据类型都很有用 但是它们却只能用于处理数量有限的数据 当遇到大量数据的时候我们该怎么办呢 我们先看两个实际问题 第一个问题是假设某计算机班有学生人数为30人 要编程实现录入该班学生的 C语言程序设计 课程成绩 并将成绩按照从高分到低分的次序输出 第二个问题是假设某计算机班有学生人数为30人 要编程实现录入该班每名学生的 C语言程序设计 课程成绩和 英语 课程成绩 并将成绩按照两门课程总分的成绩从高分到低分的次序输出 这两个问题都是实际生活中会碰到的问题 在日常生活中如果碰到类似问题应该如何解决呢 如果有笔和纸的话 对第一个问题 读者一定可以想到先用笔把30个学生的C成绩都记在纸上 然后先从中挑出最高分 接着再在剩下的成绩挑出最高分排在后面 如此循环到挑完为止 这个过程实际上就是个排序的过程 在编程的时候 我们先暂时不考虑排序的细节 先看如何存储这30个学生的成绩 很多初学者觉得这个问题很简单 就像声明实型变量一样声明30个实型变量 如 floata1 a2 a3 a30 如果这样可以的话 那么若某年级的500名学生的C成绩都要处理 那将需要声明500个变量 很显然 这是不可能的 第二个问题和第一个问题有相似的地方 只要能把两门课的总成绩计算出来并且用变量把它保存下来的话 问题就变的和第一个问题一样了 于是问题就转化成如何把两门课程的总成绩计算出来并把结果保存下来了 6 2数组的基本概念 数组是具有相同数据类型有序数据的集合 从概念上说 数组是一组变量 这组变量应该满足如下3个条件 1 具有相同的数据类型 2 具有相同的名字 3 在存储器中是被连续存放的 其中 每个变量称为数组的一个数组单元 保存在数据单元中的数据值称为数组元素 在不引起混淆的情况下 两者都可以简称为元素 数组名表示整个数组 每个数组在使用之前都必须先声明 6 3一维数组 只有一个下标的数组称为一维数组 一维数组是由同类型数据按照线性次序顺次排列而成的构造类型 一维数组适合处理逻辑上一维的数据结构 比如说 数学中的向量和数列等问题 6 3 1一维数组的声明 一维数组的声明形式为 数据类型数组名 数组长度 其中 数据类型说明符是C语言提供的任何一种基本数据类型或构造数据类型 数组名是用户声明的标识符 方括号中的数组长度的是一个常量或者常量表达式 其值只能是个正整数用以表示数组单元的个数 例如 intage 10 说明整型数组age 有10个元素 floatscore 30 money 35 说明单精度浮点型数组score 有30个元素 单精度浮点型数组money 有35个元素 charname 20 说明字符型数组name 有20个元素 声明数组时要注意以下四点 1 数组的数据类型声明的是每个数组元素的取值类型 也就是说 同一个数组中的元素具有相同的数据类型 2 数组名的声明要符合C语言规定中标识符的声明要求 即 只能由字母 数字和下划线三种字符组成 且第一个字符只能是字母或者下划线 3 方括号中的数组长度的是一个常量或者常量表达式 而不能是变量或者是包含变量的表达式 也不能是小数 6 3 1一维数组的声明 续 例如 程序段一 voidmain intscore 30 正确 程序段二 voidmain floatscore 3 5 错误 6 3 1一维数组的声明 续 程序段三 defineN25voidmain floatscore N number N 5 正确 程序段四 voidmain intn 20 floatscore n 错误 floatscore n 5 错误 4 在一个函数中不能出现数组名和其他的变量名同名的情况 请看下面程序段 voidmain intn 20 floatn 10 错误 6 3 2一维数组的引用 在C语言中不能一次引用整个数组 只能引用单个数组元素 一个数组元素就相当于一个变量 该数组元素的使用等同于相同数据类型的普通变量 一维数组的引用形式为 数组名 下标 其中 数组下标可以是非负整数 整型变量或整型表达式 但不能是浮点数 浮点型变量或者浮点型表达式 同时还要求下标值不能大于数组长度 1 例如 若有声明floatscore 20 则score 0 score 19 score i score n i score n 4 等都是符合C语言语法的表达式 其中i和n是整型变量 它们的取值范围为 0 i 19 4 n 23 0 n i 19 而score 1 score 8 5 等就不是合法的引用方式 6 3 2一维数组的引用 续 引用数组时需要注意以下三点 1 声明数组时 数组名后面方括号中的内容和引用数组元素时数组名后面方括号中的内容的含义是不相同的 前者为数组的长度 后者为数组元素的下标 2 数组下标可以是整型常量 变量或整型表达式 下标的取值范围是 0 数组长度 1 的整型值 3 C程序运行时编译系统并不检查数组元素的下标是否越界 需要程序员自己确保所编写的程序中没有出现数组元素下标越界的情况 例如 若有声明 floatscore 20 之后 程序员若在程序中修改或使用score 20 编译系统并不报错 对score 20 的操作实际上是对内存其他空间的操作 因此可能造成严重后果 6 3 3一维数组的初始化 一维数组的初始化就是给一维数组的元素赋初值 初始化操作既可以在声明一维数组的同时完成 也可以在数组声明之后进行 声明一维数组的同时初始化的形式为 数据类型数组名 下标 初值列表 而在声明数组之后进行初始化操作 则只能对每个数组元素一一赋值 例如 floatnum 20 i for i 0 i 20 i num i i 6 3 3一维数组的初始化 续 初始化数组时需要注意以下四点 1 花括号内各个初值之间要用逗号隔开 例如 若有 inta 3 4 6 8 则在声明数组a的同时把4 6 8依次赋给数组元素a 0 a 1 a 2 2 花括号中初值的数量必须小于等于数组长度 当初值数量小于数组长度时 数值型数组的后面没有初值的元素由系统自动赋值为0 例如 若有 inta 5 4 6 8 则在声明数组a的同时把4 6 8依次赋给数组元素a 0 a 1 a 2 而a 3 a 4 的值则为0 3 若给数组的所有元素赋初值 可以省略数组的长度 系统会根据所赋初值的个数确定数组的长度 例如 若有 inta 4 6 8 10 12 完全等价于 inta 5 4 6 8 10 12 4 C编译系统为数组分配连续的内存单元 数组元素的相对次序由下标来表示 inta 6 4 6 8 10 12 14 声明的数组a的物理存储结构如表6 1所示 a 0 a 1 a 2 a 3 a 4 a 5 6 3 4一维数组的应用 例6 1编程实现 从键盘输入若干个整数并输出所输入的整数 分析 要实现输入若干个整数 应该用一个数组去保存这些数据 同时可以采用宏声明的办法声明一个常量 把该常量作为数组长度的值 程序代码如下 defineN5 includevoidmain intarr N i printf Enter dnumbers n N for i 0 i N i scanf d 运行结果 Enter5numbers 45678065 45678065 6 3 4一维数组的应用 续 例6 2编程实现 从键盘输入6个整数 然后按照输入顺序的逆序输出 分析 先从键盘输入6个整数 把这些数保存在数组中 经过处理以后把该数组中的数据逆序输出 如何才能做到逆序存放呢 有两种方案 方案一 若输入的整数个数为N 以m N 2 1为中心 当i小于等于m时 交换num i 和num N i 1 的值 然后输出即可 程序代码如下 6 3 4一维数组的应用 续 defineN6 includevoidmain intnum N i j m temp m N 2 1 printf Enter dnumbers n N for i 0 i N i 输入整数 scanf d 输出逆序后的数组元素 6 3 4一维数组的应用 续 运行结果 Enter6numbers 467890 46789009876 4方案二 若输入的整数个数为N i和j分别代表从前往后数和从后往前数的数组元素的下标 当i小于j时 交换num i 和num j 的值 然后输出即可程序代码如下 6 3 4一维数组的应用 续 defineN6 includevoidmain intnum N i j temp printf Enter dnumbers n N for i 0 i N i 输入整数 scanf d 输出逆序后的数组元素 6 3 4一维数组的应用 续 运行结果 Enter6numbers 467890 46789009876 4例6 3输入10个整数 输出这些数中最小的数以及第一个最小的数在所输入数列中的位置 分析 先从键盘输入10个整数 把这些数保存在数组中 用一个变量min a记住第一个最小数组元素所对应的下标 先把数组中的第一个元素下标赋值给min a 然后把第二个数组元素到第100个数组元素依次和下标为min a的数组元素进行比较 如果前者的值小于后者的话 把它的下标赋值给min a 然后输出该数和它在所输入数列中的位置 min a 1 因为数组下标从0开始 即可 6 3 4一维数组的应用 续 程序代码如下 defineN10 includevoidmain intdata N i intmin a 0 printf Enter dnumbers n N for i 0 i N i 输入整数 scanf d 6 3 4一维数组的应用 续 运行结果 Enter10numbers 467890 912 921 Minis 9 It sthe7thnumber 例6 4编程实现 输入10个整数 从小到大排列并输出 分析 本例将利用例6 3的基本思想 每次将最小的元素放在正确位置 也就是说 第一次把最小的元素放在第一个位置 第二次把剩下元素中最小的元素放在第二个位置 依次类推 我们称这种排序方法为选择排序 然后输出该数组中的元素即可 6 3 4一维数组的应用 续 程序代码如下 defineN10 includevoidmain intdata N inti j temp min a printf Enter dnumber n N for i 0 i N i scanf d 6 3 4一维数组的应用 续 temp data min a data min a data i data i temp printf nAftersorted n for i 0 i N i printf 5d data i 运行结果 Enter10numbers 467890 912 921 Beforesorted 467890 912 921Aftersorted 9 9 4067891221 6 3 4一维数组的应用 续 例6 5假设某班某小组有学生人数为10人 编程实现录入每名学生的C语言课程成绩 并将成绩按照从高分到低分的次序输出 分析 本例将利用例6 4的基本思想 录入学生成绩以后对这些学生的成绩进行排序 然后从高分到低分依次输出即可 6 3 4一维数组的应用 续 程序代码如下 defineN10 includevoidmain floatscore N temp inti j min a printf Enter dscore n N for i 0 iscore min a min a j 6 3 4一维数组的应用 续 temp score min a score min a score i score i temp printf nAftersorted n for i 0 i N i printf 5 1f score i 运行结果 Enter10score 6567 58956 5988745 5908580 Beforesorted 65 067 589 056 598 087 045 590 085 080 0Aftersorted 98 090 089 087 085 080 067 565 056 545 5 6 4二维数组 当数组元素具有两个下标时 该数组称为二维数组 二维数组可以看作具有行和列的平面数据结构 如矩阵 6 4 1二维数组的声明 二维数组的声明形式为 数据类型数组名 数组长度1 数组长度2 其中 数据类型是全体数组元素的数据类型 数组名用标识符表示 数组长度1和数组长度2分别代表数组具有的行数和列数 数组元素的下标一律从0开始 例如 floats 2 3 声明具有2行3列的单精度浮点型的二维数组s 声明数组时要注意以下两点 1 二维数组声明中 数组名 数据类型的声明方式以及数组长度类型的选择和一维数组相同 不同的只是数组名后面紧跟两个方括号 声明了两个数组长度 数组元素的个数是两个长度之积 2 二维数组只是逻辑上的概念 可以认为 二维数组是特殊的一维数组 它的元素的数据类型是一维数组 从物理存储来看 内存是一维的 线性的空间 采用将二维数组映射成一维数组的方法进行存储 C语言里 采用行优先的方式来存储二维数组 即在内存中先顺序放第0行的元素 再存放第1行的元素 同一行中再按列顺序存放 表6 2给出了数组s在内存中的物理存储结构 s 0 0 s 0 1 s 0 2 s 1 0 s 1 1 s 1 2 6 4 2二维数组的引用 和一维数组一样 在C语言中不能一次引用整个数组 只能引用其中的单个数组元素 一个数组元素就相当于一个变量 该数组元素的使用等同于相同数据类型的普通变量 二维数组的引用形式为 数组名 下标1 下标2 其中 数组下标可以是非负整数 整型变量或整型表达式 但不能是浮点数 浮点型变量或者浮点型表达式 同时还要求下标1的范围为 0 数组长度1 1 下标2的范围为 0 数组长度2 1 例如 若有声明floatscore 2 3 则score 0 1 score 1 1 1 score i j 等都是符合C语言语法的表达式 其中i和n是整型变量 它们的取值范围为 0 i 1 0 j 2 而score 1 1 score 1 5 2 score 1 2 score 0 2 等就不是合法的引用方式 6 4 3二维数组的初始化 二维数组的初始化就是给二维数组的元素赋初值 初始化操作既可以在声明二维数组的同时完成 也可以在数组声明之后进行 声明二维数组的同时初始化的形式为 数据类型数组名 下标1 下标2 初值列表 或者数据类型数组名 下标1 下标2 第0行初值列表 第1行初值列表 上面两种方法中的第一种是按行连续初始化 不用加内嵌的花括号 而第二种方法是按行分段初始化 即在外面的花括号里面再嵌套花括号 里面的每个花括号分别为每行元素初始化 若为每一个数组元素都给定了对应的初值的话 两种方法没有区别 6 4 3二维数组的初始化 续 例如 intnum 2 3 1 2 3 4 5 6 按行连续初始化 intnum 2 3 1 2 3 4 5 6 按行分段初始化 但是 当只对数组元素中的部分元素赋初值时 两种方法就有很大区别了 例如 intnum 2 3 1 2 3 4 按行连续初始化 intnum 2 3 1 2 3 4 按行分段初始化 intnum 2 3 1 2 3 4 对整个二维数组排列在最前面的四个元素进行了初始化 即 num 0 0 1 num 0 1 2 num 0 2 3 num 1 0 4 其他元素自动取0 即 num 1 1 0 num 1 2 0 intnum 2 3 1 2 3 4 只对每行的部分元素进行了初始化 即 num 0 0 1 num 0 1 2 num 1 0 3 num 1 1 4 其他元素自动取0 即 num 0 2 0 num 1 2 0 而在声明数组之后进行初始化操作 则只能对每个数组元素一一赋值 6 4 3二维数组的初始化 续 例如 intnum 4 20 i j for i 0 i 4 i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论