




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机二级C语言3第十二章 变量的作用域及存储类别1 全局变量和局部变量全局变量-凡是在函数外(包括主函数和子函数)定义的变量,它的有效范围是从定义开始到程序结束,其默认的初始值为0.局部变量-在函数内部(包括主函数和子函数)定义的变量,它的有效范围是在函数 内部,其默认的初始值为随机数。在复合语句内部定义的变量,它的有效范围是在复合语句内部,其默认的初始值为随机数。看下面程序输出结果是什么?例1:#include”stdio.h”int x;int fun()int x=5; printf(“%d,”,x);return x+;main()int y; y=fun(); int y=9; y+;printf(“%d,%dn”,x,y);答案:5,0,52 变量的存储类别所谓变量的存储类别就是指变量存储在内存中的哪个区域,内存的区域划分如下图:定义任何一个变量都要对这个变量进行三项说明:一是这个变量放在哪个区;二是这个变量的值的类型;三是这个变量的值是多少。 对于全局变量有两种存储类别的说明,即extern和static(封闭型的),并且全局变量放在静态区。对于全局变量如果省略存储类别说明,则默认是extern,extern有两种含义:一是说明这个全局变量是开放型的,二是用来扩展全局变量的使用范围。如:extern int x;/* 用于扩展x的使用范围 */main()printf(“%d”,x);int x; 对于局部变量有三种存储类别说明,即:auto(动态型)、static(静态型)、register(寄存器型)局部变量的默认存储类别是autoregister和auto基本一样,只不过前者速度要快一些。static称为静态局部变量:它放在静态区。也就是说,全局变量和静态局部变量是放在静态区的,放在静态区的变量有两个特点:默认初始值为0 其值保留。例子:下面程序输出结果是什么?#include”stdio.h”void fun(int *s)static int j; do sj+=sj+1;while(+j2);main()int k,a10=1,2,3,4,5;for(k=1;k3;k+) fun(a);for(k=0;kname,”li”);/*或strcpy(*p).name,”li”); */p-age=19 ; /*或(*p).age=19; */p-s1=78; /*或(*p).s1=78; */总结一下:表示结构体里的分量有三种方法:如把变量a里的分量 age改为20;可写成如下:a. age=20;p-age=20;(*p).age=20;5 结构体数组,看如下定义:struct student s3=“li”,19,78,“zhang”,20,80,“wang”,21,90;struct student p=s; /* 或写成p=&s0 */注意:变量s0、s1、s2在位置上是连续的。大家分析一下:如果执行p+;后,指针p指向谁?(指向s1)具备了上述的知识,我们可以做几个例题:例1:下面程序的输出结果是什么?#include”stdio.h”#define N 3struct studentchar name10; int age; float s1;int fun(struct student *p)float max=p-s1; int k=0,i; for(i=1;is1max) max=p-s1;k=i; return k; main() struct student sN=“li”,19,78,“zhang”,20,80,“wang”,21,90; int k;k=fun(s);printf(“%s,%d,%.2fn”,,sk.age,sk.s1);答案:wang,21,90.00 (即:求成绩最高的)例2:下面程序的输出结果是什么?#include”stdio.h”struct stint x; int *y;*p;int dt4=10,20,30,40;struct st aa4=50,&dt0,60,&dt0,60,&dt0,60,&dt0;main()p=aa;printf(“%dn”,+p-x); printf(“%dn”,(+p)-x); printf(“%dn”,+(*p-y);答案:51 60 11例3:下面程序的输出结果是什么?#include”stdio.h”#define N 3struct studentchar name10; int age; float score3;float av;void fun(struct student *p,struct student a)float avmin; int i,k; for(i=0;iN;i+) pi.av=(pi.score0+ pi.score1+ pi.score2)/3;avmin=p0.av; k=0; for(i=1;iN;i+) if(pi.avavmin) avmin=pi.av;k=i; pk=a; main()struct student sN=“li”,19,55,60,50,0,“zhang”,20,80,81,82,0,“wang”,21,90,91,92,0; struct student a=“lina”,25,65,66,67,66;int i,j;fun(s,a);for(i=0;iN;i+)printf(“n%s,%d,”,,si.age); for(j=0;j3;j+)printf(“%.2f,”,si.scorej);printf(“%.2f”,si.av);答案:例4:学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。例如,输入的分数是60、69,则应当把分数在6069之间的学生数据进行输出,包含60分和69分的学生数据。主函数中将把60放在low中,把69放在heigh中。注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。#include #define N 16typedef struct char num10; int s;STREC;int fun(STREC *a,STREC *b,int l,int h) 由学生自己来写main() STREC sN=GA005,85,GA003,76, GA002,69,GA004,85,GA001,96, GA007,72,GA008,64,GA006,87, GA015,85,GA013,94,GA012,64, GA014,91,GA011,90,GA017,64, GA018,64,GA016,72; STREC hN,tt; int i,j,n,low,heigh,t; printf(Enter 2 integer number low&heigh: ); scanf(%d%d,&low,&heigh); if( heighlow ) t=heigh;heigh=low;low=t; n=fun(s,h,low,heigh); printf(Thestudents data between %d-%d :n,low,heigh); for(i=0;in;i+) printf(%s %4dn,hi.num,hi.s); printf(n); 参考答案:int i,n=0;for(i=0;i=l&ai.s=h) bn+=ai;return n;输出结果:例5:编程题学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把分数最低的学生数据放在b所指的数组中。注意,分数最低的学生可能不止一个,函数返回分数最低的学生的人数。注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。#include #define N 16typedef structchar num10; int s;STREC;int fun(STREC *a,STREC *b)main() STREC sN=GA05,85,GA03,76, GA02,69,GA04,85, GA01,91,GA07,72, GA08,64,GA06,87, GA015,85,GA013,91, GA012,64,GA014,91, GA011,91,GA017,64, GA018,64,GA016,72; STREC hN; int i,n; FILE *out ; n=fun(s,h); printf(The %d lowest score :n,n); for(i=0;in; i+) printf(%s %4dn,hi.num,hi.s); printf(n); out=fopen(out24.dat,w); fprintf(out,%dn,n); for(i=0;in;i+) fprintf(out,%4dn,hi.s); fclose(out);参考答案: int i,mins,n=0;mins=a0.s;for(i=1;iN;i+) if(ai.smins) mins=ai.s;for(i=0;inext=&b;p=p-next;p-next=&c;p=p-next;p-next=0;经过上面的几个语句,已经把a,b,c三个变量连接起来了,这里要注意:每个变量都称为一个结点,最后一个结点的指针变量*next的值一定是0(或NULL、0)示意图如下:假设要输出上图中的每个结点的data:ST *p;p=h;while(p!=0) /* 如果把p!=0写成p-next!=0输出会是什么? */ printf(“%d,”,p-data); p=p-next; 动态链表的建立(不知道结点的个数) 动态链表分为不带头结点的和带头结点。例:从键盘输入若干个正整数(每个数就是每个结点里的data),直到输入-1为止,把这若干个结点连接起来。不带头结点的程序如下:#includestdio.h#includestdlib.htypedef struct ssint data; struct ss *next;ST;main()ST *h,*p,*q;int x;/* 下面程序是建立动态链表(不带头结点)*/ h=p=q=(ST *)malloc(sizeof(ST);while(1) scanf(“%d”,&x);if(x=-1) p-next=0;break;p=q;p-data=x;q=(ST *)malloc(sizeof(ST);p-next=q;/* 下面程序是输出各结点中的data*/p=h;/* 和带头结点的不一样*/while(p!=0) printf(“%d,”,p-data);p=p-next;带头结点的程序如下:#includestdio.h#includestdlib.htypedef struct ssint data; struct ss *next;ST;main()ST *h,*p,*q;int x;/* 下面程序是建立动态链表(带头结点)*/ h=p=q=(ST *)malloc(sizeof(ST);h-data=0;while(1) scanf(“%d”,&x);if(x=-1) p-next=0;break;q=(ST *)malloc(sizeof(ST);q-data=x;p-next=q;p=q;/* 下面程序是输出各结点中的data*/p=h-next;/* 和不带头结点的不同*/while(p!=0) printf(“%d,”,p-data);p=p-next;例子:填空题给定程序中,函数fun的功能是将带头结点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:16、3、1、7、5,排序后链表结点数据域从头至尾的数据为:1、3、5、7、16。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:不得增行或删行,也不得更改程序的结构!#include #include #define N 6typedef struct node int data; struct node *next;NODE;void fun(NODE *h) NODE *p, *q; int t;/*found*/ p= 1 ; /* p=h */ while(p) /*found*/ q= 2 ;/* q=p-next */ while(q) /*found*/ if(p-data 3 q-data) /* */ t=p-data; p-data=q-data; q-data=t; q=q-next; p=p-next; NODE *creatlist(int a) NODE *h,*p,*q; int i; h=(NODE*)malloc(sizeof(NODE); h-next=NULL; for( i=0; idata=ai; q-next=NULL; if(h-next=NULL) h-next=p=q; else p-next=q;p=q; return h;void outlist(NODE *h) NODE *p; p=h-next; if(p=NULL) printf(The list is NULL!n); else printf(nHead ); do printf(-%d,p-data); p=p-next; while(p!=NULL); printf(-Endn); main() NODE *head; int aN= 0, 16, 3, 1, 7, 5 ; head=creatlist(a); printf(nThe original list:n); outlist(head); fun(head); printf(nThe list after sorting :n); outlist(head);讲解一下P207的14.10和14.117 删除链表中的某一个结点老师画图讲解一下,并结合本章后面的习题8 在链表中插入一个结点老师画图讲解一下,并结合本章后面的习题9 共用体变量弄懂下面的例子就可以了:#include”stdio.h”main()union short i2; long k; char c4;r,*s=&r; s-i0=0x39;s-i1=0x38;printf(“%xn”,s-c0); 问:公用体变量r占多少字节?既:sizeof(r)=?(4)输出结果是什么?(39)如果把%x改为%c,输出结果是什么?(9)如果把%x改为%d,输出结果是什么?(57)如果把s-i0=0x39;和s-i1=0x38;分别改为 s-i0= 39;和s-i1= 38;输出结果是什么?(27) 如果把s-i0=0x39;和s-i1=0x38;分别改为 s-i0= 339;和s-i1= 338;输出结果是什么?(53)第十五章 位运算本章主要掌握有关位运算的几种符号:基本运算符:(按位取反)、 (右移) 、 &(按位与) (异或) 、|(按位或)扩展运算符: = &= = |=假设a=7,b=9a=2;问b=?(2, 右移2位相当于b=b/22)a&=b;问a=?(1,对应的两位均为1才得1,否则得0)a|=b;问a=?(15,对应的两位只要有一位是1 就得1,否则得0)a=b;问a=?(14,对应的两位相同为0,否则为1)本章内容学生自己看看书就可以了第十六章 C语言的文件1 C语言文件的概念数组是把类型相同的一些变量组合在一起;结构体是把类型不同的一些变量组合在一起;文件是可以把所有类型的变量组合在一起.2 如何建立、打开、关闭文件FILE *fp;/* 定义一个指向文件的指针,注意:FILE一定要大写 */fp=fopen(“文件名”,”打开文件的方式”); 文件名:如:char s=”a1.dat”;可以写成如下两种形式:fp=fopen(“a1.dat”,”打开方式”); fp=fopen(s,”打开方式”); 打开文件的方式:r:以只读方式打开一个已存在的文本 文件,w:以只写的方式打开一个文本文件,若文件存在则删除之,然后重新建立,a:以在文件末尾追加的方式打开一个文本文件,(属于只写方式)rb: 以只读方式打开一个已存在的二进制文件wb: 以只写的方式打开一个二进制文件,若文件存在则删除之,然后重新建立ab: 以在文件末尾追加的方式打开一个二进制文件,(属于只写方式)r+:以读写方式打开一个已存在的文本文件(可读可写)w+:以读写方式打开一个文本文件(可读可写),若文件存在则删除之,然后重新建立a+:以在文件末尾追加的方式打开一个文本文件,(可读可写)rb+:以读写方式打开一个已存在的二进制文件(可读可写)wb+:以读写方式打开一个二进制文件(可读可写),若文件存在则删除之,然后重新建立ab+:以在文件末尾追加的方式打开一个二进制文件,(可读可写) 关闭已打开的文件 fclose(fp);3 常见的对文件进行读写的函数(结合画图讲解)读写一个字符(只适合文本文件)fputc(ch,fp);/* 把一个字符写到文件里*/ ch=fgetc(fp);/* 从文件里读一个字符给变量ch*/例:从键盘输入一个字符串,并用字符#作为键盘输入结束,然后写到文件file1.dat里,再把该文件里的内容读出到屏幕。#include”stdio.h”main()FILE *fp;char ch; if(fp=fopen(“file1.dat”,”w”)=NULL) exit(0);ch=getchar();while(ch!=#) fputc(ch,fp);ch=getchar();fclose(fp);fp=fopen(“file1.dat”,”r”);ch=fgetc(fp);while(ch!=EOF) printf(“%c”,ch); ch=fgetc(fp);fclose(fp); 说明:对文件进行读操作时,就涉及到读到文件尾部的问题,也就是说如何判断是否到文件尾了,在C语言中,对于文本文件有两种办法判断,对于二进制文件有一种办法判断。如:上面的ch!=EOF可以写成!feof(fp),二进制文件只能用!feof(fp)。 读写一个字符串(只适应文本文件)fputs(str,fp);/* 向文件里写一个字符串,注意如果要写入多个字符串,要人为加入字符串之间的分隔符”n”,因为字符串的结束标志符0不能自动写到文件里,既:fputs(str,fp);fputs(“n”,fp); */fgets(str,n,fp);/* 从文件里读出一个字符串放入以str为起始地址的内存中,注意:字符串的最大长度是n-1,如果在未读满n-1个字符时就遇到了n或文件结束标志EOF了则结束本次读操作,系统自动在读出的字符串末尾加字符串的结束标志0 */例:#include”stdio.h”main()FILE *fp;int i; char s80=“123”,”abc”,s1280;fp=fopen(“file1.dat”,”w”);for(i=0;i2;i+) fputs(si,fp);fputs(“n”,fp);fclose(fp);fp=fopen(“file1.dat”,”r”);i=0;while(!feof(fp) fgets(s1i+,81,fp);fclose(fp);for(i=0;i2;i+) puts(s1i);答案:123 abc格式读写(只适应文本文件)fprintf(fp,”%d%d”,a,b);/* 把整形变量a和b的值写到文件里*/fscanf(fp,”%d%d”,&a,&b); /* 从文件里读出两个整数并分别赋给a和b */例:#include”stdio.h”main()FILE *fp;int i;int a=5,b=3,x,y;fp=fopen(“file1.dat”,”w”);fprintf(fp,”%d%d”,a,b);fclose(fp);fp=fopen(“file1.dat”,”r”);fscanf(fp,”%d%d”,&x,&y);fclose(fp);printf(“x=%d,y=%dn”,x,y);/*x=53,y=随机数 */分析:如果把fprintf(fp,”%d%d”,a,b);改为fprintf(fp,”%d %d”,a,b);或fprintf(fp,”%dn%d”,a,b);输出结果是什么?/*x=5,y=3 */若改为:fprintf(fp,”%d,%d”,a,b);呢?/*x=5,y=随机数 */ 块读写(只适应二进制文件)fwrite(读数的起始地址,数据块大小,读数的次数,fp);fread(放数的起始地址,数据块大小,读数的次数,fp);例1:#include”stdio.h”main()FILE *fp;int i;int a5=1,2,3,4,5,b5;fp=fopen(“file1.dat”,”wb”);fwrite(a,4,5,fp);fclose(fp);fp=fopen(“file1.dat”,”rb”);fread(b,4,5,fp);fclose(fp);for(i=0;i5;i+) printf(“%3d”,bi);答案:/*1 2 3 4 5 */例2:程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其他学生数据不变;若找不到,则什么都不做。#include #define N 5typedef struct student long sno; char name10; float score3;STU;void fun(char *filename, long sno) FILE *fp; STU n; int i; fp=fopen(filename,rb+);/*found*/ while( 1) /* ! feof(fp) */ fread(&n,sizeof(STU),1,fp);/*found*/ if(n.sno 2 ) break;/* =sno */ if(!feof(fp) for(i=0;i3;i+) n.scorei+=3;/*found*/ fseek(fp,-1L* 3 ,SEEK_CUR);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育孩子的发言稿
- 法国供应商培训
- 新能源课件大班
- PDCA循环工作方法培训课件
- 二零二五年高炮广告牌制作与城市地标建设合同
- 2025版商业综合体工程劳务承包与智能化合同
- 2025版智能制造业股权转手与增资升级合同
- 二零二五年度茶叶品牌营销策划合同样本
- 2025版墓地拆迁重建安置补偿合同
- 二零二五年度科技园区运维短期劳务合同范本
- 2025年燃气电厂笔试题库及答案
- 2025年科技咨询师考试题库
- 四川省凉山州2024-2025学年高一下册期末统一检测数学检测试卷
- 2025年道路运输两类人员安全员考试考核试题库答案
- 2025年历年医疗卫生卫健委面试真题及答案解析
- 2025年学法减分试题及答案
- 《智能建造概论》高职完整全套教学课件
- 心衰病人的观察与护理
- 2025年教育综合理论知识试题及答案
- 食品安全卫生试题及答案
- GB/T 30807-2025建筑用绝热制品浸泡法测定长期吸水性
评论
0/150
提交评论