1 / 53

C 语言 程序设计基础与试验

C 语言 程序设计基础与试验. 复习 -1. 程序设计语言的语法. C 语言的主要“单词” (1) 标识符 : C 语言的标识符规定由字母、数字以及下划线组成,且第一个字符必须是字母或下划线。 (2) 保留字 (关键字): 它们是 C 语言规定的、赋予它们以特定含义、有专门用途的标识符。 (3) 自定义标识符 : 包括在程序中定义的变量名、数据类型名、函数名以及符号常量名。 有意义的英文单词 (4) 常量 : 常量是有数据类型的,如,123、12.34

lolita
Download Presentation

C 语言 程序设计基础与试验

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C语言程序设计基础与试验 复习-1

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

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

  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; } • 复合语句:用一对“{ }”,将若干语句顺序组合在一起就形成了一个程序段。

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

  6. 函数申明与调用 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; }

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

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

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

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

  11. 表达式1 假 表达式2 真 假 真 … 表达式n-1 假 真 语句1 … 语句2 语句n-1 语句n else – if 语句 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

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

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

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

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

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

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

  18. exp 真 语句1 循环体 真 expb 假 语 句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 } • 当循环有多个出口时: • 区分与处理结束条件 xgliu@cad.zju.edu.cn 13858115132

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

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

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

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

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

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

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

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

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

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

  29. 例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; } b:小范围内的临时变量

  30. 例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; }

  31. 变量作用范围示例 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=?

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

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

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

  35. 字符常量 'a' 'z' 'A' 'Z' '0' '9' ' ' '\n' ASCII字符集:列出所有可用的字符 每个字符:惟一的次序值( ASCII 码) '0'-'9' 'A'-'Z' 'a'-'z' 区分数字 1 和数字字符 '1'

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

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

  38. 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

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

  40. 看运算符优先级 261页

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

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

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

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

  45. 二维数组在内存中的存放方式 二维数组的元素在内存中按行/列方式存放 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] int a[3][2]; 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][4] = 5是什么结果? A[1][4] = 5呢?

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

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

  48. int sum (int *array, int n) { int i, s = 0; for(i=0; i<n; i++) s += array[i]; return(s); } b b[0] array b[5] int main(void ) { int i; int b[5] = {1, 4, 5, 7, 9}; printf("%d\n", sum(b, 5)); return 0; } sum(b, 5) b[0]+b[1]+...+b[4] 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]

  49. 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); for(i=0; i<10; i++) printf("%d ", a[i]); printf("\n"); return 0; }

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

More Related