C语言 程序设计基础与试验 刘新国、2012年秋.

Slides:



Advertisements
Similar presentations
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
Advertisements

《C语言程序设计》复习
C语言程序设计 主讲教师 :张群燕 电话:
Loops.
C#程序设计案例教程 第3章 程 序 结 构.
第一章 C语言概述 计算机公共教学部.
项目五——校园一卡通程序功能模块化设计 5-1项目显示查询和退出函数设计.
请将手机调整到静音状态 实验网站:program3.ccshu.net 资源网站:class.ccshu.org/ /
補充: Input from a text file
第三章 控制结构.
程式設計實作.
C语言程序设计 第八章 函数.
第一章 程序设计入门.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
Class 2 流程控制-選擇敘述與迴圈.
選擇排序法 通訊一甲 B 楊穎穆.
第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar()
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
C程序设计.
Chap 2 用C语言编写程序 2.1 在屏幕上显示 Hello World! 2.2 求华氏温度 100°F 对应的摄氏温度
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
Introduction to the C Programming Language
Chap 3 分支结构 3.1 简单的猜数游戏 3.2 四则运算 3.3 查询自动售货机中商品的价格.
第四章 C 语言中的输入和输出.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
数组 梁春燕 华电信息管理教研室.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
程式結構&語法.
第三章 C++的语句和简单的程序设计 主要内容:
第 二 章 数据类型、运算符与表达式.
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
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程序设计.
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
C程序设计.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第九章 指针.
第二章 类型、对象、运算符和表达式.
第四章 C 语言中的输入和输出.
C程序设计.
程序设计基础.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
本节内容 指针类型.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
Introduction to the C Programming Language
C/C++基礎程式設計班 字元與字串 講師:林業峻 CSIE, NTU 3/14, 2015.
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
多重條件選擇敘述
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
C语言基础学习 从外行到入门.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

C语言 程序设计基础与试验 刘新国、2012年秋

程序设计语言的语法 C语言的主要“单词” (1)标识符: C语言的标识符规定由字母、数字以及下划线组成,且第一个字符必须是字母或下划线。 (3)自定义标识符: 包括在程序中定义的变量名、数据类型名、函数名以及符号常量名。有意义的英文单词 (4)常量: 常量是有数据类型的,如,123、12.34 (5)运算符。代表对各种数据类型实际数据对象的运算。如,+(加)、-(减)、*(乘)、/(除)、%(求余)、>(大于)

程序设计语言的语法 C语言的主要语法单位 (1)表达式: 运算符与运算对象组合就形成了表达试。如,2 + 3 * 4 (2)变量定义: 变量也有数据类型,所以在定义变量时要说明相应变量的类型。如: int i; (3)语句: 语句是程序最基本的执行单位,程序的功能就是通过对一系列语句的执行来实现的。 (4)函数定义与调用

程序设计语言的语法 语句: 表达式语句:表达式加分号“;” 分支语句:实现分支控制过程 循环语句:实现循环控制的过程 if (a > b) x = a; else x = b; 循环语句:实现循环控制的过程 sum = 0; /* 初始化sum和i */ i = 1; while (i <= 100) { /* while循环语句 */ sum = sum + i; i = i + 1; } 复合语句:用一对“{ }”,将若干语句顺序组合在一起就形成了一个程序段。

程序设计语言的语法 函数定义与调用: 函数是完成特定任务的独立模块,函数的使用最主要涉及到函数的定义与调用。

