cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学

Slides:



Advertisements
Similar presentations
电子成绩单项目实现.
Advertisements

第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
Chapter 3.0 C語言的結構與指標 資料結構導論 - C語言實作.
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
Linked List Operations
第一章 程序设计入门.
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
函數 授課:ANT 日期:2009/3/24.
資料大樓 --談指標與陣列 綠園.
C++程序设计 第二讲 清华大学软件学院.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
函數 授課:ANT 日期:2011/3/28.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第一章 程序的基本结构. 第一章 程序的基本结构 教材及授课结构 本章目标 基本内容 扩展阅读 上机指导 应用举例 习题.
STRUCTURE 授課:ANT 日期:2010/5/12.
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Function.
Object-Oriented Programming in C++ 第一章 C++的初步知识
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
C语言程序设计 李祥.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
第四章 C 语言中的输入和输出.
C语言 程序设计基础与试验 刘新国、2012年秋.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
C++语言程序设计 第二章 C++简单程序设计.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第4章 顺序程序设计.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
C语言概述 第一章.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
C语言程序设计 教案 崔武子制作
物件導向程式設計 CH2.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
第三章 数据抽象.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
C++程式設計入門 變數與運算子 作者:黃建庭.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第四章 C 语言中的输入和输出.
C程序设计.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
#include <iostream.h>
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
函式庫補充資料 1.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

http://staff.ustc.edu. cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学 Data Structure and Algorithm 《数据结构及其算法》 http://staff.ustc.edu. cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学

第1章 预备知识 1.1 程序设计概述 1.2 指针与结构体 1.3 文件操作 1.4 函数与模块化程序设计 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

1.1 程序设计概述 Hello, World! #include <stdio.h> #include <iostream> using namespace std;   int main() { printf("Hello"); cout << ' ' << "World" << "!" << endl; } 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

用两种方法求π #include <math.h> double x = double(rand()) / RAND_MAX; #include <stdlib.h> #include <iostream> double y = double(rand()) / RAND_MAX; using namespace std;   if (x * x + y * y <= 1.0) ++count; double Gregory() { double pi = 0.0; int s = 1, n = 1; return double(count) / N * 4; while (true) { double t = double(s) / n; int main() { if (fabs(t) < 1e-6) break; cout << "Gregory : " << Gregory() << endl; pi += t; s = -s; n += 2; srand(0); } cout << "Monte Carlo 0: " << MonteCarlo() << endl; return pi * 4; srand(1); double MonteCarlo() { cout << "Monte Carlo 1: " << MonteCarlo() << endl; int count = 0, N = 1000000; for (int i = 0; i < N; ++i) { Gregory’s series原理是用arctan x做泰勒展开 Gregory : 3.14159 Monte Carlo 0: 3.14164 Monte Carlo 1: 3.13909 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

1.2 指针与结构体 指针是什么 #define _USE_MATH_DEFINES #include <math.h> #include <stdio.h>   int main() { char c = 'a'; int i = int(8.1); double d(M_PI); char *cp = &c; int *ip = &i; double *dp(&d); printf("Variables : %c %d %g\n", c, i, d); printf("Pointed variables: %c %d %g\n", *cp, *ip, *dp); printf("Pointers : %d %d %d\n", cp, ip, dp); printf("Added pointers : %d %d %d\n", cp + 1, ip + 1, dp + 1); } Variables : a 8 3.14159 Pointed variables: a 8 3.14159 Pointers : 4456167 4456152 4456136 Added pointers : 4456168 4456156 4456144 Variables : a 8 3.14159 Pointed variables: a 8 3.14159 Pointers : 5634279 5634264 5634248 Added pointers : 5634280 5634268 5634256 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

指针和数组的关系 5 5 678710410 5 #include <stdlib.h> int main() { #include <iostream> int a[10] = {1, 2, 3, 4, 5, 0, 0, 0, 0, 0}; using namespace std;   int N = 5; int max_element(int a[10]) { int *pa = (int*)malloc(N * sizeof(int)); int m = a[0]; for (int i = 1; i < 10; ++i) for (int i = 0; i < N; ++i) pa[i] = i + 1; if (a[i] > m) m = a[i]; return m; cout << max_element(a) << ' ' << max_element(a, 10) << ' ' << max_element(pa) << ' ' << max_element(pa, N) << endl; } int max_element(int *a, int len) { for (int i = 1; i < len; ++i) free(pa); 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

动态内存管理 C语言 C++语言 绝不能混用! malloc, free, realloc 只分配或释放内存 new, delete 分配内存并调用构造函数、调用析构函数并释放内存 绝不能混用! int *pa = (int*)malloc(N * sizeof(int)); for (int i = 0; i < N; ++i) pa[i] = i + 1; free(pa); int *pa = new int[N]; for (int i = 0; i < N; ++i) pa[i] = i + 1; delete []pa; 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

指向指针的指针 #include <stdlib.h> >pointpointer.exe #include <iostream> using namespace std;   void ErrorMsg(const char* msg) { cerr << msg << endl; exit(EXIT_FAILURE); } int main(int argc, char **argv) { if (argc < 4) ErrorMsg("Argument error!"); int rows = atoi(argv[1]); int cols = atoi(argv[2]); int **a = new int*[rows]; for (int r = 0; r < rows; ++r) a[r] = new int[cols]; for (int r = 0; r < rows; ++r) for (int c = 0; c < cols; ++c) a[r][c] = r + c; cout << a[r][c] << (c == cols - 1 ? '\n' : ' '); cout << argv[3] << endl; for (int r = 0; r < rows; ++r) delete []a[r]; delete []a; >pointpointer.exe Argument error! >pointpointer.exe 5 3 done 0 1 2 1 2 3 2 3 4 3 4 5 4 5 6 done 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

