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

53
C 语语 语语语语语语语语语 语语 -1 1

Upload: lolita

Post on 17-Jan-2016

69 views

Category:

Documents


6 download

DESCRIPTION

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

TRANSCRIPT

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

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

1

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

程序设计语言的语法 C 语言的主要“单词”

( 1 )标识符 : C 语言的标识符规定由字母、数字以及下划线组成,且第一个字符必须是字母或下划线。

( 2 )保留字 ( 关键字 ): 它们是 C 语言规定的、赋予它们以特定含义、有专门用途的标识符。

( 3 )自定义标识符 : 包括在程序中定义的变量名、数据类型名、函数名以及符号常量名。有意义的英文单词

( 4 )常量 : 常量是有数据类型的,如, 123 、 12.34

( 5 )运算符。代表对各种数据类型实际数据对象的运算。如, + (加)、 - (减)、 * (乘)、 / (除)、 %(求余)、 > (大于)

2

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

程序设计语言的语法 C 语言的主要语法单位

( 1 )表达式 : 运算符与运算对象组合就形成了表达试。如, 2 + 3 * 4

( 2 )变量定义 : 变量也有数据类型,所以在定义变量时要说明相应变量的类型。如 : int i;

( 3 )语句 : 语句是程序最基本的执行单位,程序的功能就是通过对一系列语句的执行来实现的。

( 4 )函数定义与调用 3

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

程序设计语言的语法语句:

表达式语句:表达式加分号“ ;” 分支语句:实现分支控制过程

if (a > b) x = a;else x = b;

循环语句:实现循环控制的过程 sum = 0; /* 初始化 sum 和 i */i = 1; while (i <= 100) { /* while 循环语句 */ sum = sum + i; i = i + 1;}

复合语句:用一对“ { }” ,将若干语句顺序组合在一起就形成了一个程序段。

4

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

程序设计语言的语法

函数定义与调用: 函数是完成特定任务的独立模块,函数的使用

最主要涉及到函数的定义与调用。

5

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

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

6

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

输入输出语句printf( 格式控制字符串 , 输出参数 1, … , 输出参数

n);

scanf( 格式控制字符串 , 输入参数 1, … , 输入参数 n);

%c     一个字符 %%     打印一个百分号%d     有符号十进制整数 %i 有符号十进制数(与% d 相同)%f     浮点数、十进制记数法  %s     字符串%p     指针  7

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

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

十六进制整数 %X     使用十六进制数字0 f 的无符号 十六进制整数

8

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

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

或% e .%G    根据数值不同自动选择% f

或% e.

9

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

scanf -格式控制字符串格式控制字符串:

格式控制说明 : 按指定的格式输入数据 , %…与数据类型有关 int 型 : %d float 型: %f double 型: %lf

普通字符:原样输入例如:scanf("%lf", &x);

输入 : 9.5

scanf("x=%lf", &x);

输入 : x=9.5

尽量不要出现普通字符

10

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

else – if 语句if ( 表达式 1) 语句 1else if ( 表达式 2) 语句 2……else if ( 表达式 n-1) 语句 n-1else 语句 n

if((ch >= 'a' && ch <= 'z' )||( ch >= 'A' && ch <= 'Z'))

letter ++; else if(ch >= '0' && ch <= '9') digit ++;else other ++;

假表达式

1

表达式2

语句 1 语句 2 语句 n-1 语句 n

表达式 n-1

假真

11

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

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;

}12

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

2 、在 switch 中不使用break

switch( 表达式 ){

case 常量表达式 1 :语句段 1;

case 常量表达式 2 :语句段 2;

....…

case 常量表达式 n :语句段 n;

default : 语句段 n+1;

}

13

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

for( 表达式 1 ;表达式 2 ;表达式 3) 循环体语句

实现 C 语句的重复执行

2.4.2 for 语句-循环语句

3 个表达式、循环体语句!书写顺序和执行顺序不同!表达式 1 只执行一次

14

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

4.1.2 while 语句while ( 条件表达式 ) 循环体语句 ;

while 下一条语句

表达式

循环体语句

循环条件

循环体

[email protected] 13858115132 15

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

while 语句和 for 语句都是在循环前先判断条件