函数申明与调用 int main(void) /* 主函数 */ { int n; int factorial(int n); /* 函数声明 */   scanf("%d", &n); /* 输入一个整数 */ printf(“%d\n”, factorial(n)); /* 调用函数计算阶乘 */ return 0; }  int factorial(int n) { int i, fact = 1;   for(i = 1; i <= n; i++) fact = fact * i; return fact;

输入输出语句 printf(格式控制字符串, 输出参数1, … , 输出参数n); scanf(格式控制字符串, 输入参数1, … , 输入参数n); %c    一个字符  %%    打印一个百分号 %d    有符号十进制整数  %i 有符号十进制数(与%d相同) %f    浮点数、十进制记数法   %s    字符串 %p    指针 

输入输出语句 %o 无符号八进制整数 %u 无符号十进制整数 %x 使用十六进制数字0f的无符号 十六进制整数 十六进制整数  %X    使用十六进制数字0f的无符号 十六进制整数

输入输出语句 %e 浮点数、e-记数法 %E 浮点数、E-记数法 %g 根据数值不同自动选择%f或%e.

scanf-格式控制字符串 格式控制字符串: 格式控制说明: 按指定的格式输入数据, %… 普通字符:原样输入 例如: 与数据类型有关 int型 :%d float型:%f double型:%lf 普通字符:原样输入 例如: scanf("%lf", &x); 尽量不要出现普通字符 scanf("x=%lf", &x); 输入: 9.5 输入: x=9.5

else – if 语句 if (表达式1) 语句1 else if (表达式2) 语句2 …… if((ch >= 'a' && ch <= 'z' )||( ch >= 'A' && ch <= 'Z')) letter ++; else if(ch >= '0' && ch <= '9') digit ++; else other ++; if (表达式1) 语句1 else if (表达式2) 语句2 …… else if (表达式n-1) 语句n-1 else 语句n 假 表达式1 表达式2 语句1 语句2 语句n-1 语句n 真 表达式n-1 …

3.2.2 switch语句 处理多分支选择问题,3种情况 1、在switch语句的每个语句段中都使用break语句 case 常量表达式1:语句段1; break; case 常量表达式2:语句段2 ; break; ....… case 常量表达式n:语句段n ; break; default : 语句段n+1 ; break; }

2、在switch中不使用break switch(表达式){ case 常量表达式1:语句段1; case 常量表达式2:语句段2; ....… case 常量表达式n:语句段n; default : 语句段n+1; }

2.4.2 for语句-循环语句 for(表达式1;表达式2;表达式3) 循环体语句 实现C语句的重复执行 3个表达式、循环体语句 !书写顺序和执行顺序不同 !表达式1只执行一次

4.1.2 while 语句 while (条件表达式) 循环体语句; 循环条件 循环体 假 表达式 真 循环体语句 while下一条语句 xgliu@cad.zju.edu.cn 13858115132

while 语句说明 while 语句和for语句 都是在循环前先判断条件 for(表达式1; 表达式2; 表达式3) 循环体语句 表达式1; while (表达式2) { 循环体语句; 表达式3; } 改写for语句为while 语句 xgliu@cad.zju.edu.cn 13858115132

4.2.2 do - while 语句 do { 循环体语句 } while (表达式) 先循环 后判断 循环体语句 假 表达式 真 xgliu@cad.zju.edu.cn 13858115132

break 语句 while(exp){ 语句1 if (expb) break; 语句2 } 当循环有多个出口时: 区分与处理结束条件 for (i = 2; i <= m/2; i++) if (m % i == 0) break; if (i > m/2 ) printf("Yes"); else printf("No!\n"); break 语句 for(i = 2; i <= m/2; i++) if(m%i == 0){ printf("No!\n"); break; } printf("Yes"); while(exp){ 语句1 if (expb) break; 语句2 } 真 假 exp 语句1 expb 语 句2 循环体 当循环有多个出口时: 区分与处理结束条件 xgliu@cad.zju.edu.cn 13858115132

continue 语句 while(exp){ 语句1 if (expb) continue; 语句2 } 真 假 exp 语句1 expb 语 句2 循环体 while(exp){ 语句1 if (expb) continue; 语句2 } 跳过continue后面的语句,继续下一次循环 xgliu@cad.zju.edu.cn 13858115132

