C struct student unsigned num char name20 char

  • Slides: 87
Download presentation

C 程序可将上述数据的集合定义为一种结构体类型: struct student { unsigned num; char name[20]; char sex; int age; float

C 程序可将上述数据的集合定义为一种结构体类型: struct student { unsigned num; char name[20]; char sex; int age; float score; char addr[30]; };

如:struct exp 结构体名 { int times; char flag; float meter ; }; 成员表列

如:struct exp 结构体名 { int times; char flag; float meter ; }; 成员表列

例:结构体的嵌套定义 struct date { int month; int day; int year; }; struct student {int

例:结构体的嵌套定义 struct date { int month; int day; int year; }; struct student {int num; char name[20]; char sex; int age; struct date birthday; char addr[30]; } x 1, x 2;

x 1 birthday num name sex age month addr year day 或x 2

x 1 birthday num name sex age month addr year day 或x 2

一、先定义结构,在定义结构变量时对 每个成员赋初值 如:struct student { unsigned No; char name[20]; char sex; float score; };

一、先定义结构,在定义结构变量时对 每个成员赋初值 如:struct student { unsigned No; char name[20]; char sex; float score; }; struct student x 1={8906, "Li Ming ", 'M', 85. 5};

若 x 1 的起始地 2000 8906 址为 2000,则 x 1 2002 L i 在内存中占有的存

若 x 1 的起始地 2000 8906 址为 2000,则 x 1 2002 L i 在内存中占有的存 储单元为: 共用 27个字节 的连续单元 2021 2022 2023 M i n g M 85. 5 No name[20] sex score 2026

三、结构定义与变量定义及初始化合二为一: struct exp { int a; float b; char yn[8]; } x={1234, 56. 7,

三、结构定义与变量定义及初始化合二为一: struct exp { int a; float b; char yn[8]; } x={1234, 56. 7, "test"}; 但不能这样写: struct exp { int a=1234; float b=56. 7; char yn[8]="test"; } x;

二、箭头运算符: 例:struct student { char name [10]; char sex; int age; float score; char

二、箭头运算符: 例:struct student { char name [10]; char sex; int age; float score; char addr[20]; }x 1; struct student p;

如:struct temp { int a; ch ch; } x 1, x 2; main (

如:struct temp { int a; ch ch; } x 1, x 2; main ( ) { x 1. a=10; x 1. ch='a'; 把结构变量x 1的值赋给结构变量x 2. x 2=x 1; printf("%d, %c", x 2. a, x 2. ch); }

5. 可通过sizeof ( )运算符获得结构变量占用的 内存大小 如:struct exp { int num; char ch; char name[20];

5. 可通过sizeof ( )运算符获得结构变量占用的 内存大小 如:struct exp { int num; char ch; char name[20]; float sal; } x 1; main( ) { int size; size=sizeof(x 1); printf("size=%dn", size); }

四、程序实例 例1:请指出下列程序的错误所在: struct person { char name[20]; int count; } x 1={"Zhong. Hua", 10};

四、程序实例 例1:请指出下列程序的错误所在: struct person { char name[20]; int count; } x 1={"Zhong. Hua", 10}; main( ) { int *p; 错误的原因:p不是结构 指针变量 p=&x 1; printf ("%sn%dn", (*p). name, (*p). count) } 可改为:struct person *p;

程序如下: /*exp 14_1. c*/ struct person { char name[20]; int count; } leader[3]={"Li", 0,

程序如下: /*exp 14_1. c*/ struct person { char name[20]; int count; } leader[3]={"Li", 0, "Zhang" , 0, " Hang ", 0}; main ( ) {int i, j; char leader_name[20]; for (i=1; i<=10; i++)

{scanf ("%s", leader_name); for (j=0; j<3; j++) if (strcmp (leader_name, leader[j]. name)= =0) leader[j].

{scanf ("%s", leader_name); for (j=0; j<3; j++) if (strcmp (leader_name, leader[j]. name)= =0) leader[j]. count++; } printf ("n"); for (i=0; i<3; i++) printf("%5 s : %dn", leader[i]. name, leader[i]. count); }

运行情况如下: 输入: Li name count Li 0 Hang Zhang 0 Zhang Hang 0 Li

运行情况如下: 输入: Li name count Li 0 Hang Zhang 0 Zhang Hang 0 Li Zhang Hang Li 显示: Li : 4 Hang Zhang : 3 Zhang Hang : 3 Li

例1. 把整个结构传递给参数 #include <stdio. h> struct tree { int x; char *s; } t;

例1. 把整个结构传递给参数 #include <stdio. h> struct tree { int x; char *s; } t; void fun(struct tree t ) { t. x=t. x+10; t. s="computer"; return; }

main( ) { t. x=6; t. s="minicomputer"; func(t); printf("%d, %sn", t. x, t. s);

main( ) { t. x=6; t. s="minicomputer"; func(t); printf("%d, %sn", t. x, t. s); } 程序运行结果: 6, minicomputer

例2. 把指向结构的指针作为函数的参数 #include <stdio. h> #include <string. h> struct stu { int num; char

例2. 把指向结构的指针作为函数的参数 #include <stdio. h> #include <string. h> struct stu { int num; char name[20]; float score; };

void fun(struct stu *p) { strcpy(p->name, "I am a student"); 不能写成:p->name="I am a student";

void fun(struct stu *p) { strcpy(p->name, "I am a student"); 不能写成:p->name="I am a student"; 因为name成员是一个字符数组 p->score=p->score+20; p->num=p->mum+10; printf("print in fum: n"); } printf("%dn%sn%4. 1 fnn", (*p). num, (*p). name, (*p). score); return;

main( ) { struct student={12, "Zhang hua", 68}; struct stu *sp; sp=&student; printf("1 --print

main( ) { struct student={12, "Zhang hua", 68}; struct stu *sp; sp=&student; printf("1 --print in main: n"); printf("%dn%sn%4. 1 fnn", (*sp). num, (*sp). name, (*sp). score); fun(sp); printf("2 --print in main: n"); printf("%dn%sn%4. 1 fnn", (*sp). num, (*sp). name, (*sp). score); }

程序运行结果: 1 --print in main: 12 Zhang hua 68. 0 print in fun: 22

程序运行结果: 1 --print in main: 12 Zhang hua 68. 0 print in fun: 22 I am a student 88. 0 2 --print in main: 22 I am a student 88. 0

一、建立别名 typedef <结构类型> <别名> 如:struct person { char name[20]; int age; char tel[15]; };

一、建立别名 typedef <结构类型> <别名> 如:struct person { char name[20]; int age; char tel[15]; }; typedef struct person Person

例:struct memb { float v; int n; char c; } stag; stag占内存 7个 字节的空间

例:struct memb { float v; int n; char c; } stag; stag占内存 7个 字节的空间 union memb { float v; utag占的内 存空间为 int n; char c; } ustag; 1001 v 1005 n c 1007 2001 2002 2003 c n v 2004 共用体类型变量每次只能存放一个成员的值。

例2:#include<stdio. h> union memb { float v; int n; 运行结果: 36. 7 char c;

例2:#include<stdio. h> union memb { float v; int n; 运行结果: 36. 7 char c; 13107 }; main( ) { union memb utag; utag. c='T '; utag. n=18; utag. v=36. 7; printf("%5. 1 fn%dn%cn", utag. v, utag. n, utag. c); }

构造类型(数组,结构体,共用体)的定义可以嵌套。 struct priv { int n; float f; char c; } union publ {

构造类型(数组,结构体,共用体)的定义可以嵌套。 struct priv { int n; float f; char c; } union publ { int ns; float fs; struct priv mud; } spe[5];

· 人为设置 enum 类型名{标识符 1=1, 标识符 2, …, 标识符n} 例:enum workday{MON, TUE, WED, THU,

· 人为设置 enum 类型名{标识符 1=1, 标识符 2, …, 标识符n} 例:enum workday{MON, TUE, WED, THU, FRI}; 0 1 2 4 3 enum workday{MON=1, TUE, WED, THU, FRI}; 1 例:P 330. 程序 2 3 4 5

3. >> 作用:按位右移 如:a=10011010, b=01010011 则:a>>2=11100110 (a为有符号数) b>>2=00010100 (b为无符号数) 4. & 作用:按位与(1&1=1, 1&0=0, 0&0=0)

3. >> 作用:按位右移 如:a=10011010, b=01010011 则:a>>2=11100110 (a为有符号数) b>>2=00010100 (b为无符号数) 4. & 作用:按位与(1&1=1, 1&0=0, 0&0=0) 如:a=10011010 b=01010011 则:a&b=00010010

5. | 作用:按位或(1|1=1, 1|0=1, 0|0=0) 如:a=10011010 b=01010011 则:a|b=11011011 6. ∧ 作用:按位异或(1∧ 1=0, 1∧ 0=1,

5. | 作用:按位或(1|1=1, 1|0=1, 0|0=0) 如:a=10011010 b=01010011 则:a|b=11011011 6. ∧ 作用:按位异或(1∧ 1=0, 1∧ 0=1, 0∧ 0=0) 如:a=10011010 b=01010011 则:a∧b=11001001

实际上:a=0000 表示a= 0 ~a=1111 65535(十六进制:ffff) 若:a=0000 0001 则:~a=1111 1110 表示a= 1 表示a= 65534 (十六进制:fffe)

实际上:a=0000 表示a= 0 ~a=1111 65535(十六进制:ffff) 若:a=0000 0001 则:~a=1111 1110 表示a= 1 表示a= 65534 (十六进制:fffe) 注:(ffff)16=15 163+15 162+ 15 161 +15 160 =65535

例1:main( ) { int a=8; (二进制数: 00001000) int b= 8; printf("%dn", a<<2); 运行结果: 32

例1:main( ) { int a=8; (二进制数: 00001000) int b= 8; printf("%dn", a<<2); 运行结果: 32 printf("%dn", b<<2); 32 } 分析: 对正整数:a= 00001000 a<<2= 0000100000 丢失 补入 对负整数:b= 1000 b<<2= 1 0 0 0 0 符号位保留

例2:/*---按位打印无符号整数---*/ 与P 322的程序 功能相同 #include <stdio. h> main( ) { unsigned x, c, temp=1;

例2:/*---按位打印无符号整数---*/ 与P 322的程序 功能相同 #include <stdio. h> main( ) { unsigned x, c, temp=1; scanf("%u", &x); temp=temp<<15; for (c=1; c<=16; c++) { putchar(x&temp? '1'; '0'); x=x<<1; } printf("n"); } 程序运行后,若输入 4 则输出 0000 0100

如:int a=64 ( 01000000 ) 则:a>>2=16 (0001000000 ) 称为逻辑右移 补入 丢失 如:int a= 64

如:int a=64 ( 01000000 ) 则:a>>2=16 (0001000000 ) 称为逻辑右移 补入 丢失 如:int a= 64 (11000000 ) 则:a>>2=[a]补码 >>2 =([a]反码 +1)>>2 =(10111111+1)>>2 =(11000000)>>2 称为算术右移 =1111000000 补入 丢失

4. 按位与:& (有零为零) 若有 int a=60, b=10; 即:(a)2=00111100 (b)2=00001010 则:(a&b)2=00001000 (a&b)10=8

4. 按位与:& (有零为零) 若有 int a=60, b=10; 即:(a)2=00111100 (b)2=00001010 则:(a&b)2=00001000 (a&b)10=8

 若有 int a= 60, b=10; 即:(a)补=(a)反+1 = (10111100)反+1 = 01000011+1 = 0100 (b)2=

若有 int a= 60, b=10; 即:(a)补=(a)反+1 = (10111100)反+1 = 01000011+1 = 0100 (b)2= 00001010 则:a&b=0

想一想: 若 int a= 60, b=6; 则 a&b=? 答案:a&b=4 因为:(a)补= 11000100 (b)2= 00000110 所以:(a&b)2=00000100

想一想: 若 int a= 60, b=6; 则 a&b=? 答案:a&b=4 因为:(a)补= 11000100 (b)2= 00000110 所以:(a&b)2=00000100

5. 按位或:| (有1为 1) 若有 int a=60, b=10; 即:(a)2= 00111100 (b)2= 00001010 则:(a|b)2=00111110 (a|b)10=62

5. 按位或:| (有1为 1) 若有 int a=60, b=10; 即:(a)2= 00111100 (b)2= 00001010 则:(a|b)2=00111110 (a|b)10=62

 若有 int a= 60, b=10; 即:(a)2= 11000011+1 = 11000100 (b)2= 00001010 则: (a|b)2=11001110

若有 int a= 60, b=10; 即:(a)2= 11000011+1 = 11000100 (b)2= 00001010 则: (a|b)2=11001110 还原: 10110001+1=10110010 则: (a|b)10= 50

想一想: 若 int a= 127, b=126; 则 a|b=? 答案:a|b= 1 (a)2=1111 (a)补= 10000000+1=10000001 (b)2=

想一想: 若 int a= 127, b=126; 则 a|b=? 答案:a|b= 1 (a)2=1111 (a)补= 10000000+1=10000001 (b)2= 01111110 则:(a|b)2= 1111 还原: 10000000+1 10000001 (a|b)2= 1

6. 按位异式: (相同为零) 若有 int a=60, b=10; 即:(a)2=00111100 (b)2=00001010 则:(a b)2=00110110 (a b)10=54

6. 按位异式: (相同为零) 若有 int a=60, b=10; 即:(a)2=00111100 (b)2=00001010 则:(a b)2=00110110 (a b)10=54

 若 int a= 60, b=10; 则:(a)补= 11000011 (b)2= 00001010 (a b)2= 11001110 还原:

若 int a= 60, b=10; 则:(a)补= 11000011 (b)2= 00001010 (a b)2= 11001110 还原: 10110001+1=10110010 则: (a b)10= 50

P. 296 11. 1 11. 2 11. 3 11. 4 11. 5 11. 6

P. 296 11. 1 11. 2 11. 3 11. 4 11. 5 11. 6 11. 7 11. 8 11. 9