北京大学计算概论课件2016lesson11-bit-fp
合集下载
计算概论.
按位与
按位与运算符“&”是双目运算符。其功 能是将参与运算的两操作数各对应的二进制位 进行与操作,只有对应的两个二进位均为1时, 结果的对应二进制位才为1,否则为0。
按位与
例如:表达式“21 & 18 ”的计算结果是 16(即二进制数10000),因为: 21 用二进制表示就是: 0000 0000 0000 0000 0000 0000 0001 0101 18 用二进制表示就是: 0000 0000 0000 0000 0000 0000 0001 0010 二者按位与所得结果是: 0000 0000 0000 0000 0000 0000 0001 0000
new 运算符还有第二种用法,可以用来动态分配 一个任意大小的数组: P = new T[N]; T是任意类型名,P是类型为T * 的指针,N代表 “元素个数”,它可以是任何值为正整数的表达式,表 达式里可以包含变量、函数调用。这样的语句动态分配 出 N × sizeof(T)个字节的内存空间,这片空间的起 始地址被赋值给P。 例如: int * pn; int i = 5; pn = new int[i * 20]; pn[0] = 20; pn[100] = 30; //编译没问题。运行时导致数组越界。
快速排序库函数qsort
排序就是一个不断比较并交换位置的过程。qsort 如何在连元素的类型是什么都不知道的情况下,比较 两个元素并判断哪个应该在前呢?答案是,qsort函 数在执行期间,会通过pfCompare指针调用一个 “比 较函数”,用以判断两个元素哪个更应该排在前面。 这个“比较函数”不是C/C++的库函数,而是由使用 qsort的程序员编写的。在调用qsort时,将“比较函 数”的名字作为实参传递给pfCompare。程序员当然 清楚该按什么规则决定哪个元素应该在前,哪个元素 应该在后,这个规则就体现在“比较函数”中。
计算机专业英语课件E1Unit11
for software and software development. Software is considered a very critical asset and management wants to ensure they employ a team of software engineers who are devoted to ensuring that the software system stays up-to-date with ever evolving changes.
1.1 Section A: How Software Engineering Works
3. Which of the following statements is wrong about the techniques in software engineering? A. Techniques are needed to control the complexity of the large software systems B. Techniques are the essence of software engineering C. Techniques are now widely used in software engineering D. New technologies bring new challenges to software engineers continually
• ______4. An alternative name for a bar chart • ______5. An approach to program testing where the tests are based on
1.1 Section A: How Software Engineering Works
3. Which of the following statements is wrong about the techniques in software engineering? A. Techniques are needed to control the complexity of the large software systems B. Techniques are the essence of software engineering C. Techniques are now widely used in software engineering D. New technologies bring new challenges to software engineers continually
• ______4. An alternative name for a bar chart • ______5. An approach to program testing where the tests are based on
北京大学《计算概论》课件:第10讲-复合数据结构-数组与结构.pptx
};
– 结构分量的类型可以相同,也可不同
– 同一个结构内的分量名不可相同
22
结构类型变量的定义
• 结构类型只是定义了一种新的数据类型
– 系统并不为这个新类型分配内存空间。 – 可以使用新的结构类型来声明变量——结构类型变量。
• 结构类型变量定义的两种形式:
– 用已定义的结构定义变量,例如:
struct point point1; struct point point2;
}
return 0;
结构
结构的概念
• 通常,一个学生的个人信息,包括:学号、姓名、性别、 年龄、各门功课的成绩等数据,这些数据都与一个学生相 关联,类型各不相同。如果将这些数据定义为各独立的简 单变量:
Number、Name、Sex、Age、Course1、Course2、…
• 这样就难以反映它们之间的内在联系。应该把它们组织成 一个组合项,把它们当作一个有机的整体。
}
for (i=0; i<POPULATION; i++) {
if ( people[i] == LUCKY_M ) {
luckyPeople[nLucky] = i;
nLucky ++;
}
}
//输出获奖者编号及所获奖金数额
for (i=0; i<nLucky; i++){
printf("%d %d\n", luckyPeople[i], LUCKY_M / nLucky);
• ——这个组合项就是结构(Structure)
21
结构类型及其定义
•一个新的复合数据类型——结构类型
• 定义一个结构类型
– 结构分量的类型可以相同,也可不同
– 同一个结构内的分量名不可相同
22
结构类型变量的定义
• 结构类型只是定义了一种新的数据类型
– 系统并不为这个新类型分配内存空间。 – 可以使用新的结构类型来声明变量——结构类型变量。
• 结构类型变量定义的两种形式:
– 用已定义的结构定义变量,例如:
struct point point1; struct point point2;
}
return 0;
结构
结构的概念
• 通常,一个学生的个人信息,包括:学号、姓名、性别、 年龄、各门功课的成绩等数据,这些数据都与一个学生相 关联,类型各不相同。如果将这些数据定义为各独立的简 单变量:
Number、Name、Sex、Age、Course1、Course2、…
• 这样就难以反映它们之间的内在联系。应该把它们组织成 一个组合项,把它们当作一个有机的整体。
}
for (i=0; i<POPULATION; i++) {
if ( people[i] == LUCKY_M ) {
luckyPeople[nLucky] = i;
nLucky ++;
}
}
//输出获奖者编号及所获奖金数额
for (i=0; i<nLucky; i++){
printf("%d %d\n", luckyPeople[i], LUCKY_M / nLucky);
• ——这个组合项就是结构(Structure)
21
结构类型及其定义
•一个新的复合数据类型——结构类型
• 定义一个结构类型
北京大学计算概论-课件:第五讲-cpu内存基本工作原理
新的状态
ADD RETURN
CARRY
HALT RETURN CARRY OVERFLOW RETURN RETURN RETURN
HALT
CONTROL 当前状态=HALT
…… * * 1 1 0 * * ……
图灵机—实例1
这个图灵机的功能是什么? 启示:计算机程序执行的顺序性
f(x) = x + 1
CONTROL 当前状态=START
…… * * 1 0 1 * * ……
ID 当前状态
01
START
02
ADD
03
ADD
04
ADD
05
CARRY
06
CARRY
07
CARRY
08 OVERFLOW
09
RETURN
10
RETURN
11
RETURN
控制规则表
当前符号
* 0
1
* 0 1 * * 0 1 *
…… * * 1 1 0 * * ……
ID 当前状态
01
START
02
ADD
03
ADD
04
ADD
05
CARRY
06
CARRY
07
CARRY
08 OVERFLOW
09
RETURN
10
RETURN
11
RETURN
控制规则表
当前符号
* 0
1
* 0 1 * * 0 1 *
写入符号
* 1
0
* 1 0 1 * 0 1 *
移动方向
左移 右移 左移 右移 右移 左移 左移 右移 右移 右移 不动
计算概论课程介绍
讨论。有关课程的讲义、作业、通知等都将在网上发布。 , /course/jsgl/jsgl.htm
程序设计上机实习:程序设计作业需要通过网上评测系统(编程网格:
)来提交,期终考试也是通过它来进行(考前
17
课程进度
第十五/十六讲 函数 函数、参数、全局变量、局部变量、递归方法调用 第十七/十八讲 链表 线性表的概念,单链表及其上的操作 循环链表,双链表,应用实例 第十九讲 文件操作 文件的概念,文件上的操作 第二十/二十一讲 综合练习及复习 习题讲解、编程问题分析、答疑
18
上机进度
第一次 第二次
8
9
教学方式
课堂讲授,每周3学时 周一7~8节(15:10-17:00),单周,一教204; 周三3~4节(10:10-12:00),一教204 。 上机实习,每周2学时 周三7~8节( 15:10-17:00 ),计算中心7号机房,理科一号楼1249室; 随堂小测验 课后阅读、作业 课堂讲授:2011年9月5日-2011年12月21日,共16周。每堂课分基础知识和应
2、程序设计初步
•
3、上机操作
• • •
6
课程目标
理论
个人计算机的基本组成及各部件的功能 操作系统的引导及其主要功能 信息的表示、处理、存储的基本原理 互联网的基本功能和原理 计算机程序的工作原理及开发过程
实践
7
Windows 操作系统的使用 常用软件的操作 – 收发电子邮件、搜索引擎的使用、 MS Office(Word, Excel, Powerpoint) VC++编程环境 及 C 语言编程
13
教学特点
程序设计上机实习:程序设计作业需要通过网上评测系统(编程网格:
)来提交,期终考试也是通过它来进行(考前
17
课程进度
第十五/十六讲 函数 函数、参数、全局变量、局部变量、递归方法调用 第十七/十八讲 链表 线性表的概念,单链表及其上的操作 循环链表,双链表,应用实例 第十九讲 文件操作 文件的概念,文件上的操作 第二十/二十一讲 综合练习及复习 习题讲解、编程问题分析、答疑
18
上机进度
第一次 第二次
8
9
教学方式
课堂讲授,每周3学时 周一7~8节(15:10-17:00),单周,一教204; 周三3~4节(10:10-12:00),一教204 。 上机实习,每周2学时 周三7~8节( 15:10-17:00 ),计算中心7号机房,理科一号楼1249室; 随堂小测验 课后阅读、作业 课堂讲授:2011年9月5日-2011年12月21日,共16周。每堂课分基础知识和应
2、程序设计初步
•
3、上机操作
• • •
6
课程目标
理论
个人计算机的基本组成及各部件的功能 操作系统的引导及其主要功能 信息的表示、处理、存储的基本原理 互联网的基本功能和原理 计算机程序的工作原理及开发过程
实践
7
Windows 操作系统的使用 常用软件的操作 – 收发电子邮件、搜索引擎的使用、 MS Office(Word, Excel, Powerpoint) VC++编程环境 及 C 语言编程
13
教学特点
最新计算概论(北大期末复习资料:计概复习幻灯片课件
#define JINGDU 0.00001 #include <stdio.h> int main(){
x1 = 1 xn+1 = (xn + a/xn)/2
double a, x2, x1;
scanf(“%lf”, &a);
x1 = 1;
x2 = (x1+a/x1)/2;
while(x2-x1 > JINGDU || x1-x2 > JINGDU){
长短。 (3)控制完成洗衣时信号提示。
全自动洗衣机的控制方案
1. 打开总开关,设置水位(高/中/低)且水位灯亮, 设置洗涤方式(轻柔/标准/强劲)且对应洗涤灯亮, 设置漂洗次数(2/3/4)且对应漂洗灯亮。
2. 按下启动/暂停键,开始进水,进水灯亮,水到 设定水位停止进水,进水灯灭,延时2S后,开始洗涤。
称:这两个字符串相等,
“字符串复制”函数
strcpy(目标字符串, 源字符串);
功能:把 源字符串 赋值给 目标字符串
int main(){ char zfc_src[50], zfc_tgt[50]; gets(zfc_src); strcpy(zfc_tgt, zfc_src); printf(“%s\n”, zfc_tgt); return 0;
用 冒泡法 对 数组 int sz[LEN] 进行排序
int e;
for(int k = 1 ; k <= LEN ; k++){
for(int i = 0; i < LEN - k; i++){
if(sz[i] > sz[i+1]){
e = sz[i+1];
计算概论(Introduction to Computing)
指针, 第十七讲 指针,结构体
计算概论
(Introduction to Computing)
主讲人:马思伟
北京大学数字媒体研究所 / 理科2号楼2 641 周一 周三
1
复习
多维数组与指针
– int arr[3][4]; arr, arr[0], &arr[0], &ar[0][0], arr+1, arr[1] – arr[0][0], *(*(arr+i)+j), arr[i][j]
指向函数的指针
int max(int a, int b); int *p(int , int); int c; p=max; c=p(4, 5)
2
关于编程
编程中常出现的错误 编程时应该注意的问题
3
编程中常出现的问题
1.
程序风格问题 变量定义(全局变量/局部变量,参数传值传地址调用等),函数定义,注释, 对齐等; 好的编程风格:容易阅读、调试、维护……
22
动态数组 – 申请空间
float *pf; pf = (float *)malloc(sizeof(float)* )malloc(sizeof(float)*20); )malloc(sizeof(float)* // 申请一个长度为20的数组,数组元素为float类型。
23
动态数组 – 头文件
void sort(char *name[], int n) { char *temp; int i, j, k; for(i=0; i<n-1; i++) { k = i; for(j=i; j<n-1; j++) if (strcmp (name[k], name[j]>0)) k = j; if (k!=i) {temp=name[i]; name[i]=name[k]; name[k]=temp; } }
计算概论
(Introduction to Computing)
主讲人:马思伟
北京大学数字媒体研究所 / 理科2号楼2 641 周一 周三
1
复习
多维数组与指针
– int arr[3][4]; arr, arr[0], &arr[0], &ar[0][0], arr+1, arr[1] – arr[0][0], *(*(arr+i)+j), arr[i][j]
指向函数的指针
int max(int a, int b); int *p(int , int); int c; p=max; c=p(4, 5)
2
关于编程
编程中常出现的错误 编程时应该注意的问题
3
编程中常出现的问题
1.
程序风格问题 变量定义(全局变量/局部变量,参数传值传地址调用等),函数定义,注释, 对齐等; 好的编程风格:容易阅读、调试、维护……
22
动态数组 – 申请空间
float *pf; pf = (float *)malloc(sizeof(float)* )malloc(sizeof(float)*20); )malloc(sizeof(float)* // 申请一个长度为20的数组,数组元素为float类型。
23
动态数组 – 头文件
void sort(char *name[], int n) { char *temp; int i, j, k; for(i=0; i<n-1; i++) { k = i; for(j=i; j<n-1; j++) if (strcmp (name[k], name[j]>0)) k = j; if (k!=i) {temp=name[i]; name[i]=name[k]; name[k]=temp; } }
北京大学《计算概论》课件:01-01 课程介绍
上机练习
大胆试验,善于总结经验
可以讨论,但不要抄袭
把手机调成静音!!! 精选PPT
16
课程进度(1/4)
共 15讲
第一讲 引言
课程介绍、计算机与医学
第二讲 计算机应用
如何购买计算机
Windows操作系统的使用
设备与互联;网上服务与交流
浏览器、搜索引擎、ftp、E-mail
第三讲计算机系统
计算机的硬件组成及性能指标
熟练使用 一些常用软件
电子邮件、搜索引擎、办公软件、…
熟练使用 VC编程环境 进行 C语言编程
精选PPT
8
教材及参考书
教材
《计算概论(第二版)》
许卓群、李文新、罗英伟、汪小林,清华大学出版社,2009年.
参考书 《计算概论-程序设计阅读题解》
汪小林,罗英伟,李文新,清华大学出版社,2011年.
精选PPT
19
课程进度(4/4)
第十一讲 高级程序设计(II):二维数组 二维数组、图像处理
第十二讲 高级程序设计(III):函数 函数、参数、全局变量、局部变量、递归方法调用
第十三讲 高级程序设计(IV):字符数组与字符串 字符数组、字符串、字符串的应用
第十四讲 习题课 数组、结构、函数、字符串
Visual C 编程环境
精选PPT
7
课程目标
在 理论 方面
初步掌握 计算思维
了解 个人计算机的基本组成及各部件的功能
了解 操作系统及其主要功能
了解 信息的表示、处理、存储的基本原理
了解 互联网的基本功能和原理
了解 计算机程序的工作原理及开发过程
在 实践 方面
熟练使用 Windows 操作系统
计算机科学概论原版课件(第九版)-11ex
0-17
Figure 11.9 The merge sort algorithm implemented as a procedure MergeSort
© 2007 Pearson Addison-Wesley. All rights reserved
0-18
Figure 11.10 The hierarchy of problems generated by the merge sort algorithm
• RSA: A popular public key cryptographic algorithm
– Relies on the (presumed) intractability of the problem of factoring large numbers
© 2007 Pearson Addison-Wesley. All rights reserved
0-13
Figure 11.6 Testing a program for self-termination
© 2007 Pearson Addison-Wesley. All rights reserved
0-14
Figure 11.7 Proving the unsolvability of the halting program
0-16
© 2007 Pearson Addison-Wesley. All rights reserved
Figure 11.8 A procedure MergeLists for merging two lists
© 2007 Pearson Addison-Wesley. All rights reserved
北京大学计算概论(C语言)经典课件Lecture 10——数组(下)
来自 其他多维数组可以此类推14
多维数组数据存储
二维数组,行列索引的表格
15
多维数组数据存储
二维数组在内存中的一维顺序排放
16
多维数组在内存中的布局
17
二维数组初始化
初始化:
#define NUMROWS 3
#define NUMCOLS 4 int val[NUMROWS][NUMCOLS] = { {8,16,9,52}, {3,15,27,6}, {14,25,2,10} };
作业3
数组数据统计
for(k=1;k<=1;k++) { printf("\n\n请选择你需要的功能,按下相应数字并回车\n1、查看每个学生的总分和平 均分;\n2、输入学号查看学生各科成绩;\n3、查看各科最高分及其对应学号;\n4、 统计平均分分数段人数\n"); scanf("%d",&m); switch(m) { case 1: { for(i=0;i<=q-1;i++) { sum[i]=Chinese[i]+math[i]+English[i]; average[i]=(float)sum[i]/3; printf("%d号学生的总分为%d,平均分为%.2f。\n",i+1,sum[i],average[i]); } printf("\n按0返回,否则关闭窗口。\n"); scanf("%d",&k); 11 }
第十讲 程序设计----数组
计算概论
(Introduction to Computing) 马思伟
北京大学数字媒体研究所 /
多维数组数据存储
二维数组,行列索引的表格
15
多维数组数据存储
二维数组在内存中的一维顺序排放
16
多维数组在内存中的布局
17
二维数组初始化
初始化:
#define NUMROWS 3
#define NUMCOLS 4 int val[NUMROWS][NUMCOLS] = { {8,16,9,52}, {3,15,27,6}, {14,25,2,10} };
作业3
数组数据统计
for(k=1;k<=1;k++) { printf("\n\n请选择你需要的功能,按下相应数字并回车\n1、查看每个学生的总分和平 均分;\n2、输入学号查看学生各科成绩;\n3、查看各科最高分及其对应学号;\n4、 统计平均分分数段人数\n"); scanf("%d",&m); switch(m) { case 1: { for(i=0;i<=q-1;i++) { sum[i]=Chinese[i]+math[i]+English[i]; average[i]=(float)sum[i]/3; printf("%d号学生的总分为%d,平均分为%.2f。\n",i+1,sum[i],average[i]); } printf("\n按0返回,否则关闭窗口。\n"); scanf("%d",&k); 11 }
第十讲 程序设计----数组
计算概论
(Introduction to Computing) 马思伟
北京大学数字媒体研究所 /
北京大学《计算概论》课件:ch14-c语言编程应用.pptx
}
红圈 蓝圈 绿圈
row = 7 col = 6
行的下限 行的上限 列的下限 列的上限 xx_row sx_row xx_col sx_col
0
60
5
1
51
4
2
42
3
红圈 蓝圈 绿圈
row = 7 col = 6
行的下限 行的上限 列的下限 列的上限 xx_row sx_row xx_col sx_col
012345
0 00 01 02 03 04 05 1 21 22 23 24 25 06 2 20 35 36 37 26 07 3 19 34 41 38 27 08 4 18 33 40 39 28 09 5 17 32 31 30 29 10 6 16 15 14 13 12 11
列的下限 xx_col
0 row-1 0 col-1 1 row-2 1 col-2 2 row-3 2 col-3
#include “stdio.h” #define ROW 100 #define COL 100 int main(){
int row, col, matrix[ROW][COL]; int xx_row, sx_row, xx_col, sx_col; int i, j;
} }
xx_row________;
在这里继续插入代sx码_row________;
xx_col ________;
return 0;
sx_col ________;
}
}
xx_row #include “stdio.h”sx_row #define ROW 100xx_col
= ____0____; = _r_o_w__-_1__; = ____0____;
红圈 蓝圈 绿圈
row = 7 col = 6
行的下限 行的上限 列的下限 列的上限 xx_row sx_row xx_col sx_col
0
60
5
1
51
4
2
42
3
红圈 蓝圈 绿圈
row = 7 col = 6
行的下限 行的上限 列的下限 列的上限 xx_row sx_row xx_col sx_col
012345
0 00 01 02 03 04 05 1 21 22 23 24 25 06 2 20 35 36 37 26 07 3 19 34 41 38 27 08 4 18 33 40 39 28 09 5 17 32 31 30 29 10 6 16 15 14 13 12 11
列的下限 xx_col
0 row-1 0 col-1 1 row-2 1 col-2 2 row-3 2 col-3
#include “stdio.h” #define ROW 100 #define COL 100 int main(){
int row, col, matrix[ROW][COL]; int xx_row, sx_row, xx_col, sx_col; int i, j;
} }
xx_row________;
在这里继续插入代sx码_row________;
xx_col ________;
return 0;
sx_col ________;
}
}
xx_row #include “stdio.h”sx_row #define ROW 100xx_col
= ____0____; = _r_o_w__-_1__; = ____0____;
计算概论与程序设计基础 北京大学 11 C程序中的字符串 (11.5.1) 课件
for (len2 = 0; str2[len2] != '\0'; len2++) str1[len1++] = str2[len2];
str1[len1] = '\0'; } else {
for (len1 = 0; str2[len1] != '\0'; len1++) str2[len2++] = str1[len1];
例2 字符串连接
定义: char str1[40], str2[40]; cin.getline(str1,20); cin.getline(str2,20);
计算长度:
for (len1 = 0; str1[len1] != '\0'; len1++); for (len2 = 0; str2[len2] != '\0'; len2++);
例1 字符串加密
思路:
读入字符串(想一下以什么方式输入?) 从字符头到尾循环:
●是’Z’则直接赋值’A’,跳过以下步骤 ●是’z’则直接赋值’a’,跳过以下步骤 ●空格不做处理,跳过以下步骤 ●其他字符++
输出新字符串;
#include <iostream> using namespace std; int main()
例1 字符串加密
{
char str[200];
while (cin.getlinent i = 0; str[i] != '\0'; i++)
{
if (str[i] == 'Z')
str1[len1] = '\0'; } else {
for (len1 = 0; str2[len1] != '\0'; len1++) str2[len2++] = str1[len1];
例2 字符串连接
定义: char str1[40], str2[40]; cin.getline(str1,20); cin.getline(str2,20);
计算长度:
for (len1 = 0; str1[len1] != '\0'; len1++); for (len2 = 0; str2[len2] != '\0'; len2++);
例1 字符串加密
思路:
读入字符串(想一下以什么方式输入?) 从字符头到尾循环:
●是’Z’则直接赋值’A’,跳过以下步骤 ●是’z’则直接赋值’a’,跳过以下步骤 ●空格不做处理,跳过以下步骤 ●其他字符++
输出新字符串;
#include <iostream> using namespace std; int main()
例1 字符串加密
{
char str[200];
while (cin.getlinent i = 0; str[i] != '\0'; i++)
{
if (str[i] == 'Z')
计算概论与程序设计基础 北京大学 16 指针三 (16.3.1) 课件
int *p,*q; p = getInt1(); q = getInt2(); cout << *p << endl; return 0; }
int *getInt1() {
static int value1 = 20; return &value1; } int *getInt2() { static int value2 = 30; return &value2; }
int *p,*q; p = getInt1(); q = getInt2(); cout << *p << endl; return 0; }
int *getInt1() {
int value1 = 20; return &value1; } int *getInt2() { int value2 = 30; return &value2; }
int *get(int arr[ ][4], int n, int m)
{ int *pt; pt = *(arr + n - 1) + m-1; return(pt);
}
返回指针值的函数
判断程序的执 行结果:
#include<iostream> using namespace std; int *getInt1() {
确保返回地址的意义
返回一个处于生命周期中的变量的地址
返回全局变量的地址,而非局部变量的地址
#include<iostream.h> int value1 = 20; int value2 = 30; int main() { int *p,*q;
p = getInt1(); q = getInt2(); cout << *p << endl; return 0; }
int *getInt1() {
static int value1 = 20; return &value1; } int *getInt2() { static int value2 = 30; return &value2; }
int *p,*q; p = getInt1(); q = getInt2(); cout << *p << endl; return 0; }
int *getInt1() {
int value1 = 20; return &value1; } int *getInt2() { int value2 = 30; return &value2; }
int *get(int arr[ ][4], int n, int m)
{ int *pt; pt = *(arr + n - 1) + m-1; return(pt);
}
返回指针值的函数
判断程序的执 行结果:
#include<iostream> using namespace std; int *getInt1() {
确保返回地址的意义
返回一个处于生命周期中的变量的地址
返回全局变量的地址,而非局部变量的地址
#include<iostream.h> int value1 = 20; int value2 = 30; int main() { int *p,*q;
p = getInt1(); q = getInt2(); cout << *p << endl; return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void main(int argc, char *argv[]) {
char buffer[80];
void (*pf)(char s1[],char s2[],char s3[]); if (argc!=3) error = 1; else{
if (!strcmp(argv[0],"add"))
声明函数指针的格式: 类型 (* 指针变量名)(参数列表);
例如: int (*fp) (int i,intj);
声名了一个函数指针。该函数指针可以指向带两个整数 变量且返回一个整数值的函数。
int add(int a,intb) {
return(a+b); }
fp = add;
//fp指向add函数
将编译链接后的可执行程序拷贝到一个目录中, 通过命令行方式启动运行并输入不同的参数
利用字符串处理函数获得所需要的参数内容
例子1.2 通过sscanf()来得到所需要的数字内容
#include < stdio.h >
void main(int argc, char *argv[]) {
float ave=0,temp; for ( int i=1; i < argc; i++ ) // start from the second para {
void main(int num, char *arglist[]) {
int i,j,len,arg[10]; for (i=1;i<num;i++) //从第二个参数开始 {
// 检查字符串中有没有不是数字的字符出现。这里没有处理负数 len=strlen(arglist[i]); for ( int j=0; j < len; j++ ){
sscanf(argv[i],"%f",&temp); ave += temp; } printf("The average is:%f",ave/(float)(i-1)); }
具体运行情况如下:
使用字符串检验、转换函数
int atoi( const char *string ); 将一个连续的数字串转换为 整数。
pf=add; else if (!strcmp(argv[0],"addc"))
pf = addc; else e指向add //指向addc
if (!error){ pf(argv[1], argv[2], buffer); printf("result is:%s\n", buffer);
i = atoi(st1);
//这里需要先对输入参数进行检查
j = atoi(st2);
sprintf(str,"%d",i+j);
}
void addc (char st1[],char st2[],char str[]) {
strcpy(str,st1); strcat(str,st2); }
#include < stdio.h > #include < stdlib.h > #include <string.h> void add (char st1[],char st2[],char str[]); void addc (char st1[],char st2[],char str[]); int error = 0;
printf("parameter[%d]:%d\n", j, arg[j]); } }
第二部分 函数指针
函数指针顾名思义就是指向函数的指针。 以同类型函数的地址作为值,可以通过间 接访问运算来访问所指向的函数。
函数指针的声明
在开始函数指针生命之前首先要了解一下函数的类 型。
函数的声明包含: 类型 函数名(参数表);三个部分组成
double atof( const char *string ); 将一个连续的数字串转 换为双精度浮点数。
为了避免使用时碰到错误输入的其他字符的干扰,应当先 对输入的字符串进行检查,也确认是连续的数字串
#include < stdio.h > #include < stdlib.h > #include < string.h >
参数 argc-1 \0
例子1.1 直接打印所有命令行参数
#include < stdio.h >
void main(int argc, char *argv[]) {
for ( int i=0; i < argc; i++ ) {
printf("parameter[%d]:%s\n",i,argv[i]); } }
if ( arglist[i][j] < '0' || arglist[i][j] > '9' ){
printf("error input"); num=0; break;
} } arg[i-1] = atoi(arglist[i]); } if (num){ printf("I get %d numbers\n",i-1); for (j=0;j<i-1;j++)
函数指针的引用格式:
int i=(*fp)(para1,para2 ); //实际调用fp指向的函数
也可以简化为:
int i= fp(para1,para2 );
通过命令行参数来控制程序的执行
void add (char st1[],char st2[],char str[])
{
int i,j;
命令行参数、函数 指针、位运算、宏
Hu Junfeng 2016/10/26
第一部分 命令行参数
主函数一般同时接受一对参数: int argc, char* argv[]
argv[0] argv[1] argv[2] argv[3]
…… argv[argc-1]
程序名 参数1\0 参数2\0 参数3\0
} else
printf("error code:%d", error); }
The preprocessor
overview macros file inclusion conditional compilation
15
Preprocessor Overview
performs:
macro substitution conditional compilation inclusion of named files