多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

Slides:



Advertisements
Similar presentations
C语言程序设计 主讲教师 :张群燕 电话:
Advertisements

肖 冰 深圳市达晨创业投资有限公司 副总裁 深圳市达晨财信创业投资管理公司 总裁
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
“八皇后”问题 崔萌萌 吕金华.
第一章 C语言概述 计算机公共教学部.
食品营养成分的检验. 食品营养成分的检验 科学探究的一般过程: 形成假设 设计方案 收集数据 表达交流 处理信息 得出结论 探究:馒头和蛋糕中是否含有淀粉和脂肪 假设:馒头和蛋糕中含有淀粉和脂肪.
中融资产-阳光城2号专项资产管理计划之推介材料
補充: Input from a text file
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
C++程序设计 王希 图书馆三楼办公室.
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
高级语言程序设计 主讲人:陈玉华.
函數 授課:ANT 日期:2009/3/24.
選擇排序法 通訊一甲 B 楊穎穆.
C++程序设计 第二讲 清华大学软件学院.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
C 程式設計— 指標.
函數 授課:ANT 日期:2011/3/28.
If … else 選擇結構 P27.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
STRUCTURE 授課:ANT 日期:2010/5/12.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
第三章 C++中的C 面向对象程序设计(C++).
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
算法的基本概念.
C语言 程序设计基础与试验 刘新国、2012年秋.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
第三节 整数类型.
計數式重複敘述 for 迴圈 P
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
C语言概述 第一章.
C语言复习2----函数.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
C程序设计.
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
C程序设计.
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第7章 程序的结构 四、生存期与存储属性 五、extern关键字与外部连接属性 六、static关键字与内部连接属性.
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
第二章 类型、对象、运算符和表达式.
第2章 数据类型与表达式 学习目的与要求: 掌握C 语言的基本数据类型及使用方法 掌握C程序中常用的运算符和表达式 了解数据类型的转换.
陣列 東海大學物理系‧資訊教育 施奇廷.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C程序设计.
挑戰C++程式語言 ──第9章 函數.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第七章  数 组.
程式設計--linear search 通訊一甲 B 楊穎穆.
第1章程序设计和C语言.
第十二章 位运算.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
99 教育部專案補助計畫案明細 大類 分項 教育部補助 學校配合款 工作項目 計畫主 持人 執行期限 文號 備註 設備費 業務費 管理學院
隨機函數.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为2000 ,则

表 示 形 式 含义 地 址 a 二维数组名,指向一维数组a[0],即0行首地址 2000 a[0], *(a+0), *a 0行0列元素地址 a+1,&a[1] 1行首地址 2016 a[1],*(a+1) 1行0列元素a[1][0]的地址 a[1]+2, *(a+1) +2, &a[1][2] 1行2列元素a[1][2] 的地址 2024 *(a[1]+2), *(*(a+1)+2), a[1][2] 1行2列元素a[1][2]的值 元素值为13

输出二维数组有关的值 #include<stdio.h> #define format ″%d,%d\n″ void main() { int a[3][4]={1,3,5,7,9,11,13, 15,17,19,21,23}; printf(format,a,*a); printf(format,a[0] , *(a+0));  printf(format,&a[0],&a[0][0]);  printf(format,a[1],a+1);  printf(format,&a[1][0],*(a+1)+0);  printf(format,a[2],*(a+2));  printf(format,&a[2],a+2);  printf(format,a[1][2],*(*(a+1)+2)); }

某一次运行结果如下: 1244900,1244900 (0行首地址和0行0列元素地址) 1244900,1244900 (0行0列元素地址) 1244900,1244900 (0行0首地址和0行0列元素地址) 1244916,1244916 (1行0列元素地址和1行首地址) 1244916,1244916 (1行0列元素地址) 1244932,1244932 (2行0列元素地址) 1244932,1244932 (2行首地址) 13,13 (1行2列元素的值)

上机过程中的问题 养成良好的程序书写风格 变量、函数的命名:体现其意义 if/else、swith/case、for、while等复合语句中 { }的使用 { }内代码的缩进 适当的空行 适当的注释 避免太长的语句、适当的换行