while 语句说明

表达式 1 ;while ( 表达式 2) {

循环体语句; 表达式 3 ;}

[email protected] 13858115132 16

for( 表达式 1; 表达式 2; 表达式3)

循环体语句

改写 for 语句为 while 语句

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

4.2.2 do - while 语句do {

循环体语句} while ( 表达式 ) 先循环

后判断真

假表达

循环体语句

do-while 的下一条语句

[email protected] 13858115132 17

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

break 语句while(exp){

语句 1

if (expb) break;

语句 2

}

假 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");

当循环有多个出口时:• 区分与处理结束条件

for(i = 2; i <= m/2; i++)

if(m%i == 0){

printf("No!\n");

break;

}

printf("Yes");

[email protected] 13858115132 18

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

continue 语句

while(exp){

语句 1

if (expb) continue;

语句 2

}

假 exp

语句1

假expb

语 句 2

循环

体真

跳过 continue 后面的语句,继续下一次循环

[email protected] 13858115132 19

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

复合语句 + 嵌套do {

循环体语句} while ( 表达式 )

while(…..){

循环体语句}

for(…..){

循环体语句}

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

5.1.2 函数的定义 函数是指完成一个特定工作的独立程序模块。

库函数:由 C 语言系统提供定义如 scanf ()、 printf ()等函数

自定义函数:需要用户自己定义如计算圆柱体体积函数 cylinder ()

main() 也是一个函数, C 程序由一个 main() 或多个函数构成。

程序中一旦调用了某个函数,该函数就会完成一些特定的工作,然后返回到调用它的地方。 函数经过运算,得到一个明确的运算结果,并需要回送该结果。例如,函数 cylinder() 返回圆柱的体积。

函数完成一系列操作步骤,不需要回送任何运算结果。

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

1 .返回运算结果的函数定义

函数类型 函数名(形参表) /* 函数首部 */

{ /* 函数体 */

函数实现过程 return 表达式;}

把函数运算的结果回送给主函数

只能返回一个值

函数返回值的类型没有分号

double cylinder (double r, double h){ double result; result = 3.1415926 * r * r * h; return result;}

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

形参

类型 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;}

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

1 .函数调用的形式和过程

使用返回值:volume = cylinder (radius, height );

printf(“%f \n” , cylinder (radius, height )); 完成操作:

pyramid(5);

常用于 void 类型函数的调用

常用于返回结果的函数的调用

常量、变量、表达式函数名(实参表)

可以出现在计算 / 判断表达式中 :(ch=getchar())!=‘\n’getchar()!=‘\n’

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

2 .参数传递 函数定义时的参数被称为形式参数(简称形参)

double cylinder (double r, double h) ; 函数调用时的参数被称为实际参数(简称实参)

volume = cylinder (radius, height);

实参形参 在参数传递过程中,实参把值复制给形参。 形参和实参一一对应:数量一致,类型一致,顺序一致 形参:变量,用于接受实参传递过来的值 实参:常量、变量或表达式

单向传递

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

3 .函数结果返回 函数返回的两种情况

完成确定的运算,有一个运算结果返回给主调函数。

完成指定工作,没有确定的运算结果需返回给主调函数(函数类型 void )。

函数结果返回的形式:return 表达式;return ( 表达式 ) ;

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

5.3 变量与函数

5.3.1 局部变量和全局变量

5.3.2 变量生命周期和静态局部变量

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

5.3.1 局部变量和全局变量局部变量

在函数内定义的变量(包括形参)作用范围:本函数内部

定义在复合语句内的变量作用范围:复合语句内部

全局变量在函数以外定义的变量,不从属于任一函数。

作用范围:从定义处到源文件结束(包括各函数)

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

例 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:小范围内的临时变量

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

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

若局部变量与全局变量同名,局部变量优先

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

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

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

自动变量( auto ) : 普通的局部变量int x, y; auto int x, y;

char c1; auto char c1;函数调用时,定义变量,分配存储单元。函数调用结束,收回存储单元。

全局变量:从程序执行开始,到程序的结束,存储单元始终保持。变量生命周期

变量从定义开始分配存储单元,到运行结束存储单元被回收的整个过程。