结构体及其指针 #include <stdio.h> { "Sun", 20, 1995, 10, 12 },   { "Li", 17, 1998, 1, 5 } }; typedef int Age; for (int i = 0; i < 4; ++i) { typedef Age* pAge; students[i].nextStudent = (i == 0 ? NULL : (i == 1 ? students + 2 : (i == 2 ? students : students + 1))); typedef char Name[20]; typedef struct { int year, month, day; } Date; } typedef struct Student { pStudent ps = &students[3]; Name name; while (ps) { Age age; pAge pa = &(ps->age); Date birthday; printf("%s %d (%d-%d-%d)\n", ps->name, *pa, ps->birthday.year, ps->birthday.month, ps->birthday.day); Student* nextStudent; } *pStudent, StudentArray[4]; int main() { ps = ps->nextStudent; StudentArray students = { { "Zhao", 19, 1996, 5, 23 }, { "Qian", 18, 1997, 7, 19 }, Li 17 (1998-1-5) Qian 18 (1997-7-19) Sun 20 (1995-10-12) Zhao 19 (1996-5-23) 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

1.3 文件操作 标准输入输出 Input two integers: 3 4 Input operator: Input error! int main() { int a, b, res; char c; printf("Input two integers: "); scanf("%d %d", &a, &b); printf("Input operator: "); c = getchar(); switch (c) { case '+': res = a + b; break; case '-': res = a - b; break; default: ErrorMsg("Input error!"); } printf("Result: %d\n", res); 此处加入 getchar(); 或者 fflush(stdin); Input two integers: 3 4 Input operator: + Result: 7 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

标准输入输出 C语言 C++语言 慎用scanf! 慎用字符串输入! scanf, printf scanf("%d %d", &a, &b); printf("%d %d", a, b); C++语言 cin, cout cin >> a >> b; cout << a << ' ' << b; 慎用scanf! 必须提供正确的指针,且保证存储空间 慎用字符串输入! 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

1.4 函数与模块化程序设计 局部变量与全局变量 #include <stdio.h> int count;   int count; void func1() { for (count = 0; count < 10; ++count) putchar('.'); } void func2() { int temp = count; func1(); printf("The count is %d\n", temp); int main() { count = 100; func2(); ..........The count is 100 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

引用参数 C++等语言提供的功能,C语言不支持 引用参数传递的是“地址”而不是“值”,因此引用参数使得 对参数“值”的修改可以回传 #include <stdio.h>   void chValue (int i) { i = 3; } void chPointer(int *i) { *i = 5; } void chRef (int &i) { i = 7; } int main() { int a = 1; chValue(a); printf("%d\n", a); chPointer(&a); printf("%d\n", a); chRef(a); printf("%d\n", a); } 传值: 修改无法回传 传引用: 修改可以回传 传指针(特殊的值) 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

引用参数的用法 实现“多输出” 避免大型结构体的复制 void MaxMin(int *p, int len, int &maxValue, int &minValue) { // 输入数组p,其长度为len // 以引用参数返回数组中的最大值和最小值 } const int N = 10000; struct BigStruct { double array[N]; }; double MaxValue(BigStruct &a) { double m = a.array[0]; for (int i = 1; i < N; ++i) if (a.array[i] > m) m = a.array[i]; return m; } 这个例子如果不用引用参数,运行100000次的时间需要9.073秒;用了以后需要3.262秒 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

指针的引用参数 #include <stdio.h> void InitArray(int *&p, int len) {   void InitArray(int *&p, int len) { if (p) delete []p; p = new int[len]; } void DestoryArray(int *&p) { delete []p; p = NULL; int main() { int *p = NULL; int N = 100; InitArray(p, N); printf("Pointer: %d ", p); for (int i = 0; i < N; ++i) p[i] = i; int sum = 0; for (int i = 0; i < N; ++i) sum += p[i]; DestoryArray(p); printf("Pointer: %d Sum: %d\n", p, sum); Pointer: 6849840 Pointer: 0 Sum: 4950 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

模块化编译和链接 module.cpp arith.h #include <stdio.h> #include "arith.h"   int main() { int a = 3, b = 5; printf("%d %d %g\n", add(a, b), minus(a, b), pi); ComplexNumber ca = { 2, 3 }, cb = { 3, -5 }; print(add(ca, cb)); } module.cpp extern const double pi;   struct ComplexNumber { double real, imag; }; int add(int, int); int minus(int, int); ComplexNumber add(ComplexNumber, ComplexNumber); void print(ComplexNumber); arith.h 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

arith.cpp #include <stdio.h> #include "arith.h"   const double pi = 3.1415926; int add(int a, int b) { return a + b; } int minus(int a, int b) { return a - b; } ComplexNumber add(ComplexNumber a, ComplexNumber b) { ComplexNumber res; res.real = a.real + b.real; res.imag = a.imag + b.imag; return res; } void print(ComplexNumber c) { printf("%g%+gi\n", c.real, c.imag); arith.cpp 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

本章复习提纲 C/C++语言的主要特性 结构体 指针 引用参数 动态内存管理 输入输出 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识

作业 1.2, 1.4 1.2 程序改错 1.4 数组算法 2018/11/202018/11/20 数据结构及其算法 第1章 预备知识