哈工大苏小红版_C语言_课件_chart12_structure&union
C语言大学实用教程课件制作人苏小红.
例3.9
#include <stdio.h> main() { int a, b; printf("Please input a and b:"); scanf("%2d%*2d%2d", &a, &b); printf("a=%d, b=%d, a+b=%d\n",a,b,a+b); } Please input a and b: 12345a↙ a=12, b=5, a+b = 17
2018/9/14 C语言大学实用教程课件 制作人苏小红 20
输入数据的格式控制——例3.10
#include <stdio.h> main() { int a, b;
12 34↙
scanf("%d %d", &a, &b); printf("a = %d, b = %d\n", a, b);
}
问题1:当要求程序输出结果为 a = 12, b = 34 时,用户应该如何输入数据?
第3章 简单的C程序设计
哈尔滨工业大学计算机学院 苏小红 sxh@
内容提要
字符输入输出函数 格式输入输出函数
2018/9/14
C语言大学实用教程课件 制作人苏小红
2
C语言中的语句
变量声明语句 – int x, y; 表达式语句 – i++; – i = i + 1; 空语句 –; 复合语句 – {t = x; x = y; y = t;} 控制语句
12 + 3↙ 12 3129 = 3141
c语言课件ppt苏小红
文件的读写操作
文件读取
使用fscanf()、fgets()等函 数从文件中读取数据。
文件写入
使用fprintf()、fputs()等 函数将数据写入文件。
文件读写模式
根据需要选择不同的文件 读写模式,如只读、只写 、追加等。
程序调试技巧和方法
内存释放
动态分配的内存在使用完毕后需要释 放,以避免内存泄漏。C语言提供了 free函数来释放动态分配的内存。
07
文件操作和程序调试
文件的打开和关闭
01
02
03
文件打开
使用fopen()函数打开文 件,指定文件名和打开模 式。
文件关闭
使用fclose()函数关闭已打 开的文件,释放资源。
文件指针
03
控制结构
条件语句
条件语句
用于根据特定条件执行不同的 代码块。
if语句
根据条件判断,如果条件为真 ,执行if后面的代码块。
switch语句
根据表达式的值,执行不同的 代码块。
三元运算符
根据条件返回两个值中的一个 ,类似于if-else语句。
循环语句
循环语句
用于重复执行一段代码,直到满足特定条件 。
。
C语言最初的设计目的是为了编 写操作系统的内核,后来逐渐发
展成为一种通用的编程语言。
C语言的发展历程中,出现了许 多重要的版本和标准,如C89、
C99和C11等。
C语言的特点和应用领域
C语言是一种结构化编程语言,支持 过程化、面向对象和泛型编程范式。
C语言在操作系统、编译器、数据库 等领域的开发中扮演着重要的角色。
哈工大苏小红版C语言课件cha
C语言的特点和应用领域
系统软件
嵌入式系统
操作系统、编译器等核心软件都是用 C语言编写的。
在嵌入式系统中,C语言被广泛应用 于开发底层驱动程序和操作系统内核。
应用软件
数据库、游戏、图形界面等应用软件 也广泛使用C语言开发。
C语言的基本语法结构
数据类型
运算符
控制结构
包括整型、浮点型、字 符型、数组类型、结构
短整型通常占用2个字节,整型 占用4个字节,长整型占用8个 字节。
浮点型数据类型
浮点型数据类型用于 存储小数,包括单精 度浮点数和双精度浮 点数。
浮点型数据类型用于 存储实数,包括正实 数、负实数和零。
单精度浮点数通常用 float表示,双精度浮 点数通常用double 表示。
字符型数据类型
01
05 指针和内存管理
指针的定义和使用
01
02
03
04
指针是变量,用于存储 内存地址。
指针变量必须先定义后 使用。
使用指针前需要先赋值。
指针可以指向同类型的 变量或数组元素。
内存管理的基本概念
01
02
03
04
内存分为堆区和栈区。
堆区用于动态内存分配,由程 序员管理。
栈区用于存储局部变量,由系 统自动管理。
内存管理涉及内存的申请、使 用和释放。
动态内存分配和释放
使用`malloc()`函数在堆区分配内存。
使用`realloc()`函数调整已分配内存 的大小。
使用`calloc()`函数在堆区分配并初始 化内存。
使用`free()`函数释放已分配的内存。
06 文件操作
文件的打开和关闭
要点一
打开文件
苏小红c语言程序设计第二版课后答案
苏小红c语言程序设计第二版课后答案苏小红教授所著的《C语言程序设计》第二版是计算机科学与技术专业学生学习C语言的经典教材之一。
该书不仅系统地介绍了C语言的基础知识,还通过丰富的实例和练习题帮助学生加深理解。
以下是部分课后习题的答案,以供参考:第一章:C语言概述1. 问题一:简述C语言的特点。
- 答案: C语言是一种结构化编程语言,具有高效性、灵活性和可移植性等特点。
它支持多种数据类型,拥有丰富的运算符,并且能够直接访问内存地址。
2. 问题二:为什么说C语言是高级语言?- 答案: C语言被称为高级语言是因为它抽象了底层硬件操作,使得程序员可以不必关心计算机的硬件细节,而专注于程序的逻辑结构。
第二章:数据类型、运算符和表达式1. 问题一:说明C语言中基本数据类型的种类及其特点。
- 答案: C语言中的基本数据类型包括整型(int)、字符型(char)、浮点型(float和double)。
每种类型都有其特定的取值范围和占用内存大小。
2. 问题二:解释赋值运算符的右结合性。
- 答案:赋值运算符的右结合性意味着当多个赋值运算符同时出现时,从右向左进行计算。
例如,a = b = c; 会先计算 b = c,然后将结果赋值给 a。
第三章:控制结构1. 问题一:什么是条件语句?举例说明。
- 答案:条件语句是程序中根据条件是否满足来决定执行哪一段代码的结构。
例如,if语句就是典型的条件语句。
2. 问题二:循环语句有哪些?它们各自的特点是什么?- 答案: C语言中有三种循环语句:for循环、while循环和do-while循环。
for循环常用于已知循环次数的情况;while循环适用于循环次数未知,需要在循环体内部判断是否继续循环;do-while循环至少执行一次循环体,然后在循环末尾判断是否继续。
第四章:数组1. 问题一:一维数组和多维数组的区别是什么?- 答案:一维数组是线性的,只有一个索引来访问数组元素;而多维数组可以看作是数组的数组,需要多个索引来定位元素。
哈工大苏小红版C语言课件cha
哈工大苏小红版C语言课 件cha
欢迎来到哈工大苏小红版C语言课件。
课程介绍
本课程将为你提供C语言的全面介绍,从基本概念到高级应用,帮助你打下扎 实的编程基础。
概述
起源
C语言由贝尔实验室的Dennis Ritchie于20世纪70年代开发。
特点
它是一门通用的高级编程语言,具有简洁、高效和可移植等特点。
3
循环结构重复执Leabharlann 一段代码,直到满足退出循环的条件。
函数及参数传递
函数 参数传递
用于封装一段可重复使用的代码块。 可以通过值传递和指针传递实现参数的传递。
数组与指针
数组
用于存储相同类型的多个元素。
指针
存储变量的内存地址,可以通过指针访问和操作变量。
文件操作
使用C语言可以读取、写入和操作文件,实现文件的输入输出和处理。
应用
C语言在嵌入式系统、操作系统和编译器设计等领域广泛应用。
基本语法及数据类型
数据类型
包括整型、浮点型、字符型和数 组等。
变量
在使用变量之前需要声明其数据 类型。
运算符
用于执行基本的算术和逻辑操作。
程序控制结构
1
顺序结构
按照代码的编写顺序依次执行语句。
2
条件结构
根据条件的真假决定执行不同的语句块。
《C语言程序设计》苏小红课后习题答案高等教育出版社
2 2 #include<stdio.h>main(){float x=2.5,y=2.5,z=2.5;printf("x=%f\n",x);printf("y=%f\n",y);printf("z=%f\n",z);}3.1(1)#include<stdio.h>main(){int a=12,b=3;float x=18.5,y=4.6;}3.1(2)#include<stdio.h>main(){int x=32,y=81,p,q;p=x++;q=--y;printf("%d %d\n",p,q);printf("%d %d\n",x,y);}3.2#include<stdio.h>main(){int x,b0,b1,b2,s;printf("Inputx:");scanf("%d",&x);b2=x/100;b1=(x-b2*100)/10;//或(x%100)/10;或x/10%10;b0=x%10;s=b0*100+b1*10+b2;printf("s=%d\n",s);}3.3#include<stdio.h>#include<math.h>main(){float rate=0.0225;float n,capital,deposit;printf("Input n,capital:");scanf("%f,%f",&n,&capital);deposit=capital*pow(1+rate,n);printf("deposit=%f\n",deposit); }3.4#include<stdio.h>#include<math.h>main(){float a, b, c;double x, y;printf("Input a, b, c:");scanf("%f %f %f", &a, &b, &c);x=(-b+sqrt(b*b-4*a*c))/(2*a);y=(-b-sqrt(b*b-4*a*c))/(2*a);printf("x=%f,y=%f\n",x,y);}习题44.1(1)#include<stdio.h>main(){char c1='a',c2='b',c3='c';}4.1(2)#include<stdio.h>main(){int a=12,b=15;}4.1(3)#include<stdio.h>main(){int a,b;printf("%d,%d\n",a,b);}4.2#include<stdio.h>main(){long a,b;float x,y;scanf("%d,%d\n",&a,&b);scanf("%f,%f\n",&x,&y);printf("a=%d,b=%d\n",a,b);printf("x=%f,b=%f\n",x,y);}5.1#include<stdio.h>main(){float a;printf("Input a:");scanf("%f",&a);if(a>=0){a=a;printf("a=%f\n",a);}else{a=-a;printf("a=%f\n",a);}}5.2#include<stdio.h>main(){int a;printf("Input a:");scanf("%d", &a);if(a%2==0){printf("a 是偶数");}else{printf("a 是奇数");}}5.3#include<stdio.h>#include<math.h>main(){float a,b,c,s,area;printf("Input a, b, c:");scanf("%f %f %f", &a, &b, &c);if(a+b>c&&a+c>b&&b+c>a){s=(a+b+c)/2;area=(float)sqrt(s*(s-a)*(s-b)*(s-c));printf("area=%f\n",area);else{printf("不是三角形");}}5.4#include<stdio.h>#include<math.h>main(){float a,b,c,x,y;printf("Inputa,b,c:");scanf("%f,%f,%f",&a,&b,&c);if(a==0){printf("该方程不是一元二次方程\n");}if(b*b-4*a*c>0){x=(-b+sqrt(b*b-4*a*c))/(2*a);y=(-b-sqrt(b*b-4*a*c))/(2*a);printf("x=%f,y=%f\n",x,y);}else if(b*b-4*a*c==0){x=-b/(2*a);y=-b/(2*a);printf("x=%f,y=%f\n",x,y);}else{printf("该方程无实根\n");}}5.5#include<stdio.h>main(){int year,flag;printf("Input a year:");scanf("%d",&year);if(year%4==0&&year%400!=0||year%400==0) {flag=1;}else{flag=0;if(flag==1){printf("%d is a leap year !\n",year);}else{printf("%d is not a leap year !\n",year);}}5.6#include<stdio.h>main(){int year,flag;printf("Input a year:");scanf("%d",&year);flag=year%400==0||year%4==0&&year%100!=0?1:0;if(flag==1&&flag!=0){printf("%d is a leap year !\n",year);}else{printf("%d is not a leap year !\n",year);}}5.7#include<stdio.h>main(){char ch;printf("Inputch:");scanf("%c",&ch);if(ch>='a'&&ch<='z'){ch=getchar();ch=ch-32;printf("%c,%d\n",ch,ch);}else if(ch>='A'&&ch<='Z'){ch=getchar();ch=ch+32;printf("%c,%d\n",ch,ch);}else{printf("%c",ch);}5.8#include<stdio.h>main(){char ch;printf("Inputch:");scanf("%c",&ch);if(ch>=48&&ch<=57){printf("ch 是数字字符\n");}else if(ch>=65&&ch<=90){printf("ch 是大写字母\n");}else if(ch>=97&&ch<=122){printf("ch 是小写字母\n");}else if(ch==32){printf("ch 是空格\n");}else{printf("ch 是其他字符\n");}}5.9#include<stdio.h>main(){int score,grade;printf("Input score:");scanf("%d",&score);grade=score/10;if(score<0||score>100){printf("Input error\n");}if(score>=90&&score<=100){printf("%d--A\n",score);}else if(score>=80&&score<90){printf("%d--B\n",score);}else if(score>=70&&score<80){printf("%d--C\n",score);}else if(score>=60&&score<70){printf("%d--D\n",score);}else if(score>=0&&score<60){printf("%d- -E\n",score);}}5.10#include<stdio.h>main(){int year,month;printf("Input year,month:");scanf("%d,%d",&year,&month);if(month>12||month<=0){printf("error month\n");}else{switch(year,month){case 12:case 10:case 8:case 7:case 5:case 3:case 1:printf("31 天\n");break;case 11:case 9:case 6:case 4:printf("30 天\n");break;case 2:if(year%4==0&&year!=0||year%400==0){printf("29 天\n");}else{printf("28 天\n");}break;default:printf("Input error\n");}}}6.1(1)#include<stdio.h>main(){int i,j,k;char space=' ';for(i=1;i<=4;i++){for(j=1;j<=i;j++){printf("%c",space);}for(k=1;k<=6;k++){printf("*");}printf("\n");}}6.1(2) #include<stdio.h>main(){int k=4,n;for(n=0;n<k;n++){if(n%2==0) continue;k--;}printf("k=%d\n,n=%d\n",k,n);}6.1(3) #include<stdio.h>main(){int k=4,n;for(n=0;n<k;n++){if(n%2==0) break;k--;}printf("k=%d,n=%d\n",k,n);}6.2(1) #include<stdio.h>main(){int i,sum=0;for(i=1;i<=101;i++){sum=sum+i;}printf("sum=%d\n",sum);}6.2(2) #include<stdio.h>main(){long i;long term,sum=0;for(i=1;i<=101;i=i+2){term=i*(i+1)*(i+2);sum=sum+term;}printf("sum=%ld\n",sum);}6.2(4) #include<stdio.h>#include<math.h>main(){int n=1;float term=1.0,sign=1,sum=0;while(term<=-1e-4||term>=1e-4){term=1.0/sign;sum=sum+term;sign=sign+n;n++;}printf("sum=%f\n",sum);}6.2(5) #include<stdio.h>#include<math.h>main(){int n=1,count=1;float x;double sum,term;printf("Input x:");scanf("%f",&x);sum=x;term=x;do{term=-term*x*x/((n+1)*(n+2));sum=sum+term;n=n+2;count++;}while(fabs(term)>=1e-5);printf("sin(x)=%f,count=%d\n",sum,count);}6.3 #include<stdio.h>main(){int x=1,find=0;while(!find){if(x%2==1&&x%3==2&&x%5==4&&x%6==5&&x%7==0){printf("x=%d\n",x);find=1;x++;}}}/* int x,find=0;for (x=1;!find;x++){if(x%2==1&&x%3==2&&x%5==4&&x%6==5&&x%7==0){printf("x=%d\n",x);find=1;}}}*/6.4 #include<stdio.h>main(){int i,n;long p=1,m=1;printf("Input n:");scanf("%d",&n);for(i=1;i<=n;i++){p=i*i;m=i*i*i;printf("p=%d,m=%d\n",i,p,i,m);}}6.5 #include<stdio.h>main(){float c,f;for(c=-40;c<=110;c=c+10){f=9/5*c+32;printf("f=%f\n",f);}}6.6 #include<stdio.h>#include<math.h>main(){int n;double c=0.01875,x;do{x=x*pow(1+c,12)-1000;n++;}while(x>0);printf("x=%d\n",x);}6.7 #include<stdio.h>main(){int n=0;float a=100.0,c;printf("Inputc:");scanf("%f",&c);do{a=a*(1+c);n++;}while(a<=200);printf("n=%d\n",n);}6.8 #include<stdio.h>#include<math.h>main(){int n=1,count=1;double sum=1,term=1;while(fabs(term)>=1e-5){term=pow(-1,count)*(1.0/(n+2));sum=sum+term;n=n+2;count++;}sum=4*sum;printf( "sum=%f,count=%d\n",sum,count); }6.9 #include<stdio.h>#include<math.h>main(){int n=1,count=1;double sum=1,term=1;while(fabs(term)>=1e-5){term=term*(1.0/n);sum=sum+term;n++;count++;}printf("sum=%f,count=%d\n",sum,count);}6.10 #include<stdio.h>#include<math.h>main(){int x;for(x=100;x<=999;x++){if(x==pow(x/100,3)+pow(x/10%10,3)+pow(x%10,3))printf("x=%d\n",x);}}6.11 #include<stdio.h>main(){int i=0,n;long sum=0,term=1;printf("Inputn:");scanf("%d",&n);do{i++;term=term*i;sum=sum+term;}while(sum<n);printf("%d\n",i-1);}6.12 #include<stdio.h>main(){int i,n,m,count=0,sum=0;printf("Input n:");scanf("%d",&n);for(i=1;i<=n;i++){printf("Inputm:");scanf("%d",&m);if(m>0){sum=sum+m;count++;}else{break;}printf("sum=%d,count=%d\n",sum,count);}}6.13 #include<stdio.h>main(){int i,n,m,count=0,sum=0;printf("Inputn:");scanf("%d",&n);for(i=1;i<=n;i++){printf("Inputm:");scanf("%d",&m);if(m>0||m<0){sum=sum+m;count++;}else{break;}printf("sum=%d,count=%d\n",sum,count);}}6.14 #include<stdio.h>main(){int x,y,z;for(x=0;x<=17;x++){for(y=0;y<=25;y++){3*x+2*y+z==50;z=30-x-y;if( 3*x+2*y+z==50&&x+y+z==30)printf("x=%d,y=%d,z=%d\n",x,y,z);}}}6.15 #include<stdio.h>main(){int x,y;for(x=0;x<=98;x++){y=98-x;2*x+4*y==386;if(x+y==98&&2*x+4*y==386){printf("x=%d,y=%d\n",x,y);}}}6.16 #include<stdio.h>main(){int x,y,z;for(x=0;x<=20;x++){for(y=0;y<=33;y++){3*y+5*x+z/3.0==100;z=100-x-y;if (5*x+3*y+z/3.0==100&&z+x+y==100){printf("x=%d,y=%d,z=%d\n",x,y,z);}}}}6.17 #include<stdio.h>main(){int x,y,z;for(x=1;x<=9;x++){for(y=1;y<=17;y++){10*x+5*y+z==100;z=50-x-y;if( 10*x+5*y+z==100&&x+y+z==50&&z>0){printf("x=%d,y=%d,z=%d\n",x,y,z);}}}}7.1 #include<stdio.h>int Square(int i){return i*i;}int main(){int i=0;i=Square(i);for( ;i<3;i++){static int i=1;i+=Square(i);printf("%d,",i);}printf("%d\n",i);return 0;}7.2 #include<stdio.h>int hour,minute,second;void update(){second++;if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;}if(hour==24)hour=0;}void display(){printf("%d,%d,%d\n",hour,minute,second);}void delay(){int t;for(}int main(){int i;void updaye(),display(),delay();for(i=0;i<1000000;i++){update();display();delay();}return 0;}7.3 #include<stdio.h>int GetMax(int a,int b);int main(){int x,y,max;printf("Inputx,y:");scanf("%d,%d",&x,&y);max=GetMax(x,y);printf("max=%d\n",max);return 0;}int GetMax(int m,int n){if(m>=n)return m;elsereturn n;}7.4 #include<stdio.h>int LCM(int n,int m);int main(){int a,b;printf("Inputa,b:");scanf("%d,%d",&a,&b);printf("%d\n",LCM(a,b));return 0;}int LCM(int n,int m){int x;int find=0;for(x=1;!find;x++){if(x%n==0&&x%m==0){find=1;}}return x-1;}7.5 #include<stdio.h>long Fact(int n);int main(){int m,a;printf("Inputm:");scanf("%d",&m);for(a=1;a<=m;a++){printf("%d!=%ld\n",a,Fact(a));}return 0;}long Fact(int n){int i;long result=1;for(i=2;i<=n;i++)result*=i;return result;}7.6 #include<stdio.h>long Fact(int n);int main(){int m;long ret;printf("Inputm:");scanf("%d",&m);ret=Fact(m);printf("ret=%d\n",ret);return 0;}long Fact(int n){int i;long result=1,sum=0;for(i=2;i<=n;i++){result*=i;sum=sum+result;}return sum;}7.7(1) #include<stdio.h> int Gcd(int a,int b);int main(){int m,n;printf("Inputm,n:");scanf("%d,%d",&m,&n);printf("%d\n",Gcd(m,n));return 0;}int Gcd(int a,int b){int t,min,find=0;min=a<b?a:b;t=min;for(t=min;!find;t--){a%t==0;b%t==0;if(a%t==0&&b%t==0)return t;}find=1;}7.7(2) #include<stdio.h> int Gcd(int a,int b);int main(){int m,n;printf("Inputm,n:");scanf("%d,%d",&m,&n);printf("%d\n",Gcd(m,n));return 0;}int Gcd(int a,int b){int r,temp;r=a%b;if(r==0)return b;elsedo{temp=b;b=r;a=temp;r=a%b;}while(r!=0);return b;}8.1(1) #include<stdio.h>void Func(int x){x=2;}int main(){int x=10;Func(x);printf("%d",x);return 0;}8.1(2) #include<stdio.h> void Func(int b[]){int j;for(j=0;j<4;j++){b[j]=j;}}int main(){static int a[]={5,6,7,8},i;Func(a);for(i=0;i<4;i++){printf("%d",a[i]);}return 0;}8.2(1) int PositiveNum(int a[],int n) {int i,count=0;for(i=0;i<n;i++){if(a[i]>0)count++;}return 0;}8.2(2) void Fib(long f[],long n){int i;f[0]=0;f[1]=1;for(i=2;i<n;i++){f[i]=f[i-1]+f[i-2];}}8.2(3) #include<stdio.h>int main(){int a[10],n,max,min,maxPos,minPos;for(n=0;n<10;n++){scanf("%d",&a[n]);}max=min=a[0];maxPos=minPos=0;for(n=0;n<10;n++){if(a[n]>max){max=a[n];maxPos=n;}else if(a[n]<min){min=a[n];minPos=n;}}printf("max=%d,pos=%d\n",max,maxPos);printf("min=%d,pos=%d\n",min,minPos);return 0;}8.3 void DivArray(int *pArray,int n){int i;for(i=0;i<n;i++){pArray[i]/=pAttay[0];}}8.4 #include<stdio.h>#define N 40int FailNum(int score[],int n);void ReadScore(int score[],int n);int main(){int score[N],n;printf("Input n:");scanf("%d",&n);ReadScore(score,n);FailNum(score,n);printf("FailNum students are %d\n",FailNum(score,n));return 0;}int FailNum(int score[],int n){int i,count=0;for(i=0;i<n;i++){if(score[i]<60)count++;}return count;}void ReadScore(int score[],int n){int i;printf("Input score:");for(i=0;i<n;i++){scanf("%d",&score[i]);}}8.5 #include<stdio.h>#define N 40int HighAver(int score[],int n);int ReadScore(int score[]);int main(){int score[N],n;n=ReadScore(score);printf("HighAver students are %d\n",HighAver(score,n));return 0;}int HighAver(int score[],int n){int i,count=0,sum=0,aver;for(i=0;i<n;i++){sum=sum+score[i];aver=sum/n;}for(i=0;i<n;i++){if(score[i]>aver)count++;}return count;}int ReadScore(int score[]){int i=-1;do{i++;printf("Input score:");scanf("%d",&score[i]);}while(score[i]>=0);return i;}8.6 #include<stdio.h>#define N 40int ReadScore(int score[],long num[]);int FindMax(int score[],long num[],int n);int main(){int score[N],n,max,num,t;long num[N];t=FindMax(score,n);max=score[t];num=num[t];printf("max=%d,num=%d\n",max,num);return 0;}int ReadScore(int score[],long num[]){int i=-1;do{i++;printf("Input student's ID and score:");scanf("%ld%d",&num[i],&score[i]);}while(num[i]>0&&score[i]>=0);return i;}int FindMax(int score[],long num[],int n){int max,i;max=score[0];for(i=1;i<n;i++){if(score[i]>max)max=score[i];}return i;}8.7 #include<stdio.h>#define N 40int Read(int a[]);int ChangeArry(int a[],int n);int main(){int a[N],n;printf("%d\n",ChangeArry(a,n));return 0;}int Read(int a[]){int i;for(i=0;i<9;i++){printf("Input a:");scanf("%d",&a[i]);return i;}int ChangeArry(int a[],int n){int max,min,i,maxpos,minpos,term;max=min=score[0];for(i=1;i<n;i++){if(a[i]>max)max=score[i];maxpos=n;else(a[i]<min)min=a[i];minpos=n;temp=maxpos;maxpos=minpos;minpos=temp;}return a[i];}8.10 #include<stdio.h>#define N 5void main(){int a[N][N];int sum = 0;int i, j;printf("请输入一个%d*%d 的矩阵\n",N,N);for(i = 0; i < N; i++){for(j = 0; j < N; j++){scanf("%d",&a[i][j]);}}for(i = 0; i < N; i++){for(j = 0; j < N; j++){if(i == j || i + j == N - 1)sum=sum+a[i][j];}}printf("对角线元素之和为:%d\n",sum);}8.11 #include<stdio.h>#define N 2#define M 3void main(){int a[N][M],b[N][M];int i,j,sum1=0,sum2=0,sum=0;printf("请输入一个%d*%d 的矩阵\n",N,M);for(i = 0; i<N; i++){for(j = 0; j< M; j++){scanf("%d",&a[i][j]);sum1=sum1+a[i][j];}}printf("请输入一个%d*%d 的矩阵\n",N,M);for(i = 0; i <N; i++){for(j = 0; j <M; j++){scanf("%d",&b[i][j]);sum2=sum2+a[i][j];}}sum=sum1+sum2;printf("sum=%d\n",sum);}8.12 #include<stdio.h>#define N 7void YangHui(int a[N][N],int n);void main(){int i,j,n,b[N][N];printf("Input n:");scanf("%d",&n);YangHui(b,n);for(i=0;i<n;i++){for(j=0;j<=i;j++){printf("%4d",b[i][j]);}printf("\n");}}void YangHui(int a[N][N],int n){int i,j;for(i=0;i<n;i++){a[i][0]=1;a[i][i]=1;}for(i=2;i<n;i++){for(j=1;j<i;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];}}8.13 #include<stdio.h>#define N 12void main(){int i;int f[N]={1,1};printf("%d:%d\n",0,f[0]);printf("%d:%d\n",1,f[1]);for(i=2;i<N;i++){f[i]=f[i-1]+f[i-2];printf("%d:%d\n",i+1,f[i]);}}8.14 #include<stdio.h>#include<stdlib.h>#include<time.h>#define N 6000void main(){int a[N],i;int b1=0,b2=0,b3=0,b4=0,b5=0,b6=0;float p1,p2,p3,p4,p5,p6;srand(time(NULL));for(i=0;i<N;i++){a[i]=rand()%6+1;printf("%3d",a[i]);if(a[i]==1)b1++;if(a[i]==2)b2++;if(a[i]==3)b3++;if(a[i]==4)b4++;if(a[i]==5)b5++;if(a[i]==6)b6++;p1=(float)(b1/6000.0);p2=(float)(b2/6000.0);p3=(float)(b3/6000.0);p4=(float)(b4/6000.0);p5=(float)(b5/6000.0);p6=(float)(b6/6000.0);}printf("骰子出现 1 的概率:%.2f\n",p1);printf("骰子出现 2 的概率:%.2f\n",p2);printf("骰子出现 3 的概率:%.2f\n",p3);printf("骰子出现 4 的概率:%.2f\n",p4);printf("骰子出现 5 的概率:%.2f\n",p5);printf("骰子出现 6 的概率:%.2f\n",p6);}9.1(1) void Swap(int *x,int *y){int *pTemp;//*pTemp 未进行初始化,*pTemp 指向哪里位置*pTemp=*x;*x=*y;*y=*pTemp;}9.1(2) void Swap(int *x,int *y){int *pTemp;pTemp=x;x=y;y=pTemp;}//错误,x,y 没有指向类型9.2 #include<stdio.h>int main(){int a[]={1,2,3,4,5};int *p=a;printf("%d,%d,%d,%d,%d,%d,%d\n",*p,*(++p),(*p)++,*p,*p--,--(*p),*p);return 0;}9.3 #include<stdio.h>void Swap(int *x,int *y);int main(){int a[6]={1,2,3,4,5,6},b[6]={11,22,33,44,55,66};int i;printf("Before Array \n");for(i=0;i<6;i++){printf(" %d\n",a[i]);}for(i=0;i<6;i++){printf("%d\n",b[i]);}for(i=0;i<6;i++){Swap(&a[i],&b[i]);}printf("After Array \n");for(i=0;i<6;i++){printf("%d\n",a[i]);}for(i=0;i<6;i++){printf("%d\n",b[i]);}return 0;}void Swap(int *x,int *y){int temp;temp=*x;*x=*y;*y=temp;}9.4 #include<stdio.h>#define N 10void FindMaxMin(int a[],int *pMaxa,int *pMaxnum,int *pMina,int *pMinnum); int main(){int a[N];int i,maxa,mina,maxnum,minnum;printf("Input a:");for(i=0;i<10;i++){scanf("%d",&a[i]);}FindMaxMin(a,&maxa,&maxnum,&mina,&minnum);printf("maxa=%d,maxnum=%d,mina=%d,minnum=%d\n",maxa,maxnum,mina,minnum);return 0;}void FindMaxMin(int a[],int *pMaxa,int *pMaxnum,int *pMina,int *pMinnum){int i;*pMaxa=a[0];*pMina=a[0];*pMaxnum=0;*pMinnum=0;for(i=0;i<10;i++){if(a[i]>*pMaxa){*pMaxa=a[i];*pMaxnum=i;}else if(a[i]<*pMina){*pMina=a[i];*pMinnum=i;}}}10.1 void MYStrcpy(char *dstStr,const char *srcStr){while ((*dstStr++=*srcStr++)!='\0'){}}10.2 #include<stdio.h>main(){char *a="main(){char *a=% c% s% c; printf(a,34,a,34);}";printf(a,34,a,34);} 10.3(1) unsigned int MyStrlen(char *p)main(){unsigned int len;len=0;for(;*pa!='\0';pa++){len++;}return len;}10.3(2) unsigned int MyStrlen(char s[]){char *p=s;while(*p!='\0'){p++;}return (p-*p);}10.3(3) int MyStrcmp(char *p1,char *p2){for(;*p1==*p2;p1++,p2++){if(*p1=='\0') return -1;}return 1;}10.3(4) int MyStrcmp(char s[],char t[]){int i;for(i=0;s[i]==t[i];i++){if(s[i]=='\0') return 0;}return i;}10.3(5) #include<stdio.h>#include<string.h>int main(){char password[7]="secret";char userInput[81];printf("Input Password:");scanf("%s",userInput);if(strcmp(userInput,password)==0)printf("Coorrect password!Welcome to the system...\n");else if(strcmp(userInput,password)<0)printf("Invalid password!user input<password...\n");elseprintf("Invalid password!user input>password...\n");return 0;}10.4 #include<stdio.h>#define N 24unsigned int CountLetter(char str[]);int main(){char a[N];printf("Input a letter:\n");gets(a);printf("The length of the letter is:%d\n",CountLetter(a));return 0;}unsigned int CountLetter(char str[]){char *p=str;int c=0,flag=0;while(*p!='\0'){if(*p!=' ')flag=1;else if(flag==1){c++;flag=0;}p++;}return c+1;}12.1 #include<stdio.h>typedef struct data{int year;int month;int day;}DATA;typedef struct work{char a[14];char b[10];char c[6];}WORK;typedef struct student{char studentName[10];char studentSex;DATA birthday;WORK profession;}STUDENT;int main(){STUDENT stu={"王刚",'M',{1991,5,19},{"信息工程系","学习人员","学生"}};printf("stu:%2s%3c%6d/%02d/%02d%4s,%4s,%4s\n",stu.studentName,stu.studentSex,st u.birthday.year,stu.profession.a,stu.profession.b,stu.profession.c);return 0;}12.4 #include<stdio.h>#include<string.h>#define N 10typedef struct people{char peopleName[10];}PEOPLE;int main(){int sum1=0,sum2=0,sum3=0,sum4=0;int i;char name[N][N];PEOPLE stu[5]={"zhang","li","wang"};printf("Enter their name:\n");for(i=0;i<10;i++){gets(name[i]);if(strcmp(name[i],stu[0].peopleName)==0)sum1++;else if(strcmp(name[i],stu[1].peopleName)==0) sum2++;else if(strcmp(name[i],stu[2].peopleName)==0) sum3++;elsesum4++;}printf("stu:%4s%2d\n",stu[i].peopleName,sum[j]);printf("stu:%4s%2d\n",stu[1].peopleName,sum2);printf("stu:%4s%2d\n",stu[2].peopleName,sum3);printf("%2d\n",sum4);return 0;}。
教学课件 C语言程序设计(第2版)苏小红
Ken和dmr被尊为黑客的鼻祖
• 他们未对UNIX和C语言申请任何版权或专利 • UNIX和C语言是黑客世界里的两大神器 • 黑客精神
– 做事情以兴趣为出发点,并不在乎未来会怎样 – 极富钻研精神,喜欢迎接挑战 – 乐于分享,不计回报
今天的C语言
编程语言受欢迎程度排行
• 要编程,但不用C语言的人
– 透过C语言窥探计算机底层原理 – 掌握最流行的语法形式 – 了解基本的程序设计思维
• 永远不编程的人
– 通过C语言,更好地了解计算机,了解计算思 维
– 通过全国计算机等级考试二级
程序开发步骤 •调试(Debug)
•运行 (Run) 连接(Link) •编译(Compile)
– 是近年出现并获得关注的C/C++开发环境 – CB的功能远远优于TC,也优于VC 6.0 – CB只是一个IDE(集成开发环境),没有内置的
编译器和调试器 – 但可以支持多种编译器(不包括TC),例如GCC
编译器和GDB调试器
VC++ 6.0的初始界面
保存文件 建立新文件
运行 编译
在编译之前,VC先弹出对话框,询问是否建立一个默认的 项目工作区。VC必须有项目才能编译,所以这里必须选择 “Yes”。系统在保存.c文件的目录里自动生成与C源文件 同名的.dsw和.dsp等文件。以后可直接打开这些文件来修 改程序,不必再重复上面的过程
• 其值在程序执行过程中是可以改变的
一个简单的C程序例子
编译预处理命令
#include <stdio.h>
/*函数功能:计算两个整数相加之和 入口参数:整型数据a和b 返回值: 整型数a和b之和
第5章+函数 C语言大学实用教程课件 苏小红
2020/6/14
12
函数的分类
标准函数,即库函数 目前为止,我们所学习的printf()、scanf()等都 是ANSI C标准定义的库函数。任意符合ANSI C的编译器,不管它支持什么平台,都必须提 供这些函数供用户使用。 用户自定义函数 用户按自己的意愿编写自己的函数,完成人员 功能。
2020/6/14
x2
y3
y4
8 32
5 5
2 3
4 9
x3 x4
因变量
2020/6/14
Y AX
自变量
7
数学函数(4)
y f (x)
一个变量 二个变量
……
N个变量
自变量 与
因变量 的关系
一个变量 二个变量
……
N个变量
2020/6/14
8
数学函数(5)
关系
2020/6/14
集合B
集合A
函数名的命名规则和变量名的命名规则一致。
2020/6/14
14
函数定义(definition)
如果没有参数,则应该用void注明 其形如: int Func(void)
{ …
}
如果不需要返回值,则应该用void定义返回值类型
其形如:
void Func(int i, float f) {
… }
函数内部可以定义只能由该函数自己使用的变量,称内部 变量。
– 设计得当的函数可以把具体操作细节对程序中不需要知
道它们的那些部分隐藏掉,从而使整个程序结构清楚
Larry Moe
Curly
2020/6/14
11
C中的函数(Function)
说明:
一个源程序文件由一个或多个函数组成。 一个C程序由一个或多个源程序文件组成。 C程序的执行从main函数开始,调用其他函数后流程 回到main函数,在main函数中结束整个程序运行。 所有函数都是平行的,即函数定义时是互相独立的, 一个函数并不从属于另一个函数。
c语言程序设计苏小红版答案
c语言程序设计苏小红版答案C语言程序设计是计算机科学与技术专业学生的基础课程之一,它不仅教授了编程的基本概念和技巧,还培养了学生的逻辑思维和问题解决能力。
苏小红版的《C语言程序设计》教材以其系统性和实用性广受好评。
以下是对该书部分章节的习题答案的总结,以帮助学生更好地理解和掌握C语言程序设计。
第一章:C语言概述1. C语言的特点:C语言是一种结构化语言,具有高级语言的语法和汇编语言的控制能力。
它具有可移植性、简洁性、高效性等特点。
2. C语言的发展历史:C语言由Dennis Ritchie在20世纪70年代初期开发,最初用于UNIX操作系统。
第二章:数据类型、运算符和表达式1. 基本数据类型:包括整型(int)、浮点型(float和double)、字符型(char)等。
2. 运算符:包括算术运算符、关系运算符、逻辑运算符、位运算符等。
3. 表达式:由变量、常量、运算符和函数调用组成的,可以计算出结果的代码片段。
第三章:控制结构1. 顺序结构:程序按照编写顺序依次执行。
2. 选择结构:使用if、switch等语句根据条件选择执行不同的代码块。
3. 循环结构:使用while、do-while、for等循环语句重复执行代码块。
第四章:数组1. 一维数组:连续存储的相同类型元素集合。
2. 二维数组:可以看作是一维数组的数组,用于存储矩阵等数据结构。
3. 字符数组:特殊的一维数组,用于存储字符串。
第五章:函数1. 函数的定义:使用关键字`void`或返回类型定义函数的返回值类型。
2. 函数的调用:在程序中通过函数名和参数列表调用函数。
3. 递归函数:函数调用自身,用于解决某些递归问题。
第六章:指针1. 指针变量:存储另一个变量的内存地址的变量。
2. 指针与数组:指针可以方便地操作数组元素。
3. 函数指针:指向函数入口地址的指针变量,可以调用函数。
第七章:结构体与联合体1. 结构体:可以包含不同类型的数据成员的复合数据类型。
c语言第十二章苏小红版
如何定义指向结构体数组的指针?
STUDENT *pt = stu;
等价于
STUDENT *pt = &stu[0];
等价于
pt
stu[30]
第28页/共60页
使用pt++,使pt指向stu[1]pt -> studentID等价于 stu[1]. studentID
sizeof(union number)取决于占空间最多的那个成员变量
同一内存单元在每一瞬时只能存放其中一种类型的成员起作用的成员是最后一次存放的成员,不能作为函数参数不能进行比较操作,只能对第一个成员初始化
f
4个字节
第41页/共60页
12.6共用体
第42页/共60页
12.6共用体
第43页/共60页
第39页/共60页
12.6共用体
struct sample{
short i;
char ch; float f;};
union sample{
short i;
char ch; float f;};
8个字节
i
f
4个字节
【例12.8】
第40页/共60页
12.6共用体
本章学习内容
结构体数据类型,共用体数据类型、枚举数据类型、定义数据类型的别名 结构体变量、结构体数组、结构体指针的定义和初始化 结构体成员的引用、成员选择运算符、指向运算符 向函数传递结构体变量、结构体数组、结构体指针 动态数据结构、动态链表
第1页/共60页
二进制数——类型本不存在内存里存的内容,你认为它是什么,它就是什么在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念一般的CPU只支持两种类型整数、浮点数
教学课件:《C语言程序设计》(第4版)苏小红
#include <stdio.h> int main()
{
printf("%d\n", 1+1);
return 0;
}
既非英语,也非机器语言,但更像英语 高级语言程序必须通过编译器或解释器翻译成机器语言形
式的目标代码,才能被计算机识别和执行 易学、易用、易读、易懂、强大、可移植
21/37
高级语言的 发展历程
00000101
00000001
00000000
17/37
问题12:如何让程序员远离二进
制?
Both learn a third-party language
用助记符代表机器指令的操作码
– 用一个汇编器(Assembler)将这些符号翻译成机器可识
别、可执行的二进制指令——汇编过程
汇编语言(Assembly Language)
– 奥秘:高速的检索演算能力及其海量的存储能力 (200万棋谱)
年6月底,在英国著名的布莱切利庄园举 行了一场国际人工智能机器测试竞赛
– 由俄罗斯专家设计的“叶甫根尼”电脑程序脱颖而 出
– 其29.2%的回答均成功“骗过”了测试者,被视为 目前世界上最接近人工智能的机器
• 机器语言(Machine Language)
– 用机器语言编写的一组机器指令的集合,称为 机器代码(Machine Code),简称机器码
– 用一系列二进制0和1组成的二进制代码代表不
同的机器指令
– 机器语言编写的1+1程序——犹如天书计!算机的母语
10111000 00000001
是什么?
00000000
眼睛和耳朵
大脑
11/37
苏小红c语言程序设计
苏小红c语言程序设计苏小红是一名计算机科学专业的学生,她对C语言程序设计有着浓厚的兴趣。
C语言是一种通用的、过程式的编程语言,由丹尼斯·里奇在20世纪70年代初期开发,旨在为UNIX操作系统编写系统软件。
C语言以其高效、灵活和强大的功能而闻名,是许多现代编程语言的基础。
C语言程序设计基础苏小红首先学习了C语言的基本语法和结构。
她了解到C程序由函数组成,其中`main()`函数是程序的入口点。
程序的基本结构包括预处理指令、函数声明、变量声明和函数体。
数据类型与变量苏小红学习了C语言中的数据类型,包括整型(int)、字符型(char)、浮点型(float和double)等。
她学会了如何声明变量,并理解了变量的作用域和生命周期。
运算符与表达式苏小红掌握了C语言中的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符以及赋值运算符。
她学会了如何构建表达式,并理解了运算符的优先级。
控制结构控制结构是程序设计中的重要组成部分。
苏小红学习了条件语句(if、switch)、循环语句(for、while、do-while)以及跳转语句(break、continue、return、goto)。
她通过这些控制结构来实现程序的逻辑流程。
函数函数是C语言中实现代码复用的重要手段。
苏小红学习了如何定义函数、调用函数以及如何传递参数。
她还了解了函数的返回类型、参数列表和函数的递归调用。
数组数组是存储固定大小的同类型元素的集合。
苏小红掌握了一维数组和二维数组的使用,包括数组的声明、初始化和访问数组元素。
指针指针是C语言中一个强大的特性,它允许直接操作内存。
苏小红学习了指针的基本概念,包括指针的声明、指针与数组的关系、指针的算术以及指针函数。
结构体与联合体苏小红还学习了如何使用结构体(struct)和联合体(union)来创建复杂的数据类型。
她掌握了如何声明、初始化和使用这些用户定义的类型。
文件操作C语言提供了丰富的文件操作函数,允许对文件进行读写。
c语言程序设计苏小红第二版课后答案
c语言程序设计苏小红第二版课后答案C语言作为一门古老而强大的编程语言,至今仍然在各个领域中发挥着重要作用。
苏小红教授的《C语言程序设计》第二版是一本广受好评的教材,它不仅系统地介绍了C语言的基础知识,还通过丰富的实例和练习题帮助读者加深理解。
以下是该书部分课后习题的答案解析,以供参考。
第一章:C语言概述1. 问题:C语言的特点是什么?答案:C语言的特点包括简洁高效、结构化、可移植性高、丰富的运算符、数据类型丰富等。
2. 问题:C语言的发展历程是怎样的?答案:C语言起源于20世纪70年代,由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室开发,最初用于UNIX操作系统的编写。
随着UNIX的流行,C语言也逐渐被广泛使用。
第二章:数据类型、运算符和表达式1. 问题:C语言中的基本数据类型有哪些?答案:C语言中的基本数据类型包括整型(int)、字符型(char)、浮点型(float和double)等。
2. 问题:算术运算符有哪些?答案:算术运算符包括加(+)、减(-)、乘(*)、除(/)和模运算(%)。
第三章:控制语句1. 问题:if语句的基本形式是什么?答案:if语句的基本形式是:```cif (条件) {// 条件为真时执行的代码} else {// 条件为假时执行的代码}```2. 问题:for循环的一般形式是什么?答案:for循环的一般形式是:```cfor (初始化表达式; 条件表达式; 迭代表达式) {// 循环体}```第四章:数组1. 问题:一维数组的声明方式是什么?答案:一维数组的声明方式是:```c类型数组名[数组大小];```2. 问题:如何使用数组?答案:使用数组时,可以通过数组名和索引来访问数组元素,例如: ```cint arr[10];arr[0] = 1; // 给数组的第一个元素赋值```第五章:函数1. 问题:函数的定义包括哪些部分?答案:函数的定义包括返回类型、函数名、参数列表和函数体。
C语言大学实用教程精第一章-程序设计-苏小红ppt课件
完整最新ppt
22
1.3 一个简单C程序
#include <stdio.h>
int main () { printf("Good morning!\n"); return 0;
}
注意程序基本部分的写法。
程序是字符序列,应该按照易读的形式分行。程序形 式应较好反映程序本身的层次结构。
可用普通编辑器编写程序,现在人们常用专门的程序
00000001000000001000 00000001000100001010 00000101000000000001 00000001000100001100 00000100000000000001 00000010000000001110
数据装入寄存器0 数据装入寄存器1 寄存器0与1的数据乘 数据装入寄存器1 寄存器0与1的数据加 保存寄存器0里的数据
完整最新ppt
29
1.6 问题与程序设计过程
程序设计是智力劳动,编一个程序就是解决一个问题。 用计算机解决问题的过程可分为三步: 1)分析问题,设计一种解决问题方案; 2)用某种程序语言严格描述这一解决方案; 3)在计算机上试用程序,看它能否解决问题。 在运行时发现错误,就需仔细分析错误原因,退回到 前面步骤去纠正错误,直至得到满意结果。
20世纪80年代,C语言广泛流行,动摇了BASIC的地位。许
多人为其写变种,各种C版本涌出。因为C语言没有一个统
一的标准,导致了它的代码无法在各种编译器上实现,C语
言受到了变种松散的威胁——因此C语言必须进行标准化,
1983年美国国家标准化组织(ANSI)成立了C语言工作小
组,开始对C进行标准化,1989年12月ANSI C最终被ANSI
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stu[5]
...... stu[29]
(*pstu) .studentID = 100010数传递结构体的单个成员 向函数传递结构体的完整结构 • 复制整个结构体成员的内容,多个值 • 函数内对结构体内容的修改不影响原结构体 • 内容传递更直观,但开销大 向函数传递结构体的首地址 • 仅复制结构体的首地址,一个值 • 修改结构体指针所指向的结构体的内容 • 传递效率更高
26/74
结构体数据类型
例12.1
两个地址有何不同?
27/74
结构体数据类型
例12.1
结构体成员的地址 与该成员在结构体中 所处的位置及其所占 内存的字节数相关
结构体变量的地址 &stu2是该变量所占 内存空间的首地址
28/74
结构体数据类型
结构体变量及成员的地址
也可以通过首地址偏移来访问结构体成员 • 不保险,慎用
typedef struct date { int year; int month; int day; }DATE; typedef struct student { long studentID; char studentName[10]; char studentSex; DATE birthday; int score[4]; }STUDENT;
同类型的结构体允许整体赋值
struct student stu1,stu2; stu1 = {100010,”王刚”,‘M‟, “95”}; stu2 = stu1; • 相当于按结构体成员顺序逐一赋值 字符数组赋值时需要使用strcpy() • 不能通过使用数组名赋值方式完成字符串 赋值
25/74
结构体数据类型
例12.1
演示结构体变量的赋值和引用方法
typedef struct date { int year; int month; int day; }DATE; typedef struct student { long studentID; char studentName[10]; char studentSex; DATE birthday; int score[4]; }STUDENT;
34/74
结构体数据类型
结构体数组 例12.3
35/74
结构体数据类型
结构体指针
定义及初始化
STUDENT *pstu = &stu1;
等价于 pstu stu1 成员1
成员2
成员3
成员4
成
STUDENT *pstu; pstu = &stu1;
员 5
36/74
结构体数据类型
指向结构体数组的指针
typedef struct student { long studentID; char stuName[10]; char stuSex; int scoreEnglish; }STUDENT; typedef struct student STUDENT;
20/74
结构体数据类型
使用typedef定义数据类型别名
定义后别名和原名通用
struct student stu1; STUDENT stu1;
21/74
结构体数据类型
嵌套的结构体
在一个结构体内其成员可以是另一个结构体
typedef struct date { int year; int month; int day; }DATE; 不可以嵌套同 类型的结构体
11/74
结构体数据类型
希望的内存分配方式
12/74
结构体数据类型
结构体类型
结构体可以将不同类型的数据成员组织到统一 的变量名之下
结构体的定义
声明结构体模板 定义结构体变量
13/74
结构体数据类型
结构体的定义
声明结构体模板
struct 结构体名 { 数据类型 成员1名; 数据类型 成员2名; …. 数据类型 成员n名; }; 不要漏掉
• 使用数组
8/74
结构体数据类型
使用数组实现学生成绩管理
9/74
结构体数据类型
使用数组实现学生成绩管理
数组方案的内存分配
10/74
结构体数据类型
使用数组实现学生成绩管理
数组方案的缺点
• 内存分配分散,寻址效率低 • 容易发生数组数据错位 • 结构零散,不容易管理 • 复杂度高
最直观的解决方案是将每个学生的相关信息集 中到一起,统一管理
第12章 结构体和共用体
于水 yushuimail@
本章主要内容
抽象数据类型
结构体 共用体 枚举数据类型
2/74
抽象数据类型
从基本数据类型到抽象数据类型
二进制数——类型本不存在
• 在早期的机器指令及汇编语言中,数据对象 均用二进制数表示,没有类型的概念 • 内存里存的内容,你认为它是什么,它就是 什么
29/74
结构体数据类型
结构体所占内存的字节数
通常不是各成员所占字节数的总和
printf("%d\n", sizeof(SAMPLE));
12
30/74
结构体数据类型
结构体所占内存的字节数
对于多数计算机系统,存在内存的地址对齐问题,以 提高访问效率和运算速度 结构体默认的字节对齐一般满足三个准则: • 结构体变量的首地址能够被其最宽基本类型成员的 大小所整除; • 结构体每个成员相对于结构体首地址的偏移量都是 成员自身大小的整数倍,如有需要编译器会在成员 之间加上填充字节 • 结构体的总大小为结构体最宽基本类型成员大小的 整数倍,如有需要编译器会在最末一个成员之后加 上填充字节。 除了与各成员的数据类型有关外,与具体的计算机系 统也有关系
40/74
结构体数据类型
向函数传递结构体的完整结构
例12.4
Before function call:1999/04/23 After function call:1999/04/23
41/74
struct date { int year; int month; int day; }; void func(struct date p) { p.year = 2000; p.month = 5; p.day = 22; }
使用typedef定义数据类型
为现有的数据类型定义一个别名
typedef short INT16;
别名通常使用大写字母 并未定义一个新的数据类型 定义后别名和原名具有同样的功能,可以互换
INT16 i,j; short k;
19/74
结构体数据类型
使用typedef定义数据类型别名
为结构体定义别名
22/74
struct student { long studentID; char stuName[10]; char stuSex; DATE birthday; struct student stu1; int scoreMath; };
结构体数据类型
结构体变量的初始化
不嵌套情形
struct student stu1={100010,”王刚”,‘M‟, “95”}; STUDENT stu1={100010,”王刚”,‘M‟,“95”}; 嵌套情形 STUDENT stu1={100010,”王 刚”,„M‟,{1991,5,19},“95”};
• Class是Object-Oriented的一个重要概念
5/74
本章主要内容
抽象数据类型
结构体
共用体 枚举数据类型
6/74
结构体数据类型
为什么要使用结构体(实例引出)
实现学生成绩管理
• 学生信息、成绩的保存、求平均成绩等
7/74
结构体数据类型
实现学生成绩管理
目前可以想到的解决方法
与访问结构体变量一样 pstu 使用++运算符移动指针 STUDENT *pstu = &stu[0];
pstu->studentID = 100010; 等价于 stu[0]. studentID = 100010;
39/74
stu[30] stu[0]
stu[1]
stu[2] stu[3] stu[4]
16/74
结构体数据类型
结构体的定义
定义结构体变量 • 在定义类型的同时定义变量
struct student { long studentID; char stuName[10]; char stuSex; char yearOfBirth; int scoreMath; } stu1;
17/74
定义及初始化
STUDENT *pstu = stu;
等价于 pstu
stu[30] stu[0]
stu[1] stu[2]
stu[3] stu[4]
STUDENT *pstu; pstu = stu;
stu[5]
...... stu[29]
STUDENT *pstu; pstu = &stu[0];
14/74
struct student { long studentID; char stuName[10]; char stuSex; char yearOfBirth; int scoreMath; int scoreEnglish; int scoreComputer; int scoreProgam; }; 结构体成员