复合语句 + 嵌套 do { 循环体语句 } while (表达式) while(…..){ } for(…..){

5.1.2 函数的定义 函数是指完成一个特定工作的独立程序模块。 main()也是一个函数,C程序由一个main()或多个函数构成。 5.1.2 函数的定义 函数是指完成一个特定工作的独立程序模块。 库函数:由C语言系统提供定义 如scanf()、printf()等函数 自定义函数:需要用户自己定义 如计算圆柱体体积函数cylinder() main()也是一个函数,C程序由一个main()或多个函数构成。 程序中一旦调用了某个函数,该函数就会完成一些特定的工作,然后返回到调用它的地方。 函数经过运算,得到一个明确的运算结果,并需要回送该结果。例如,函数cylinder()返回圆柱的体积。 函数完成一系列操作步骤,不需要回送任何运算结果。

1.返回运算结果的函数定义 函数返回值的类型 函数类型 函数名(形参表) /* 函数首部 */ { /* 函数体 */ 函数实现过程 double cylinder (double r, double h) { double result; result = 3.1415926 * r * r * h; return result; } 1.返回运算结果的函数定义 函数返回值的类型 没有分号 函数类型 函数名(形参表) /* 函数首部 */ { /* 函数体 */ 函数实现过程 return 表达式; } 只能返回一个值 把函数运算的结果回送给主函数

形参 类型1 参数1 ,类型2 参数2 ,……,类型n 参数n 参数之间用逗号分隔,每个参数前面的类型都必须分别写明 函数类型 函数名(形参表){ 函数实现过程 return 表达式; } 不能写成 double r, h double cylinder (double r, double h) { double result; result =3.1415926 * r * r * h; return result; } 类型1 参数1 ,类型2 参数2 ,……,类型n 参数n 参数之间用逗号分隔,每个参数前面的类型都必须分别写明

1.函数调用的形式和过程 函数名(实参表) 使用返回值: 完成操作: 常量、变量、表达式 使用返回值: volume = cylinder (radius, height ); printf(“%f \n” , cylinder (radius, height )); 完成操作: pyramid(5); 常用于返回结果的函数的调用 常用于void类型函数的调用 可以出现在计算/判断表达式中: (ch=getchar())!=‘\n’ getchar()!=‘\n’

2.参数传递 函数定义时的参数被称为形式参数(简称形参) 函数调用时的参数被称为实际参数(简称实参) 实参形参 double cylinder (double r, double h); 函数调用时的参数被称为实际参数(简称实参) volume = cylinder (radius, height); 实参形参 在参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致 形参:变量,用于接受实参传递过来的值 实参:常量、变量或表达式 单向传递

3.函数结果返回 函数返回的两种情况 函数结果返回的形式: 完成确定的运算,有一个运算结果返回给主调函数。 完成指定工作,没有确定的运算结果需返回给主调函数(函数类型void)。 函数结果返回的形式: return 表达式; return (表达式);

5.3 变量与函数 5.3.1 局部变量和全局变量 5.3.2 变量生命周期和静态局部变量

5.3.1 局部变量和全局变量 局部变量 全局变量 在函数内定义的变量(包括形参) 定义在复合语句内的变量 作用范围:本函数内部 定义在复合语句内的变量 作用范围:复合语句内部 全局变量 在函数以外定义的变量,不从属于任一函数。 作用范围:从定义处到源文件结束(包括各函数)

例5-6 在复合语句中定义局部变量。 #include <stdio.h> int main (void) { int a; 例5-6 在复合语句中定义局部变量。 #include <stdio.h> int main (void) { int a; a = 1; { /* 复合语句开始 */ int b = 2; b = a + b; a = a + b; } /* 复合语句结束 */ printf ("%d " , a ); return 0; } 4 b:小范围内的临时变量

例5-7 全局变量定义 若局部变量与全局变量同名,局部变量优先 #include "stdio.h" 例5-7 全局变量定义 #include "stdio.h" int x; /* 定义全局变量x */ int f( ) { int x = 4; /* x为局部变量 */ return x; } int main(void) int a = 1; x = a; /* 对全局变量 x 赋值 */ a = f( ); /* a的值为4 */ int b = 2; b = a + b; /* b的值为4 */ x = x + b; /* 全局变量运算 */ printf("%d %d" , a, x); return 0; 若局部变量与全局变量同名,局部变量优先 4, 7

变量作用范围示例 x=? a=? b=? b=? x=5 b=6 t=4 a没定义 x=? b=? t=? a=? int x=1; void main( ) { int a=2; …….. { int b=3; ….. } f( ); ……….. int t=4 ; void f( ) { int x=5, b=6; ……. int a=7; x=? a=? b=? b=? x=5 b=6 t=4 a没定义 x=? b=? t=? a=?

5.3.2 变量生命周期和静态局部变量 自动变量(auto): 普通的局部变量 函数调用时,定义变量,分配存储单元。 5.3.2 变量生命周期和静态局部变量 自动变量(auto): 普通的局部变量 int x, y;  auto int x, y; char c1;  auto char c1; 函数调用时,定义变量,分配存储单元。 函数调用结束,收回存储单元。 全局变量:从程序执行开始,到程序的结束,存储单元始终保持。 变量生命周期 变量从定义开始分配存储单元,到运行结束存储单元被回收的整个过程。

存储区 存储类型: 动态存储:自动变量 静态存储:全局变量、静态局部变量 用户存储空间 数 据 区 静态存储区 动态存储区

静态局部变量 static 类型名 变量表 作用范围:局部变量 生命周期:全局变量

字符常量 'a' 'z' 'A' 'Z' '0' '9' ' ' '\n' ASCII字符集:列出所有可用的字符 '0'-'9' 'A'-'Z' 'a'-'z' 区分数字 1 和数字字符 '1'

转义字符 反斜杠后跟一个字符或数字 字符常量,代表一个字符 '\n' '\101' '\x41' 'A' 所有字符都可以用转义字符表示

自增运算符++和自减运算符-- n++ ++n n-- --n (只适合变量运算) 使变量的值增1或减1 ++n n++ n = n + 1 int n; n++ ++n n-- --n (只适合变量运算) 使变量的值增1或减1 ++n n++ n = n + 1 --n n-- n = n - 1 取变量的值作为表达式的值 ++n:n = n + 1;取n值作为表达式 ++n 的值 n++:取n值作为表达式 n++ 的值;n = n + 1

6.5.6 逗号表达式 表达式1, 表达式2, ……, 表达式n 先计算表达式1,然后计算表达式2,……,最后计算表达式n的值,并将表达式n的值作为逗号表达式的值. int a, b, c; (a=2), (b=3), (c=a+b); 逗号运算符的优先级最低,左结合 a=2, b=3, c=a+b

复合赋值运算符 赋值运算符 赋值表达式 简单赋值运算符 = 复合赋值运算符 变量 赋值运算符 表达式 复合算术赋值运算符 += -= *= /= %= 复合位赋值运算符 赋值表达式 变量 赋值运算符 表达式 x += exp 等价于 x = x + exp x *= y - 3 x = x * (y-3)

看运算符优先级 261页

7.1.2 一维数组的定义和引用 1、定义 类型名 数组名[数组长度] int a[10]; char c[200]; 7.1.2 一维数组的定义和引用 1、定义 类型名 数组名[数组长度] 类型名:数组元素的类型 数组名:数组(变量)的名称,标识符 数组长度:常量表达式,给定数组的大小 int a[10]; 定义一个含有10个整型元素的数组 a char c[200]; 定义一个含有200个字符元素的数组 c float f[5]; 定义一个含有5个浮点型元素的数组 f

字符串 char st[20]=”hello\0world!”; printf(“%d,%d\n”,strlen(st),sizeof(st)); H e l o \0 w r d !

指针 int c[ ]={10, 30, 5}, *pc; fo(pc=c; pc<c+2; pc++) printf("%d#", *pc); pc C C+0 C+1 C+2

7.2.2 二维数组的定义和引用 1、定义 类型名 数组名[行长度][列长度] int a[3][2]; int b[5][10]; 类型名 数组名[行长度][列长度] int a[3][2]; 定义1个二维数组a,3行2列,6个元素 int b[5][10]; 定义1个二维数组a,5 行 10 列, 50 个元素

二维数组在内存中的存放方式 int a[3][2]; 二维数组的元素在内存中按行/列方式存放 a[0][0] a[0][1] 3 行 2 列, 6 个元素 表示1个3行2列的矩阵 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 二维数组的元素在内存中按行/列方式存放 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] a[0][4] = 5是什么结果? A[1][4] = 5呢?

指针变量的定义 类型名 * 指针变量名 int * p; 指针变量名是 p,不是*p * 是指针声明符 int k, *p1, *p2; 类型名 * 指针变量名 int * p; 指针变量名是 p,不是*p * 是指针声明符 int k, *p1, *p2; 等价于: int k; int *p1; int *p2;

指针作为函数参数的应用 swap2 (&a, &b); void swap2 (int *px, int *py) { int t; *px = *py; *py = t; } a b px py 1 2 2 1 After calling swap1: a=1, b=2 After calling swap2: a=2, b=1 After calling swap3: a=1, b=2 要通过函数调用来改变主调函数中某个变量的值: (1) 在主调函数中,将该变量的地址或者指向该变量的指针作为实参 (2) 在被调函数中,用指针类型形参接受该变量的地址 (3) 在被调函数中,改变形参所指向变量的值

b int sum (int *array, int n) { int i, s = 0; for(i=0; i<n; i++) s += array[i]; return(s); } int main(void ) { int i; int b[5] = {1, 4, 5, 7, 9}; printf("%d\n", sum(b, 5)); return 0; } b b[0] b[5] sum(b, 5) b[0]+b[1]+...+b[4] array sum(b, 3) b[0]+b[1]+b[2] sum(b+1, 3) b[1]+b[2]+b[3] sum(&b[2], 3) b[2]+b[3]+b[4]

void sort(int *array, int n) { int i, j, t; for(i=1; i<n; i++) for(j=0; j<n-i; j++) if(array[j]>array[j+1]){ t = array[j]; array[j] = array[j+1]; array[j+1] = t; } int main(void ) { int i, a[10]; for(i=0; i<10; i++) scanf("%d", &a[i]); sort(a, 10); printf("%d ", a[i]); printf("\n"); return 0; }

8.4.2 字符串和字符指针 字符串常量 "array" "point" 用一对双引号括起来的字符序列 被看做一个特殊的一维字符数组,在内存中连续存放 实质上是一个指向该字符串首字符的指针常量 char sa[ ] = "array"; char *sp = "point";

数组名sa、指针sp和字符串 "string" 的值都是地址 char sa[ ] = "array"; char *sp = "point"; printf("%s ", sa); printf("%s ", sp); printf("%s\n", "string"); printf("%s ", sa+2); printf("%s ", sp+3); printf("%s\n", string"+1); ray nt tring array point string 数组名sa、指针sp和字符串 "string" 的值都是地址

字符数组与字符指针的重要区别 char sa[ ] = "This is a string"; char *sp = "This is a string"; sa T h i s a t r n g \0 sp T h i s a t r n g \0 如果要改变数组sa所代表的字符串,只能改变数组元素的内容 如果要改变指针sp所代表的字符串,通常直接改变指针的值,让它指向新的字符串

示例 char sa[ ] = "This is a string"; char *sp = "This is a string"; strcpy (sa, "Hello"); sp = "Hello"; sa = “Hello”; 非法 数组名是常量,不能对它赋值