5.3.2 变量生命周期和静态局部变量

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

存储类型:动态存储:自动变量静态存储:全局变量、静态局部变量

用户存储空间

存储区

数据区

静态存储区动态存储区

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

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

静态局部变量

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

字符常量 'a' 'z' 'A' 'Z' '0' '9' ' ' '\n'

ASCII 字符集:列出所有可用的字符每个字符:惟一的次序值( ASCII 码)

'0'-'9'

'A'-'Z'

'a'-'z'

区分数字 1 和数字字符 '1'

35

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

转义字符

反斜杠后跟一个字符或数字 字符常量,代表一个字符

'\n' '\101' '\x41' 'A'

所有字符都可以用转义字符表示36

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

自增运算符 ++ 和自减运算符 --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

37

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

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

38

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

复合赋值运算符 赋值运算符

简单赋值运算符 =复合赋值运算符

复合算术赋值运算符 += -= *= /= %= 复合位赋值运算符

赋值表达式 变量 赋值运算符 表达式x += exp 等价于 x = x + expx *= y - 3 x = x * (y-3)

39

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

看运算符优先级 261页

40

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

7.1.2 一维数组的定义和引用1 、定义

类型名 数组名 [ 数组长度 ]类型名:数组元素的类型数组名:数组(变量)的名称,标识符数组长度:常量表达式,给定数组的大小

int a[10]; 定义一个含有 10 个整型元素的数组 a

char c[200];定义一个含有 200 个字符元素的数组 c

float f[5];定义一个含有 5 个浮点型元素的数组 f

41

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

字符串char st[20]=”hello\0world!”;

printf(“%d,%d\n”,strlen(st),sizeof(st));

H e l l o \0 w o r l d ! \0

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

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

pc

C C+1 C+2 C+3

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

7.2.2 二维数组的定义和引用1 、定义

类型名 数组名 [ 行长度 ][ 列长度 ]

int a[3][2];定义 1 个二维数组 a , 3 行 2 列, 6 个元素

int b[5][10];定义 1 个二维数组 a , 5 行 10 列, 50 个元素

44

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

二维数组在内存中的存放方式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][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]

45

a[0][4] = 5 是什么结果?A[1][4] = 5呢?

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

指针变量的定义类型名 * 指针变量名int * p;

指针变量名是 p ,不是 *p* 是指针声明符

int k, *p1, *p2; 等价于:int k;int *p1;int *p2;

46

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

指针作为函数参数的应用swap2 (&a, &b);void swap2 (int *px, int *py){ int t; t = *px; *px = *py; *py = t;}

要通过函数调用来改变主调函数中某个变量的值:(1) 在主调函数中,将该变量的地址或者指向该变量的指针作为实参(2) 在被调函数中,用指针类型形参接受该变量的地址 (3) 在被调函数中,改变形参所指向变量的值

a b

px py

1 2

47

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

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]

array

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]

48

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

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;}

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; }

}

49

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

8.4.2 字符串和字符指针 字符串常量

"array""point"用一对双引号括起来的字符序列 被看做一个特殊的一维字符数组 , 在内存

中连续存放 实质上是一个指向该字符串首字符的指针

常量char sa[ ] = "array";char *sp = "point";

50

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

char sa[ ] = "array";

char *sp = "point";

printf("%s ", sa);

printf("%s ", sp);

printf("%s\n", "string");

array point string

printf("%s ", sa+2);

printf("%s ", sp+3);

printf("%s\n", string"+1);

ray nt tring

数组名 sa 、指针 sp 和字符串 "string" 的值都是地址

51

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

字符数组与字符指针的重要区别 char sa[ ] = "This is a string";

char *sp = "This is a string";

sa T h i s i s a s t r i n g \0

sp T h i s i s a s t r i n g \0

如果要改变数组 sa 所代表的字符串,只能改变数组元素的内容

如果要改变指针 sp 所代表的字符串,通常直接改变指针的值,让它指向新的字符串

52

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

示例char sa[ ] = "This is a string";

char *sp = "This is a string";

strcpy (sa, "Hello");

sp = "Hello";

sa = “Hello”; 非法数组名是常量,不能对它赋值

53