上机过程中的问题 应该: 误解: 程序运行不正确,怎么办? 在VC环境中写完程序后,就拷贝到编程网格上提交 仔细分析问题 考虑各种情况 把自己当作计算机,给定输入,再运行一下程序 误解: 在VC环境中写完程序后,就拷贝到编程网格上提交 在VC环境中编译正确,程序就是正确的 对于给出的样例输入,输出正确,程序就是正确的 程序运行不正确,怎么办?

程序的调试 语法错误:编译(组建)错误 不要惊慌,编译结果输出窗口已经为你指明了程序的出错行及错误原因,可以据此来修改程序错误。 改错时,应从出错信息中的第一条开始,用鼠标双击该条信息,程序源文件窗口就将定位到出错行。 很多时候,程序编译后会出很多错误,但很可能是由第一个错误衍生而来的,改完第一个错误后,再编译时其他错误就不再出现了。所以,应该每修改完一个错误后就编译一次。

二、关于程序的错误修改及调试 这里少了一个“{”。 这里的一堆错误,都是由于上面少了一个“{”引起的! 双击第一行,定位错误及了解错误原因!

程序的调试 运行结果错:程序跟踪调试 由于程序算法及其他原因,执行结果不正确,这时从源程序表面上就很难发现错误。 跟踪调试:可以手动一步一步执行程序语句,在每条语句执行后,可以查看相关变量的值,以判断和预期结果是否相符;也可以了解程序的执行顺序,看它是否和预期的程序流程相符。 断点设定:在跟踪调试前,还需要确定一下程序可能从哪里出错,设置一个断点,让程序在此停止自动运行,由我们手动一步一步发出程序执行命令。如果不能确定程序是从哪里出错,则可以将断点设置在程序的第一条语句处。

设置程序断点

跟踪方式执行程序 查看变量值 当前程序执行停留在此行 手动设置变量,查看变量值 程序手动执行 进入函数 一步一步执行 从函数中执行出来 执行到光标所在行 查看变量值 当前程序执行停留在此行 手动设置变量,查看变量值

问题1: 骑车与走路

n 没有上限了! 骑车: 找到并启动自行车 27秒; 停车锁车 23秒; 速度 3.0米/秒; 走路: 速度 1.2米/秒;

假设 n 的上限是 10

提交到 编程网格。结果是 … … void compute(int distance){ #include <stdio.h> #define N 10 void compute(int distance); int main(){ int n; int distance[N]; int i; scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%d", &(distance[i])); } compute(distance[i]); return 0; void compute(int distance){ int timeBike = 27 + 23 + distance/3; int timeWalk = (int)(distance/1.2); if(timeBike < timeWalk){ printf("Bike\n"); } else if (timeBike > timeWalk){ printf("Walk\n"); } else { printf("All\n"); } 提交到 编程网格。结果是 … …

把 n 的上限修改为 100

提交到 编程网格。结果是 … … void compute(int distance){ #include <stdio.h> #define N 100 void compute(int distance); int main(){ int n; int distance[N]; int i; scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%d", &(distance[i])); } compute(distance[i]); return 0; void compute(int distance){ int timeBike = 27 + 23 + distance/3; int timeWalk = (int)(distance/1.2); if(timeBike < timeWalk){ printf("Bike\n"); } else if (timeBike > timeWalk){ printf("Walk\n"); } else { printf("All\n"); } 提交到 编程网格。结果是 … …

WHY?

编程网格 判断程序是否正确 的机制 对每一个题目, 编程网格 预先设定了 一组测试数据; 只要你的程序在这组测试数据下正确, 编程网格 判断程序是否正确 的机制 对每一个题目, 编程网格 预先设定了 一组测试数据; 只要你的程序在这组测试数据下正确, 编程网格 即认为 你的程序是正确的; 在 骑车与走路 这个题目中, 编程网格使用的测试数据中,所有的n 都小于 100

有没有更稳妥的办法呢?

动 态 数 组

int sz[10]; 静态数组 必须是一个常量 静态数组 的 长度 在 编译时刻 就确定了; 如何能在程序的运行时刻, 动态地确定一个数组的长度呢?

动态数组 动态数组? #include <stdio.h> int main(){ int n; scanf(“%d”, &n); int shzu[n]; return 0; } 在VC下编译失败! error C2133: 'shuzu' : unknown size 怎样才能实现 动态数组?

动态数组 如何实现动态数组? 1、使用指针 2、自己申请内存

动态数组 #include <stdio.h> #include <malloc.h> int main(){ int n; scanf(“%d”, &n); int *shzu = (int *) malloc(sizeof(int) * n); … … free(shuzu); return 0; } #include <stdio.h> int main(){ int n; scanf(“%d”, &n); int shzu[n]; … … return 0; }

动态数组 #include <stdio.h> #include <malloc.h> int main(){ int n; scanf(“%d”, &n); double *shzu = (double *) malloc(sizeof(double) * n); … … free(shuzu); return 0; } #include <stdio.h> int main(){ int n; scanf(“%d”, &n); double shzu[n]; … … return 0; }

关于malloc()/free()的使用 别忘了: #include <malloc.h> malloc函数的参数为所需申请内存的大小:以字节为单位 malloc函数返回一个void*类型的地址,必须通过强制类型转换,才能赋值给特定的指针变量: int * pint = (int *) malloc( ... ); 用malloc函数生成各种类型的动态数组,最好使用“sizeof(类型名) * 动态数组长度”形式确定分配内存的大小: int * pint = (int *) malloc( sizeof(int) * 100 ); 分配的内存不再使用时一定要释放: free(pint);

动态数组 malloc()在内存中分配的一块连续的内存区域,这与静态数组在内存中的布局是一样的。因此,指向这块内存区域的指针变量就可以像数组一样使用了: int *pint; pint = (int *)malloc(sizeo(int)*10); pint[0], pint[1], ……, pint[9] 在使用动态数组时,一定要注意不要越界引用,即不要引用并没有分配给你使用的内存: 当引用pint[10] 时,对于C语言来说,这是合法的,但是它所引用的却是所分配的内存区域之外的其他内存区域,其内的值是未知的;如果对其进行修改的话,还可能影响整个程序的正确性。 pint 5 6 7 8 9 1 2 3 4 10(?) ? pint+10

#include <stdio.h> #define N 10 void compute(int distance); int main(){ int n; int distance[N]; int i; scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%d", &(distance[i])); } compute(distance[i]); return 0; #include <stdio.h> #include <malloc.h> void compute(int distance); int main(){ int n; int i; scanf("%d", &n); int *distance = (int *) malloc(sizeof(int)*n); for(i = 0; i < n; i++){ scanf("%d", &(distance[i])); } compute(distance[i]); free(distance); return 0;

问题2: 跳绳游戏

关键信息: 计算1分钟内跳了多少下绳; 1秒钟跳1次; 跳坏后,3秒钟后才能又开始跳;

输入、输出 示例 = 60 – 0 * 3 = 60 – 3 * 3 = 60 – 1 * 3 = 60 – 4 * 3 = 60 – 4 * 3 = 47

输入:0 输出:60 在y秒时,小朋友停止了跳绳 0秒 60秒 y秒 60下

输入:3 12 23 45 输出:51 y秒 51 = 60 – 3*3 在y秒时,小朋友停止了跳绳 0秒 12秒 15秒 26秒 29秒 51秒 54秒 60秒 12下 23下 23下 45下 45下 12下 51 = 60 – 3*3

输入:1 17 输出:57 在y秒时,小朋友停止了跳绳 0秒 60秒 y秒 17秒 20秒 17下 17下 57 = 60 – 1*3

输入:4 10 20 30 40 输出:48 y秒 48 = 60 – 4*3 在y秒时,小朋友停止了跳绳 0秒 60秒 10秒 13秒 23秒 26秒 36秒 39秒 49秒 52秒 10下 10下 20下 20下 30下 30下 40下 40下 48 = 60 – 4*3

输入:5 10 20 30 40 58 输出:48 60秒 0秒 10秒 13秒 23秒 26秒 36秒 39秒 49秒 52秒 70秒 73秒 10下 10下 20下 20下 30下 30下 40下 40下 58下 58下 48 = 60 – 4*3

输入:6 10 20 30 40 47 60 输出:47 0秒 60秒 10秒 13秒 23秒 26秒 36秒 39秒 49秒 52秒 59秒 62秒 75秒 78秒 10下 10下 20下 20下 30下 30下 40下 40下 47下 47下 60下 60下 47

问题分析 60秒 Case 1 0秒 60秒 Case 2

请同学们课后思考 如何编写这个程序

下课!