c语言期末复习

时间:2019-05-12 17:59:13下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《c语言期末复习》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《c语言期末复习》。

第一篇:c语言期末复习

谁能出线

电视台举办“超级学生”才艺大赛,由于报名人数狂多,所以要先进行分组预赛。按规定,每10名学生为一个预赛小组,评委打出分数(0~100分),各小组第一名可以进入下一轮;如果有多名学生得分相同都是第一名,则可同时进入下一轮。

1.#include 2.#include 3.int main()4.{ 5.int a[10],i,max=0;6.for(i=0;i<10;i++)7.{ 8.scanf(“%d”,&a[i]);9.if(a[i]>max)10.{ 11.max=a[i];12.} 13.} 14.for(i=0;i<10;i++)15.{ 16.if(a[i]>=max)17.{ 18.printf(“%dn”,i);19.} 20.} 21.return 0;22.} 统计素数的个数

求出 2 到 m 之间(含 m,m<=1000)所有素数并放在数组 a 中。输入:正整数m 输出:从小到大的所有素数,及个数(素数输出的时候用%4d来控制)

1.#include 2.int main()3.{ 4.int a[1000],m,i=0,j,n,cnt;5.scanf(“%d”,&m);6.for(n=2;n<=m;n++)7.{ 8.a[i]=n;

9.i=i+1;10.}

11.cnt=0;

12.for(i=0;i

14.j=2;

15.while(a[i]%j!=0)16.{

17.j++;18.}

19.if(j==a[i])20.{

21.printf(“%4d”,j);22.cnt=cnt+1;23.} 24.25.}printf(“n”);26.printf(“%d”,cnt);27.printf(“n”);28.return 0;29.}

1.#include 2.int main()3.{

4.int a[10],i,j,n;5.for(i=0;i<10;i++)6.{

7.scanf(“%d”,&a[i]);8.}

9.for(j=0;j<10;j++)10.{ 11.12.for(i=0;i<9;i++)13.{

14.if(a[i+1]

16.n=a[i+1];17.a[i+1]=a[i];18.a[i]=n;19.} 20.} 21.} 22.23.for(i=0;i<10;i++)24.{

25.printf(“ %d”,a[i]);

冒泡法排序26.} 27.printf(“n”);28.return 0;29.} 插入法排序

1.#include 2.int main()3.{ 4.int a[11],i,n,m,j;5.for(i=0;i<10;i++)6.{ 7.scanf(“%d”,&a[i]);8.} 9.scanf(“%d”,&n);10.for(j=0;j<11;j++)11.{ 12.for(i=0;i<10;i++)13.{ 14.if(n

1.#include 2.#define N 10 3.int main()4.{ 5.int n,a[N],i=0,k=0,t,m=0,j;6.scanf(“%d”,&n);

7.do 8.{

9.a[i]=n%10;10.n=n/10;11.i++;12.k++;

13.}while(n!=0);

14.for(j=0;j

16.for(i=0;i

18.if(a[i+1]>a[i])19.{

20.m=a[i+1];21.a[i+1]=a[i];22.a[i]=m;23.} 24.} 25.}

26.for(i=0;i

28.printf(“%d”,a[i]);29.}

30.printf(“n”);31.return 0;32.}

数组逆序输出

1.#include 2.int main()3.{

4.int a[10],i,j,t;5.for(i=0;i<10;i++)6.{

7.scanf(“%d”,&a[i]);8.} 9.i=0;10.j=9;

11.while(i

13.t=a[i];14.a[i]=a[j];15.a[j]=t;16.i++;17.j--;18.}

19.for(i=0;i<10;i++)20.{ 21.printf(“%d ”,a[i]);22.} 23.printf(“n”);24.return 0;25.} 求最大值

1.#include 2.int main()3.{ 4.int a[10],i,max;5.for(i=0;i<10;i++)6.{ 7.scanf(“%d”,&a[i]);8.} 9.max=a[0];10.for(i=0;i<10;i++)11.{ 12.if(max

程序定义了 4× 4 的二维数组,请编写程序,给二维数组赋值,并使数组下半三角元素中的值乘以n。例如:

数组中的值为

假设n为10,则输出结果如下:(输出的数按照4位宽度来输出,即%4d)

1.#include 2.int main()3.{

4.int a[4][4],i,j,n;5.for(i=0;i<4;i++)6.{

7.for(j=0;j<4;j++)8.{

9.scanf(“%d”,&a[i][j]);10.} 11.}

12.scanf(“%d”,&n);13.for(i=0;i<4;i++)14.{

15.for(j=0;j<=i;j++)16.{

17.a[i][j]=n*(a[i][j]);18.} 19.}

20.for(i=0;i<4;i++)21.{

22.for(j=0;j<4;j++)23.{

24.printf(“%4d”,a[i][j]);25.}

26.printf(“n”);27.}

28.return 0;29.}

在屏幕上显示杨辉三角形

1.#include 2.#define N 100 3.#define M 100 4.int main()5.{

6.int a[N][M],i,j,n;7.scanf(“%d”,&n);8.for(i=0;i

10.j=i;

11.a[i][0]=1;12.a[i][j]=1;13.} 14.for(i=2;i

1.#include 2.#define N 10 3.#define M 10 4.int main()5.{ 6.int a[N][M],n,i,j,m;7.scanf(“%d”,&n);8.for(i=0;i

28.printf(“ %d”,a[i][j]);

29.} printf(“n”);30.}

31.return 0;32.}

给数组中的元素按顺序编号

对数组 a[10] 中的十个整数从小到大进行连续编号,输出各个元素的编号。要求不能改变数组 a 中元素的顺序,且相同的整数要具有相同的编号。例如数组是: A=(5,3,4,7,3,5,6,8,9,10)则输出为:(4,1,3,7,1,4,6,8,9,10)

1.#include 2.int main()3.{

4.int a[10],b[10],i,j,t;5.for(i=0;i<10;i++)6.{

7.scanf(“%d”,&a[i]);8.}

9.for(i=0;i<10;i++)10.{

11.b[i]=a[i];12.}

13.for(i=0;i<9;i++)14.{

15.for(j=i+1;j<10;j++)16.{

17.if(a[i]>a[j])18.{

19.t=a[i];20.a[i]=a[j];21.a[j]=t;22.} 23.} 24.}

25.for(j=0;j<10;j++)26.{

27.for(i=0;i<10;i++)28.{

29.if(b[j]==a[i])30.{

31.printf(“%3d”,i+1);brea

k;

32.} 33.}

34.}printf(“n”);35.return 0;36.} 字符转换

描述

提取一个字符串中的所有数字字符(‘0’...‘9’)将其转换为一个整数输出。输入

一个以回车符为结束标志的字符串(少于80个字符)。输出

把字符串中的所有数字字符(‘0’...‘9’)转换为一个整数并输出。

1.#include 2.#define N 80 3.int main()4.{ 5.char a[N];6.int j;7.scanf(“%s”,a);8.for(j=0;a[j]!='';j++)9.{ 10.if((a[j]<='9')&&(a[j]>='0'))

11.{ 12.printf(“%c”,a[j]);13.} 14.} 15.printf(“n”);16.return 0;17.} 合并字符串

输入:

两个已经排好顺序(升序)的字符串

输出:

一个合并在一起的有序(升序)的字符串

要求:

设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。

如果采用先进行串连接,然后再进行排序的算法,则效率太低了。

1.#include 2.#include 3.#define N 20 4.#define M 10 5.int main()6.{

7.char a[N],b[M];8.int i,j,t,n;9.gets(a);10.gets(b);11.strcat(a,b);12.n=strlen(a);

13.for(i=0;i

15.for(j=i+1;j

17.if(a[i]>=a[j])18.{

19.t=a[i];20.a[i]=a[j];21.a[j]=t;22.} 23.} 24.}

25.puts(a);26.return 0;27.}

删除重复字符

1.#include 2.int main()3.{

4.char a[100],b[100];5.int i,j,n=0;6.gets(a);7.b[0]=a[0];

8.for(i=0;a[i]!='';i++)9.{ 10.j=0;11.for(j=0;j<=n;j++)12.{ 13.if(a[i]==b[j])14.{ 15.break;16.} 17.} 18.if(a[i]!=b[j])19.{ 20.n++;21.b[n]=a[i];22.} 23.} 24.b[n+1]='';25.puts(b);26.return 0;27.} 删除字符串中指定字符

1.#include 2.int main()3.{ 4.char a[15],b[4],c[10];5.int i,j,n=0;6.gets(a);7.gets(b);8.for(i=0;a[i]!='';i++)9.{ 10.j=0;11.for(j=0;j<3;j++)12.{ 13.if(a[i]==b[j])break;14.15.} 16.if(a[i]!=b[j])17.{ 18.c[n]=a[i];19.n++;20.} 21.22.} 23.c[n]='';24.puts(c);25.return 0;26.}

在指定位置插入字符串

1.#include 2.#include 3.int main()4.{

5.char a[20],b[5],ch,c[10];6.int i,j,k,n;

7.gets(a);gets(b);8.scanf(“%c”,&ch);9.n=strlen(b);

10.for(i=0;a[i]!='';i++)11.{

12.if(ch==a[i])break;13.} 14.k=0;

15.for(j=i;a[j]!='';j++)16.{

17.c[k]=a[j];18.k++;19.}

20.c[k]='';

21.for(j=0;j

23.printf(“%c”,a[j]);24.}

25.printf(“%s”,b);26.printf(“%sn”,c);27.return 0;28.}

数的合并

1.int fun(int a,int b)2.{

3.int c;

4.c=a/10*10+a%10*1000+b/10+b%10*100

;

5.return c;6.}

7.int main()8.{

9.int a,b,c;

10.scanf(“%d%d”,&a,&b);11.c=fun(a,b);

12.printf(“c=%dn”,c);13.return 0;14.} 素数的判断

1.int fun(int a)2.{ 3.int i;4.for(i=2;i

请编写函数fun,它的功能是计算下列级数和,值由函数值返回。

例如,当n=10,x=0.3时,函数值为1.349859。请勿改动主函数main,仅在函数fun的花括号中填入所编写的若干语句。

1.#include 2.double fun(double a,int b)3.{ 4.int i,m=1;5.double z,S=1;6.for(i=1;i<=b;i++)7.{ 8.m=m*i;9.z=pow(a,i);

10.S=S+z/m;11.}

12.return S;13.}

14.int main()15.{

16.double x;17.int n;

18.scanf(“%lf%d”,&x,&n);19.printf(“%lfn”,fun(x,n));20.return 0;21.}

求大于m且紧靠m的k个素数

1.int fun(int m,int n,int zz[1000])2.{

3.int i,j,cnt=0,k=0;4.for(i=m+1;i<1000;i++)5.{

6.for(j=2;j

8.if(i%j==0)9.break;10.}

11.if(j==m+1)12.{

13.cnt++;14.zz[k]=i;15.k++;

16.if(cnt==n)17.{

18.return zz[m];19.} 20.} 21.} 22.}

23.int main()24.{

25.int m,n,zz[1000];26.scanf(“%d%d”,&m,&n);27.fun(m,n,zz);

28.for(m=0;m

29.printf(“%6d”,zz[m]);30.printf(“n”);31.return 0;32.}

删除指定字符 请编写函数fun,其功能是:从字符串中删除指定的字符。同一字母的大、小写按照不同的字符处理。1.#include 2.char fun(char str[80],char ch)3.{ 4.int i,j=0;5.char a[80];6.for(i=0;str[i]!='';i++)7.{ 8.if(str[i]!=ch)9.{ 10.a[j]=str[i];11.j++;12.} 13.} 14.a[j]='';15.strcpy(str,a);16.return str[j];17.} 18.int main()19.{ 20.char str[80];21.char ch;22.23.gets(str);24.scanf(“%c”,&ch);25.fun(str,ch);26.printf(“%sn”,str);27.return 0;28.} 递归

求整数 n 到 m 区间的累加和,其中n<=m。输入:

区间的起始点n 区间的终止点m 输出:

累加和

1.int fun(int a,int b)2.{ 3.int h;4.h=a;5.if(a==b)6.{ 7.h=a;8.} 9.else if(a

11.h=b+fun(a,b-1);12.} 13.14.return h;15.}

16.int main()17.{

18.int m,n,s;

19.scanf(“%d%d”,&n,&m);20.s=fun(n,m);

21.printf(“%dn”,s);22.return 0;23.}

求最大公约数——递归

请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。

1.#include 2.int GCD(int n,int m)3.{

4.if((m<=n)&&(n%m==0))5.{

6.return m;7.}

8.else if(n

10.return GCD(m,n);11.} 12.else 13.{

14.return GCD(m,n%m);15.} 16.}

17.int main()18.{

19.int a,b;

20.scanf(“%d%d”,&a,&b);21.printf(“%dn”,GCD(a,b));22.return 0;23.}

求数列的第N项

已知整数数列第一项和第二项是1,该数列从第三项开始,如果该项是奇数项,则它是前两项之和,如果该项是偶数项,则它是前两项之差,即:  f(n)= 1 当 n = 1 或 2 时, f(n)= f(n-1)-f(n-2)当n是偶数时, f(n)= f(n-1)+ f(n-2)当n是奇数时,编写一个递归函数,求数列的第N项。

1.#include 2.int f(int n)3.{ 4.int m;5.if(n<=2)6.{ 7.return 1;8.} 9.else 10.{ 11.if(n%2==0)12.{ 13.return m=f(n-1)-f(n-2);

14.} 15.else 16.{ 17.return m=f(n-1)+f(n-2);

18.} 19.} 20.} 21.int main()22.{ 23.int n;24.scanf(“%d”,&n);25.printf(“%dn”,f(n));26.return 0;27.} 偶数分解

编写程序,输入若干个大于2的正整数,如果是偶数,则将其分解为两个素数并输出;如果输入的奇

数,则输出“××× is odd number!” ;输入为0时程序结束。只有1和它本身这两个因数的自然数叫做素数,0和1既不是素数也不是和数。实现分解的过程用函数实现。输入:整数序列,0

输出:偶数1 = 素数A + 素数B(当输入是偶数时)奇数1 is odd number!(当输入是奇数时)1.#include 2.int s(int n)3.{

4.int i;

5.for(i=2;i

7.if(n%i==0)8.return 0;9.}

10.if(i==n)11.{

12.return 1;13.} 14.}

15.void fun(int n)16.{

17.int i;

18.for(i=2;i

20.if(s(n)==1)21.{

22.printf(“%d is odd number!

n”,n);23.}

24.else if((s(i)==1)&&(s(n-i)=

=1))

25.{

26.printf(“%d=%d+%dn”,n,i,n

-i);break;27.} 28.} 29.}

30.int main()31.{

32.int n;33.do 34.{

35.scanf(“%d”,&n);36.fun(n);37.}while(n!=0);38.return 0;39.} 浮点数四舍五入

1.#include 2.#include 3.double fun(double a)4.{ 5.return(floor)(a*100+0.5)/100.0;

6.} int main()7.{ double a;8.scanf(“%lf”, &a);9.printf(“%lfn”, fun(a));10.return 0;11.} 长整型截短

1.#include 2.int fun(int n)3.{ 4.int a,i=0,b=0;5.do 6.{ 7.a=n%10;8.n=n/10;9.if(a%2==0)10.{ 11.b=b+a*pow(10,i);12.i++;13.} 14.}while(n!=0);15.return b;16.} 17.int main()18.{ int n;19.scanf(“%ld”,&n);20.printf(“The result is: %ldn”,fun(n));

21.return 0;22.}

长整型截短

编写一个函数fun,其功能是:将形参n中,各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。

1.#include

2.int fun(int n)

3.{

4.int a,i=0,b=0;5.do 6.{

7.a=n%10;8.n=n/10;9.if(a%2==0)10.{

11.b=b+a*pow(10,i);12.i++;13.}

14.}while(n!=0);15.return b;16.}

17.int main()18.{ int n;

19.scanf(“%ld”,&n);

20.printf(“The result is: %ldn”,fun(n));

21.return 0;22.}

公式求解

1.double fun(int n)2.{

3.int i;

4.double a=1,s=1;5.for(i=1;i<=n;i++)6.{

7.a=a/i;8.s=s+a;9.} 10.return s;11.} 12.int main()13.{ int n;14.double s;15.16.scanf(“%d”,&n);17.s=fun(n);18.printf(“s=%fn”,s);19.return 0;20.} 数的合并

请编写函数fun,其功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a的十位和个位依次存放在c数的十位和千位上,b的十位和个位依次存放在c数的个位和百位上。

1.int fun(int a,int b,int *p)2.{ 3.*p=a/10*10+a%10*1000+b%10*100+b/10;4.return p;5.} 6.int main()7.{ 8.int a,b,c;9.scanf(“%d%d”,&a,&b);10.fun(a,b,&c);11.printf(“%dn”,c);12.return 0;13}

数组中奇偶数

请编一个函数 fun,函数的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参 n 给了数组中数据的个数:利用指针 odd 返回奇数之和,利用指针 even 返回偶数之和。

例如:数组中的值依次为: 1,8,2,3,11,6 ;则利用指针 odd 返回奇数之和 15 ;利用指针 even 返回偶数之和 16。

 void fun(int x[],int y,int *odd,int *even)

 {

int i; *odd=0; *even=0;

for(i=0;i

if(x[i]%2!=0) {

 *odd=*odd+x[i]; } 

else

 {

 *even=*even+x[i]; }  }  }

 int main()

 { int a[N],i,n,odd,even; scanf(“%d”,&n);

for(i=0;i

 printf(“The sum of even numbers:%dn”,even);

return 0; }

 #include



#define N 20

浮点数四舍五入

请编一个函数 void fun(double a,double *h),函数的功能是对变量 h 中的值保留 2 位小数,并对第三位进行四舍五入(规定 h 中的值为正数)。

例如: h 值为 8.32433,则函数返回 8.32 ;

h 值为 8.32533,则函数返回 8.33。

 #include

 void fun(double a,double *h) {

 *h=(floor)(a*100+0.5)/100; } int main() {

 double a,h;

 scanf(“%lf”,&a); fun(a,&h);

 printf(“The result:%lfn”,h); return 0;

 }

字符移动

请编一个函数void fun(char *s),函数的功能是把字符串中所有的字符前移一个位置,串中的第一个字符移到最后。

例如:原有的字符串为: Mn.123xyZ,则调用该函数后,串中的内容为: n.123xyZM。

 void fun(char *s) {

int i=0,j,k;

char ch,a[N];

do

 {

 a[i++]=*(s++); }while(*s!=''); ch=a[0];



for(j=0;j

 a[j]=a[j+1]; }

 a[i-1]=ch; a[i]='';



for(k=i-1;k>=0;k--) {

 *(--s)=a[k]; }

 } int main() { char a[N]; gets(a); fun(a);

 printf(“%sn”,a); return 0; }

生成新数

给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。

例如,输入一个数:27638496,新的数:为739。

 #include  void fun(int *p) {

int a[10],b[10];

int i=0,j=0,k;

do

 {

 a[i++]=*p%10; *p=*p/10; }while(*p!=0);



for(k=0;k



if(a[k]%2!=0) {

 b[j++]=a[k]; }  }



for(k=0;k

 *p=*p+b[k]*pow(10,k); }  }

 int main() { int n=-1;

while(n>99999999||n<0) { scanf(“%d”,&n);}  fun(&n);

 printf(“%dn”,n);

return 0; }

字符串转换成整数

请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数。例如,若输入字符串“-1234”,则函数把它转换为整数值-123

4 #include

 int fun(char *p) {

char a[10];

int q=0,i=0,j=0;

do

 {

 a[j++]=*(p++); }while(*p!='');

if(a[0]=='-') {



for(i=1;i

q=q+(a[i]-'0')*pow(10,j-1-i); }

 q=-1*q; } 

else

 {



for(i=0;i

q=q+(a[i]-'0')*pow(10,j-1-i); }  }



return q; }

 int main()/* 主函数 */

 { char s[10];

int n; gets(s); n = fun(s);

 printf(“%dn”,n);

return 0; }

二维数组按列优先存放

请编写函数fun, 函数的功能是: 将M行N列的二维数组中的字符数据, 按列的顺序依次放到一个字符串中。

例如, 二维数组中的数据为: W W W W S S S S H HHH 则字符串中的内容应是: WSHWSHWSHWSH。

 void fun(char w[M][N],char *q) {

int j,i;

for(j=0;j

for(i=0;i

 *(q++)=w[i][j]; }  }

 *q=''; }

 int main() { char

a[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}};

 fun(w,a); puts(a);

return 0;

 } #include

 #define M 3

 #define N 4

删除字符串中指定的星号

假定输入的字符串中只包含字母和 * 号。请编写函数 fun,它的功能是:除了尾部的 * 号之外 , 将字符串中其它 * 号全部删除。在编写函数时,不得使用 C 语言提供的字符串函数

 void fun(char *p,char *t) {

char a[30],b[30],ch;

int i=0,j,k=0;

do

 {

 a[i++]=*(p++); }while(*p!=''); a[i]='';

for(j=0;;j++) {



if(a[j]!='*') {

 b[k++]=a[j];

 if(a[j]==*t)break; }  }



for(j=k;j

 b[j]=*(++t); }



for(k=j;k>=0;k--) {

 *(p--)=b[k]; }  }

 int main()

 { char s[81],*t; gets(s); t=s;

while(*t)t++; t--;

while(*t=='*')t--; fun(s , t); puts(s);

return 0; }

统计数字字符

请编写函数 fun,它的功能是: 统计形参 s 所指字符串中数字字符出现的次数,并存放在形参 t

 void fun(char *p,int *q) {

int i=0;

for(;*p!='';p++) {

if((*p>='0')&&(*p<='9')) {

 i++; }  }

 *q=i; } int main() { char s[80];

int t; gets(s); fun(s,&t);

 printf(“%dn”,t);

return 0; }

将两个串按要求形成一个新串

给定程序的函数 fun 的功能是:逐个比较 p、q 所指两个字符串对应位置中的字符,把 ASCII 值大或相等的字符依次存放到 c 所指数组中,形成一个新的字符串。

 void fun(char *p,char *q,char *c) {

int i,j;

for(i=0;*(p+i)!=''&&*(q+i)!='';i++)

 {

if(*(p+i)>=*(q+i)) {

 *(c+i)=*(p+i); } 

else

 {

 *(c+i)=*(q+i); }  }  j=i;



if(*(p+j)!='') {



for(j=i;*(p+j)!='';j++) {

 *(c+j)=*(p+j); }  } 

else

 {

 for(j=i;*(q+j)!='';j++) {

 *(c+j)=*(q+j); }  }

 *(c+j)=''; }

 int main()

 { char a[10], b[10], c[80]; gets(a);gets(b); fun(a,b,c); puts(c); return 0;

 }

 #include

 #include

统计子串的个数

请编写函数 fun,它的功能是: 统计 substr 所指子字符串在 str 所指字符串中出现的次数。

 void fun(char *p,char *q,int *c) {

int i,j,cnt; *c=0;

for(;*p!='';p++) {

 cnt=1;

if(*p==*q) {

 for(j=0;*(q+j)!='';j++) {

 if(*(p+j)!=*(q+j)) {

 cnt=0; break; }  }  }



else cnt=0;

if(cnt) {

(*c)++; }  }  }

 int main() {

char str[80],substr[80];

int count; gets(str);

 gets(substr);

 fun(str,substr,&count); printf(“%dn”,count);

return 0; }

函数 fun 的功能是: 将 s 所指字符串中除了下标为奇数、同时 ASCII 值也为奇数的字符之外,其余的所有字符都删除 , 串中剩余字符所形成的一个新串放在 t 所指的数组中。

 void fun(char *p,char *q) {

int i;

for(i=0;*(p+i)!='';i++) {

if(i%2==1&&*(p+i)%2==1) {

 *(q++)=*(p+i); }  }

 *(q++)=''; } int main() {

char s[100], t[100]; scanf(“%s”, s); fun(s, t);

 printf(“%sn”, t);

return 0; }

求非偶数的除数

请编写函数 fun,它的功能是:求出能整除形参 x 且不是偶数的各整数 , 并按从小到大的顺序放在 pp 所指的数组中 , 这些除数的个数通过形参 n 返回。

 void fun(int x,int *p,int *q) {

int i; *q=0;

for(i=1;i<=x;i=i+2) {

if(x%i==0) {

 *(p++)=i;(*q)++; }  }  }

 int main()

 { int x, aa[1000], n, i; scanf(“%d”, &x); fun(x, aa, &n);

for(i = 0;i < n;i++) printf(“ %d”, aa[i]); printf(“n”);

return 0; }

求最大值及其下标

请编写函数 fun,其功能是求出数组的最大元素在数组中的下标并存放在 k 所指的存储单元中

 void fun(int *p,int n,int *q) {

int i,max; max=0;

for(i=0;i

if(*(p+i)>max) {

 max=*(p+i); *q=i; }  }  }

 void main() {

int a[10], k ,i;

for(i=0;i<10;i++)

 scanf(“%d”,&a[i]); fun(a, 10, &k);

 printf(“%d,%dn”, k, a[k]); }

结构体填空

给定程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。函数modify的功能是将该学生的各科成绩都乘以一个系数a。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

 #include

 typedef struct

 {

int num;

char name[9];

float score[3]; } STU;

 void show(STU tt) {



int i;

 printf(“%d %s : ”,tt.num,tt.name);

for(i=0;i<3;i++)

 printf(“%5.1f”,tt.score[i]); printf(“n”); }

 void modify(STU *ss,float a) {



int i;



for(i=0;i<3;i++) ss->score[i]*=a; }

 int main() {

 STU std=

{ 1,“Zhanghua”,76.5,78.0,82.0 };



float a;

 scanf(“%f”,&a); modify(&std,a); show(std);

return 0; }

程序通过定义学生结构体变量,存储了学生的学号、姓名和 3 门课的成绩。函数 fun 的功能是对形参 b 所指结构体变量中的数据进行修改 , 最后在主函数中输出修改后的数据。

 #include

 #include

 struct student { 

long sno;

char name[10];

float score[3]; };

 void fun(struct student *b) {

 b->sno= 10004;

 strcpy(b->name, “LiJie”); }

 int main()

 { struct student t={10002,“ZhangQi”, {93, 85, 87}};



int i; fun(&t);

 printf(“No: %ld Name: %snScores:”,t.sno, t.name);

for(i=0;i<3;i++)printf(“%6.2f”, t.score[i]);

 printf(“n”);

return 0; }

程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和 3 门课的成绩。函数 fun 的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序。

 #include

 #include

 struct student { 

long sno;

char name[10];

float score[3]; };

 void fun(struct student a[], int n) {



struct student t;

int i, j;



for(i=0;i



for(j=i+1;j



if(strcmp(a[i].name,a[j].name)> 0)

 { t = a[i];a[i] = a[j];a[j] = t;}

 }

 int main()

 { struct student

s[4]={{10001,“ZhangSan”, {95, 80, 88}},{10002,“LiSi”, {85, 70, 78}}, {10003,“CaoKai”, {75, 60, 88}},{10004,“FangFang”, {90, 82, 87}}};



int i, j; fun(s, 4);

 printf(“The data after sorting :n”);

for(j=0;j<4;j++)

 { printf(“nNo: %ld Name: %-8s Scores:”,s[j].sno, s[j].name);

for(i=0;i<3;i++)

 printf(“%6.2f”, s[j].score[i]); }

 printf(“n”);

return 0; }

第二篇:语言期末复习名词解释

名词解释

补码:

计算机处理带符号数的编码,正数的补码就是其本身,负数的补码是原二进制码取反后加一。

BCD码:

用4位二进制表示1位十进制数的编码;分组合BCD码和非组合BCD码两种形式。

物理地址和逻辑地址:

逻辑地址由两个16位的地址分量构成,其中一个为段基址的高16位,另一个为偏移量。

段寄存器:

用于保存代码段、数据段、堆栈段和附加段的段基值(即段基址的高16位)的专用寄存器,分别是CS、DS、SS和ES。

IP寄存器:

即指令指针寄存器,用于保存下一条指令在代码段中的偏移量。

偏移量:

逻辑地址的一部分,又称为有效地址,为某存储单元距离段基址的字节数。

寻址方式:

指令获取操作数或操作数地址的方式;寻址方式包括“寄存器寻址”、“立即数寻址”、“存储器寻址”、“I/O接口寻址”等。

基址寻址和变址寻址:

立即数:以数值形式直接给出的操作数称为立即数,立即数不能作为目的操作数。

位移量:直接以数字形式出现的偏移量的分量之一。

伪指令:用于指示编译(汇编)程序如何进行编译的指令。

位操作指令:

能精准到位对其进行读写的计算机指令,包括逻辑运算和移位及循环移位指令。

PF标志位:

用于标志执行算术或逻辑运算后,运算结果的低8位中包含“1”数据位的奇偶结果。如果运算结果包含偶数个“1”,PF置1,否则被清0。

中断过程:中断请求、中断响应、中断处理、中断返回

第三篇:c语言期末复习试题

下面程序运行时,如果从键盘上输入3,5<回车>,程序输出的结果是(C)。void main(void){ int a,b,*pa,*pb;pa=&a;pb=&b;scanf(“%d,%d”,pa,pb);*pa=a+b;*pb=a+b;printf(“a=%d,b=%dn”,a,b);} A.a=13,b=13 B.a=8,b=8 C.a=8,b=13 D.出错

?设有定义:int n1=0, n2, p=&n2, q=&n1;,以下赋值语句中与n2=n1;语句等价的是(A)。A.*p=*q;//将指针q指向的地址里的值(即n1的值),赋给指针p指向的地址里(n2)B.&q=&p;//p 和 q 分别存放n1、n2变量地址的,该地址是由系统分配的,不能赋值 C.p=&n1;D.p=q;

以下程序的运行结果是:(A)。

void main(void){ struct num { int x;int y;}cnum[2]={1,3,2,6};printf(“%dn”,cnum[0].y/cnum[0].x*cnum[1].y);} A.18 B.12 C.6 D.1

若定义了

struct num { int a;int b;}d[3] ={{1,4},{2,5},{6,7}};则执行printf(“%dn”,d[2].a* d[2].b/d[1].b);语句的输出结果是:(C)。A.2 B.2.5 C.8 D.8.4

有如下定义:

struct date { int year,month,day;};struct person { char name[20];char sex;struct date birthday;} a;对结构体变量a的出生年份赋值时,下面正确的赋值语句是:(C)。

A.a.year=2010;B.birthday.year=2010;C.a.birthday.year=2010;D.year=2010;

若变量x和y均为整型,且x=y=1,则表达式y+=x+1的值为(A)。A.3 B.2 C.1 D.无正确结果

表示关系x<=y<=z的c语言表达式为(C)。A.(X<=Y<=Z)B.(X<=Y)AND(Y<=Z)C.(X<=Y)&&(Y<=Z)D.(X<=Y)&(Y<=Z)

若有输入语句“scanf(”%d,%d,%d“ ,&x,&y,&z);”,欲使x的值为10,y的值为20,z的值为30,则正确的输入应为(C): A.10 , 20 ,30〈回车〉 B.10 20 30〈回车〉 C.10,20,30〈回车〉

D.10〈回车〉20〈回车〉30〈回车〉

x为int型变量,执行以下语句后,x的值为(B)。x=10;x+=x-=x-x;A.10 B.20 C.30 D.40

有以下程序: void main(){ ;

; ; } 程序运行后的结果是(D): A.编译时有警告错误 B.编译时有语法错误

C.编译没有错误,但是运行时出错 D.程序正常运行,但是无任何输出

关于if后面一对圆括号中的表达式,叙述正确的是(D)。A.只能用关系表达式 B.只能用逻辑表达式

C.只能用关系表达式或逻辑表达式 D.可以使用任意合法的表达式

以下不正确的if语句是(D)。A.if(ab)&&(b>c)printf(“max=%d”,a);

feof(fp)函数是用来测试fp所指的文件是否结束,如果文件结束,则feof(fp)返回的值是(B): A.0 B.1 C.NULL D.以上答案都不对

调用fopen函数打开一个文件失败时,函数返回的值是(C): A.-1 B.EOF C.NULL D.1

在对文件进行操作时,读文件的含义是(B): A.将内存中的信息存入磁盘 B.将磁盘中的信息输入到内存 C.将CPU中的信息存入磁盘 D.将磁盘中的信息输入到CPU

以下运算符中,优先级最高的是(B)。A.!B.[ ] C.++ D.%

假设有两个字符数组a[80],b[80],则正确的输出语句是(D)。A.puts(a,b);B.printf(“%s %s”,a[],b[]);C.putchar(a,b);D.puts(a);puts(b);

对定义“int a[2];”的正确描述是(B)。A.定义一维数组a,包含a[1]和a[2]两个元素 B.定义一维数组a,包含a[0]和a[1]两个元素

C.定义一维数组a,包含a[0]、a[1]和a[2]三个元素 D.定义一维数组a,包含a(0)、a(1)和a(2)三个元素

在引用数组元素时,其下标表达式的类型必须是(D)。A.字符型 B.整型

C.整型或字符型

D.整型常量或整型表达式

在C程序中,不合法的浮点型常量是(A): A.3.4E2.5 B..456 C.0.820000 D.100.3e5

C程序中,合法的关键字是(A): A.int B.integer C.Int D.Integer

执行循环语句“for(i=1;i<10;i++)a++;”后,变量i的值是(B)。A.9 B.10 C.11 D.不确定

有以下程序段: int t=0;while(t=1)t--;while循环执行的次数是(C)。A.一次也不执行 B.只执行一次 C.无限次 D.执行2次

C语言中while和do-while循环的主要区别为(A)。A.do-while的循环体至少无条件执行一次

B.while的循环控制条件比do-while的循环控制条件严格 C.do-while允许从外部转到循环体内 D.do-while的循环体不能是复合语句

While 语句中循环结束的条件是while后面表达式的值是(A)。A.0 B.1 C.-1 D.非0

已经有以下函数定义: fun(char a){ printf((“a=%cn”, a);} 该函数的返回值类型是(C)。A.void B.char C.int D.不确定

以下关于函数调用的描述中错误的是(B)。A.实参可以是常量、表达式或有确定值的变量 B.实参和形参共用同一内存单元 C.实参和形参的类型、个数必须一致

D.只有发生函数调用时,系统才为形参分别存储空间

以下叙述中正确的是(A)。

A.在C语言中静态变量在未赋值时,其值为0 B.在C语言中任何变量在未赋值时,其值为0 C.外部变量在程序的任何函数中均有效

D.函数中任何一个局部变量均无法保留上一次调用时的运行结果

以下正确的描述是(B)。

A.函数的定义可以嵌套,但函数的调用不可以嵌套 B.函数的定义不可以嵌套,但函数的调用可以嵌套 C.函数的定义和函数的调用均不可以嵌套 D.函数的定义和函数的调用均可以嵌套

下面的程序将浮点数写到文件test中,然后读出并显示。

#include main(){FILE *fp;float f=12.34;if((fp=_fopen(“test”,“wb”))==NULL){printf(“Cannotopen file.”);exit(l);} fwrite(&f,sizeof(float),1,fp);rewind(fp);fread(&f,sizeof(float),1,fp);printf(“%fn”,f);fclose(fp);}

下面的函数sum 完成计算1~n的累加和。

sum(int n)

{ if(n<=0)

printf(“data errorn”);

if(n==1)return 1;

else _return(sum(n-1)+n);__________ } 统计学生成绩中不及格的学生名单。#include struct student { long num;char name[20];float score;}stu[6]={{9910110,”wangling”,85},{9910111,”liming”,90.5},{9910112,”fengyong”,90.5},{9910113,”fangjun”,56},{9910114,”sunping”,77.5},{9910115,”kongxiao”,50.5}};main(){ struct student s;int i,count=0;printf(“不及格名单:n”);for(i=0;i<6;i++)if(__stu[i].score______<60){ count++;printf(“%ld:%-12s %.1fn”, stu[i].num, stu[i].name, stu[i].score);} printf(“不及格人数:%dn”,count);} 下面程序是实现1+1/2+1/4+1/6+…+1/50的值,请填空:

main(){ int i=2;float sum=1;while(i<=50){ sum=sum+1/(float)i;i++;i++_;} printf(“sum=%fn”,sum)}

下面程序输入一个字符串,输出其中所出现过的大写英文字母.如输入字符串

“UKSDYckjsjsjJSJJD”;应输出“UKSDYJ”。按程序功能填空。#include main(){ char a[80], b[26];int i,j,k=0;gets(a);for(i=0;a[i]!='';i++)if(a[i]>='A'&&a[i]<='Z'){ for(j=0;j

打开C:CAADATA35中源程序文件pg3101.cpp,该程序是输入一个数x,当x能被5整除时,输出“x能被5整除”的信息,否则输出“x不能被5整除”。检查程序哪里有问题,请修改使之运行能得到正确结果。该源程序内容如下: #include void main(void){ int x,k;printf(“请输入x的值:n”);scanf(“%d”,&x);k=x%5;if(k==0)

printf(“x能被5整除n”);else

printf(“x不能被5整除n”);}

打开C:CAADATA36中的源程序文件pg207.cpp,补充程序并以原文件名保存(不得删除原文件中的注释内容,否则该题不计分),使得程序运行时完成以下功能:编写程序找出3×3矩阵中的最大元素及其行列位置并输出,请在程序中将二维数组的9个元素初始化为以下值: 8 6 4 2 1 9 7 5 3

打开C:CAADATA37中的源程序文件pg301.cpp,按要求补充程序并以原文件名保存(不得删除原文件中的注释内容,否则该题不计分),要求为:编写判断一个数是否为素数的函数fun(),并在主函数调用该函数输出200以内的所有素数。

打开C:CAADATA38中源程序文件pg6101.cpp,该程序有小问题,程序结果不正确。请修改,使程序能正确运行。该源程序内容如下: #include void main(void){ int a[5];printf(“请输入5个整数:”);for(i=0;i<5;i++)

scanf(“%d”,&a[i]);printf(“这5个数为:”);for(i=0;i<5;i++)

printf(“%4d”,a[i]);printf(“n”);}

打开C:CAADATA39中源程序文件pg5104.cpp,该程序是打印1到5的阶乘,有个小问题,请修改,使程序能正确运行。该源程序内容如下: #include int fac(int n){ static int f=1;f=f*n;return f;} void main(){ int i;for(i=1;i<=5;i++)

printf(“%d!=%dn”,i,fac(i));}

打开C:CAADATA40中源程序文件pg2102.cpp,该程序是从键盘输入两个数,在屏幕上输出这两个数。程序中有几处错误,修改程序,使其能够正确运行。该源程序内容如下: #include void main(){ int x,y;printf(“Please enter x,y: ”);scanf(“%d%d”,&x,&y);printf(“x=%d,y=%dn”,x,y);printf(“n”);}

打开C:CAADATA41中的源程序文件pg105.cpp,补充程序使得程序运行时完成以下功能:输入x的值,按照函数:

x(x<1)y= 2x+7(1<=x<10)3x-5(x>=10)

输出y的值。并以原文件名保存(不得删除原文件中的注释内容,否则该题不计分)。

第四篇:期末复习-语言各章总结

汇编语言学习笔记 《汇编语言》--王爽 前言

学习汇编目的:充分获得底层编程体验;深刻理解机器运行程序的机理。原则:没有通过监测点不要向下学习;没有完成当前实验不要向下学习。第一章 基础知识

有三类指令组成汇编语言:汇编指令;伪指令;其他符号。8bit = 1byte = 一个存储单元有n根地址线,则可以寻址2的n次方个内存单元。1.1节--1.10节 小结

(1)汇编指令是机器指令的助记符,同机器指令一一对应。(2)每一种cpu都有自己的汇编指令集。(3)cpu可以直接使用的信息在存储器中存放。

(4)在存储器中指令和数据没有任何区别,都是二进制信息。(5)存储单元从零开始顺序编号。

(6)一个存储单元可以存储8个bit,即八位二进制数。

(7)每一个cpu芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个cpu可以引出的三种总线的宽度标志了这个cpu不同方面的性能。地址总线的宽度决定了cpu的寻址能力;数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量;控制总线的宽度决定了cpu对系统中其他器件的控制能力。监测点:1KB的存储器有1024个存储单元?存储单元的编号从0到1023.内存地址空间:

最终运行程序的是cpu,我们用汇编编程时,必须要从cpu的角度思考问题。对cpu来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。第二章 寄存器(cpu的工作原理)mov ax, 2 add ax, ax add ax, ax add ax, ax(1)cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;(2)段地址和偏移地址通过内部总线送人一个称为地址加法器的部件;(3)地址加法器将两个16位地址合成为一个20位的物理地址;(4)地址加法器通过内部总线将20位物理地址送人输入输出控制电路;(5)输入输出控制电路将20位物理地址送上地址总线;(6)20位物理地址被地址总线传送到存储器; 段地址*16+偏移地址 = 物理地址 的本质含义 内存并没有分段,段的划分来自cpu。

以后编程时可以根据需要,将若干地址连续的内存单元看做一个段,用段地址*16定位段的起始地址,用偏移地址定位段的内存单元。

一个段的起始地址一定是16的倍数,一个段的最大长度为64kB。当然也没有办法定义一个起始地址不是16的倍数的段。

cpu可以用不同的段地址和偏移地址形成同一物理地址。

在8086cpu加电启动或复位后cs和ip被设置为cs = f000h,ip = ffffh,即ffff0h单元中的指令是8086pc机开机后执行的第一条指令。(??应该是fffffh吧??)cpu将cs:ip指向的内存单元看做指令。

在cpu中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对cpu的控制。

mov指令称为传送指令,cpu中大部分寄存器的值都可以通过mov指令改变。除了cs:ip 8086没给他这样的功能。cs:ip可以用转移指令来改变。jmp jmp cs:ip 用指令给出的段地址修改cs,偏移地址修改ip jmp 某一寄存器 的功能为:用寄存器中的值修改ip jmp ax 含义类似于mov ip,ax 段地址在8086pc机的段寄存器存放。当8086cpu要访问内存时,由段寄存器提供内存单元的段地址。8086cpu有四个段寄存器,其中cs用来存放指令的段地址。cs存放指令的段地址,ip存放指令的偏移地址。

8086机中,任意时刻,cpu将cs:ip指向的内容当作指令执行。8086cpu的工作过程:

1.从cs:ip指向内存单元读取指令,读取的指令进入指令缓冲器; 2.ip指向下一条指令 3.执行

8086提供转移指令修改cs:ip的内容 debug的使用

查看,修改cpu中寄存器的内容:r命令 查看内存中的命令:d命令

修改内存中的内容:e命令(可以写入数据,指令,在内存中,它们实际上没有区别)将内存中的命令解释为机器指令和相应的汇编指令:u命令 执行cs:ip指向的内存单元处的命令:t命令 以汇编指令的形式向内存中写入指令:a命令 第三章 寄存器(内存访问)3.1内存中字的存储

高八位存放在高字节中,低八位存放在低字节中 3.2DS和【address】 3.3字传送 3.4MOV ADD SUB 3.5数据段 3.6栈

栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。

栈有两个基本的操作:入栈和出栈。

栈的这种操作规则被称为:lifo(last in first out,后进先出)。cpu如何知道10000H--1000fH这段空间被当作栈使用?

push pop指令在执行时必须知道哪个单元是栈顶单元,可是如何知道呢?

栈顶的段地址存放在ss中,偏移地址存放在sp中。任意时刻,ss:sp指向栈顶单元。push和pop指令执行时,cpu从ss和sp中得到栈顶的地址。入栈时,栈顶从高地址向低地址方向增长。如何定义一个栈的大小? mov ax, 1000h mov ss, ax mov sp, 0010h;则栈顶为1000f 栈底为 10000 ****************************************** mov ax, 1000h mov ds, ax mov ax, 2266h mov [0], ax ************************ mov ax,1000h mov ss, ax mov sp, 0002h mov ax, 2266h push ax 栈顶的变化范围最大为:0--ffffh 栈的综述

(1)8086cpu提供了栈操作机制,方案如下: 在ss、sp中存放栈顶的段地址和偏移地址;

提供入栈和出栈指令,他们根据ss、sp指示的地址,按照栈的方式访问内存单元。(2)push指令的执行步骤:1)sp=sp-2;2)向ss:sp指向的字单元送人数据;(3)pop指令的执行步骤:1)从ss:sp指向的字单元中读取数据;2)sp=sp+2(4)任意时刻,ss:sp指向栈顶元素。

(5)8086cpu只记录栈顶,栈空间的大小我们要自己管理。

(6)用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。(7)push、pop指令实质上是一种内存传送指令,注意他们的灵活运用。一个栈段最大可以设为64k 段的综述

我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们的安排。用一个段存放代码,即代码段 用一个段存放数据,即数据段 用一个段当栈,即栈段

对于数据段,把段地址放在ds中,用mov,add,sub等访问内存单元的指令时,cpu就将我们定义的数据段内容当做数据来访问;

对于代码段,把段地址放在cs:ip中,用mov,add,sub等访问内存单元的指令时,cpu就将执行我们定义的代码段的指令;

对于栈段,把段地址放在ss:sp中,用push pop 等访问内存单元的指令时,cpu就将其当作堆栈来访问;

debug的t命令在执行修改器ss的指令时,下一条指令也紧接着被执行了。3.7栈超界问题

8086cpu不保证我们对栈的操作不会超界。也就是说,8086cpu只知道栈顶在何处而不知道我们安排的栈空间有多大,这点就好像,cpu只知道当前要执行的指令在何处,而不知道要执行的指令有多少。从这两点我们可以看出cpu的工作机理,它只考虑当前情况:当前的栈在何处,当前要执行的指令是哪一条。对于超界问题我们可以做到就是小心。第五章【bx】和loop指令

我们完整的描述一个内存单元,需要两种信息:(1)内存单元的地址;(2)内存单元存放数据的类型; inc bx的含义是bx中的内容加一

[bx]寄存器bx中所包含的地址中存放的内容 [bx]表示一个内存单元,他的偏移地址在bx中。loop指令执行的时候,要进行两步操作: 1;(cx)=(cx)-1;

2;判断cx中的值,不为零则转至标号处执行。

“通常”我们用loop实现循环功能,cx中存放循环次数。用cx和loop指令相配合实现循环功能的三个要点:(1)再cx中存放循环次数;

(2)loop指令中的标号所标识地址要在前面;

(3)要循环执行的程序段,要写在标号和loop指令的中间。在汇编源程序中,数据不能以字母开头。所以对于大于9fffh的数,均在前面加上0。mov cx,11 s: add ax,ax loop s assume cs:code code segment..mov ax,4c00h int 21h code ends end ffff:6单元是一个字节单元,ax是一个十六位寄存器,数据长度不一样,如何赋值? 注意我们说的是“赋值”,就是说,让ax中的数据的值(数据的大小)和ffff:0006单元中的数据的值(数据的大小)相等。八位数据01h和16位数据0001h的数据长度不一样,但他们的值是相等的。

设ffff:0006单元中的的数据是xxh,若要ax中的值和ffff:0006单元中的值相等,ax中的数据应为00xxh。所以,若实现ffff:0006单元向ax赋值,我们应该令(ah)=0,(al)=(ffff6H).若希望程序能从cs:0012处执行,可以用g命令。“g 0012”。他表示程序执行到0012处。

若希望程序能跳出循环,用p命令

5.4 debug和汇编编译器masm对指令的不同处理。

在汇编源程序中,mov al,[0]会被编译器解释成为:mov al,0 所以要这样表达:mov bx,0 mov al,[bx] 或者 mov al,ds:[0] 第一,我们在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用[...]来表示内存单元,如果在[]里用一个常量idata直接给出内存单元的偏移地址,就要在[]的前面显示地给出段地址所在的段寄存器。

第二,如果在[]里用寄存器,比如bx,间接给出内存单元的偏移地址,则段寄存器默认在ds中。

第六章 包含多个段的程序 程序取得所需段的方法有两种:

一是在加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请。dw的含义是定义字型数据即define word 字型数据间以逗号隔开。

程序运行的时候cs存放代码段的段地址,所以我们可以从cs中得到它们的段地址。dw定义的数据处于代码段的最开始,所以偏移地址为零。dw 0123h,5604h,1234h start :指令 end start 我们在程序的第一条指令的前面加了一个标号start:并在end的后面再次加入。end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。在单任务系统中,可执行文件中的程序执行如下:

(1)由其他的程序(debug、command或其他程序)将可执行文件中的程序加载入内存;(2)设置cs:ip指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运行;(3)程序运行结束后,返回到加载者; 描述信息

可执行文件由描述信息和程序组成,程序来源于源程序中的汇编指令和定义的数据;描述信息则主要是编译连接程序对原程序中相关伪指令进行处理所得到的信息。6.2 在代码中使用栈

在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来使用。

例如将cs:16--cs:31的内存空间当作栈来用,初始状态下栈为空,所以ss:sp要指向栈底,则设置ss:sp指向cs:32.6.3将数据代码栈放入不同的段

用assume将定义的具有一定用途的段跟寄存器联系起来 第七章 更灵活的定位内存地址的方法 7.1 and 和 or 指令(1)and指令:逻辑与指令,按位进行与运算。mov al ,01100011B and al ,00111011B 执行后:al=00100011B 通过该运算可将操作对象的相应位设为0,其他位不变。(2)or指令:逻辑或指令,按位进行或运算。

通过该运算可将操作对象的相应位设为1,其他位不变。7.2 关于ASCII码

所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。小写字母的ASCII码值,比大写字母的ASCII码值大20H。

就ASCII码的二进制形式来看,除第五位外,大写字母和小写字母的ASCII码值都一样。大写字母第五位为0,小写字母第五位为1.运用and和or指令的给特定位赋值功能即可实现大小写字母之间的转换。7.5 [bx+idata] 类似于[bx]的一种更灵活的指明内存单元的方式。

[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata。也可以写成 mov ax,[200+bx] mov ax,200[bx] mov ax,[bx].200 7.6 用[bx+idata]的方式进行数组的处理 7.7 SI和DI SI和DI是8086cpu中和bx功能相近的寄存器。区别是SI和DI不能够分成两个八位寄存器来使用。codesg segment start: mov ax,datasg mov ds,ax mov si,0 mov di,16 mov cx,8;di si 为16位寄存器只需循环 s: mov ax,[si] mov [di],ax;八次即可将16个字节传送完毕 add si,2 add di,2 loop s

mov ax,4c00h int 21h codesg ends end start si = dijmp指令后的第一个字节的地址(2)short指明此处的位移为八位位移。(3)八位位移的范围为-128 127,用补码表示;(4)八位位移由编译程序在编译时算出。

还有一种jmp near ptr 标号 实现段内近转移(ip)=(ip)+16位位移(1)16位位移 = “标号”处的地址1(DI)=(DI)-1 MOVSW 可以传送一个字

MOVSB和MOVSW进行的是串传送操作中的一个步骤,一般都要和rep配合使用,格式如下: rep movsb 相当于: s:movsb loop s rep的作用是根据cx的值,重复执行后面的串传送指令。8086cpu提供了下面两条指令对DF位进行设置: CLD:将DF位置0 STD:将DF位置1 1.传送的原始地址 2.传送的目的地址 3.传送的长度 4.传送的方向 11.11 pushf和popf 压入/弹出标志寄存器中的数据 为访问标志寄存器提供了一种方法。11.12 标志寄存器在DEBUG中的表示 第十二章 内中断 12.1 内中断的产生

cpu内部发生下面情况时,将产生相应的中断信息:

(1)除法错误(2)单步执行(3)执行int0命令(4)执行int命令 中断类型码0 1 4 n 为一个字节型数据 12.2 中断处理程序

cpu如何通过八位的中断类型码得到中断处理程序的段地址和偏移地址? 12.3 中断向量表 答:通过中断向量表

中断向量表就是中断处理程序入口地址的列表。保存在内存中。cpu如何找到中断向量表?

对于8086中断向量表指定存在内存地址0处。从0000:0000到0000:03e8单元。共1000个字节。中断向量表中一个表项存放一个中断向量,占两个字。分别存放段地址和偏移地址。12.4 中断过程

(1)从中断信息中取得中断类型码(2)标志寄存器的值入栈

(3)设置标志寄存器的第八位TF和第九位IF的值为0(4)CS的内容入栈(5)IP的值入栈

(6)从内存地址为中断类型码*4和中断类型码*4 + 2 的两个字单元中读取中断处理程序的入口地址设置IP和CS 12.5 中断处理程序(1)保存用到的寄存器(2)处理中断。(3)恢复用到的寄存器(4)用IRET指令返回。12.6 除法错误中断的处理 12.7 编程处理0号中断 12.8 安装 第十三章 int指令 13.1 int指令

int指令的最终功能和call指令相似,都是调用一段程序。13.2 编写供应用程序调用的中断例程

编写、安装中断7ch的中断例程,功能:求一word型数据的平方。(AX)= 要计算的数据。

DX,AX存放结果的高十六位和低十六位。MOV WORD PTR ES:[7CH*4],200H MOV WORD PTR ES:[7CH*4+2],0 MOV CX,OFFSET SQREND-OFFSET SQR CLD REP MOVSB int指令和iret指令配合使用与call指令和ret指令配合使用具有相似的思路。13.3 对int、iret和栈的深入理解 ********************************* 13.4 BIOS和DOS所提供的中断例程 BIOS主要包含以下内容:

1、硬件系统的检测和初始化程序

2、外部中断和内部中断的中断例程

3、用于对硬件设备进行I/O操作的中断例程

4、其他和硬件系统相关的中断例程 13.5 BIOS和DOS中断例程的安装过程

1.开机后,cpu一加点,初始化(cs)= 0FFFFH,(IP)= 0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条跳转指令,cpu执行该程序后,转去执行BIOS中的硬件检测和初始化程序。

2.初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的内容,一直在内存中存在。

3.硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交给操作系统控制。

4.DOS启动后,除完成其他工作外,还将它提供的中断例程装入内存,并建立相应的中断向量。

13.6 BIOS中断例程应用

int 10h 中断例程是BIOS提供的中断例程,其中包含多个和屏幕输出有关的子程序。一个供程序员调用的中断例程往往包含多个子程序,中断例程内部用传递进来的参数来决定执行那一个子程序。BIOS和DOS提供的中断例程,都用AH来传递内部参数 13.7 DOS中断例程应用

例如 我们一直在使用的4ch号子程序,即程序返回功能。mov ah 4ch mov al 0 int 21h ========================== DOS功能调用 int 21h(1)键盘输入 1)1号调用——从键盘输入单个字符 调用格式: MOV AH,1 INT 21H 功能: 等待从键盘输入一个字符并送入AL。

执行时系统将扫描键盘,等待有健按下,一旦有健按下,就将其字符的ASCII码读

入,先检查是否Ctrl-Break,若是,退出命令执行;否则将ASCII码送AL,同时将

该字符送显示器显示。2)10号调用——从键盘输入字符串

功能: 从键盘接收字符串送入内存的输入缓冲区,同时送显示器显示。调用前要求: 先定义一个输入缓冲区

MAXLEN DB 100 ;第1个字节指出缓冲区能容纳的字符个数,即缓冲区长度,不能为0 ACLEN DB ? ;第2个字节保留,以存放实际输入的字符个数 STRING DB 100 DUP(?);第3个字节开始存放从键盘输入的字符串。

调用格式: LEA DX,MAXLEN(缓冲区首偏移地址)MOV AH,10 INT 21H(2)显示输出

1)2号调用——在显示器上显示输出单个字符 调用格式: MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H 功能:将DL中的字符送显示器显示。【例】显示输出大写字母A MOV DL,41H ;或写为 MOV DL,'A' MOV AH,2 INT 21H 2)9号调用——在显示器上显示输出字符串 调用格式: LEA DX,字符串首偏移地址 MOV AH,9 INT 21H 功能:将当前数据区中DS:DX所指向的以'$'结尾的字符串送显示器显示。【例】在显示器上显示字符串“YOU ARE SUCESSFUL!” DATA SEGMENT STRING DB ' YOU ARE SUCESSFUL!$ ' DATA ENDS CODE SEGMENT „ „ MOV AX,DATA MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H „ „ CODE ENDS 说明:若希望显示字符串后,光标可自动回车换行,可在定义字符串时作如下更改: STRING DB ' YOU ARE SUCESSFUL!',0AH,0DH,' $ ' ;在字符串结束前加回车换行的ASCII码0AH,0DH

第五篇:《C语言程序设计》期末复习指导(xiexiebang推荐)

《C语言程序设计》期末复习指导

一、考核说明

《C语言程序设计》课程是一门基础必修课程。本课程是学习数据结构、操作系统、计算机网络、数据库、软件工程等课程的先修课,在整个专业教学体系中占有非常重要的作用。

本课程主要介绍C语言的基本语法规则和程序设计方法,包括C语言程序结构和上机运行程序的基本过程,各种数据类型的常量和变量的定义与表示,各种运算符和表达式的表示与应用,各种流程控制语句的定义与作用,各种常用函数的定义格式与调用方法,用户函数的定义与调用,数组、指针、结构、文件等数据类型的定义与使用,结构化和模块化的程序设计方法等内容。

学习《C语言程序设计》需要理论与实践相结合,只注重书本知识是空洞的,只注重上机实践是迷茫的,必须两者结合循序渐进,通过书本知识指导实践,通过实践加深理解和吸收知识,以及运用知识解决问题的能力。

现将该课程考核的有关问题说明如下: 1.考核对象(本科)的学生。2.命题依据

本考核说明以《C语言程序设计》课程的教学大纲为依据编制。本考核说明是考试命题的依据。3.考核要求

本课程是以掌握C语言知识并解决实际程序设计问题为目的。主 要考核学生对C语言知识的掌握程度和对解决一般问题的程序设计能力。对C语言知识要在理解和应用的基础上加强记忆和掌握,不能死记硬背。

本课程教学内容包括了解、理解和应用三个层次,并且逐步递进,具体含义如下:

(1)了解层次:记忆C语言中的基本概念和语法规则;(2)理解层次:掌握C语言中的每个语法成分和语句的定义格式、含义及作用;

(3)应用层次:利用C语言,结合实际解决问题的需要,能够分析和编写程序。4.命题原则

(1)在教学大纲和考核说明所规定的知识范围内命题。在教学知识范围之内,需要灵活运用才能够解决问题的试题不属于超纲。(2)试题的取材要求覆盖面广、区分度高。

(3)试题兼顾各个能力层次,了解和理解约占40%,应用约占60%。(4)试题的难易程度和题量适当,按难易程度分为四个层次:容易占20%,较易占40%,较难占30%,难占10%。题量安排以平时能够独立完成作业者,能在规定的考试时间内做完并有一定时间检查为原则。

5.试题题型

选择:根据题意,从四种可选择的答案中选择合适的一种答案。

填空:根据题意,在画有横线或空白括号内填写合适内容。写出程序运行结果:根据所给的C语言程序,写出运行后的输出结果。

按程序功能填空:根据所给的C语言程序或函数,在空格处填上适当的语句使程序完善。

编写程序或函数:根据所给出的题目要求,编写出相应的程序或函数模块。

第二部分 考核内容及要求

第一 C语言概述

考核内容(知识点):

1.程序、程序文件和函数的概念及其相互之间的关系。2.函数的定义格式和作用,主函数的特殊地位和作用。3.C语言简单语句和复合语句的语法格式。4.#include预处理命令的格式与作用。

5.头文件的文件名格式、在程序中的使用方法和作用。6.程序中两种注释标记的写法和作用。

7.标准输出函数printf()和标准输入函数scanf()的定义格式和具体应用。

8.C语言程序文件名、编译后生成的目标文件名和连接后生成的可执行文件名的命名规则,以及上机输入、编辑、编译、连接和运行程序的过程。

考核要求:

要求了解和理解以上内容。

第二 数据类型和表达式

重点考核的内容(知识点): 1.C语言中的数据类型的分类。

2.各种整数类型的关键字表示,存储空间的大小和值域范围。3.整型变量的定义和初始化,十进制整型常量的表示。4.字符类型的关键字表示,存储空间的大小和值域范围;字符型常量的表示,回车、换行、单引号、双引号、反斜线、空字符等特殊字符的表示。

5.字符型变量的定义和初始化,字符型与整型的关系。6.枚举的概念,枚举类型的定义,枚举变量的定义和初始化,枚举常量与整型常量的对应关系。

7.各种实数类型的关键字表示,存储空间的大小和有效位数。8.单精度和双精度实数的定点表示和浮点(科学)表示,实型变量的定义和初始化。

9.加、减、乘、除、取余、赋值、增

1、减

1、取数据存储长度等算术运算符的表示、含义、运算对象个数和运算优先级。10.关系运算符的定义和关系表达式的计算,逻辑运算符的定义与逻辑表达式的计算,根据任意表达式的值判断其逻辑值的方法。

一般考核的内容(知识点):

1.整型常量的八进制和十六进制表示。2.符号常量的两种定义方法,它们之间的区别。3.位操作符、复合赋值操作符的含义与使用。4.求关系或逻辑表达式的相反表达式的方法。

考核要求:

理解和掌握以上重点考核的内容,了解和理解以上一般考核内容。

第三 流程控制语句

考核内容(知识点):

1.C语言程序中的顺序、分支和循环这三种基本结构,每种结构的执行过程。

2.简单if语句、带else子句的if语句、多分支结构的if语句的定义格式、执行过程和在处理问题中的具体应用。

3.switch语句的定义格式、执行过程和在处理问题中的具体应用。

4.if语句与switch语句之间的功能比较,if语句与switch语句之间的转换。

5.for循环、while循环和do-while循环的定义格式、执行过程和在处理问题中的具体应用。6.三种循环结构不同特点。

7.Break语句在switch语句和各种循环语句中的作用,continue语句在各种循环语句中的作用。

8.goto语句和return语句的定义格式和功能。考核要求:

理解和掌握本章的所有内容,并能够灵活应用。

第四 数组和字符串

考核内容(知识点):

1.一维数组的含义、定义格式及初始化格式。

2.数组长度、数组元素、元素下标的含义,访问数组元素的语法格式,下标运算符的操作对象和操作结果。

3.数组元素的下标变化范围,数组元素所占存储空间大小和整个数组所占存储空间大小的计算,各元素对应存储空间的排列情况,每个元素的存储地址的计算。

4.利用一维数组存储数据,按元素值的升序或降序排列数据,按给定条件或功能对数组元素依次进行访问和处理。5.二维数组的含义、定义格式及初始化格式。

6.二维数组的行数和列数的概念,数组长度(即所含元素个数)的计算。

7.访问二维数组元素的语法格式,每个下标运算符的操作对象和操作结果。

8.二维数组中的所有元素在存储空间中的排列情况,每个元素的存储地址的计算。

9.利用二维数组存储矩阵数据,按给定条件或功能对数组元素依次进行访问和处理。10.字符串常量的定义格式,字符串的存储格式,字符串长度的概念。

11.一维字符数组、二维字符数组与字符串之间的关系,一维字符数组与二维字符数组的初始化。

12.strlen、strcpy、strcmp、strcat等字符串函数的声明格式及功能。

13.利用typedef语句定义数据类型的方法。

考核要求:

了解和理解一维数组、二维数组和字符串的概念的使用方法,会利用它们存储和处理数据。

第五 指针

考核内容(知识点):

1.指针的概念,指针变量的定义和初始化。

2.指针赋值(=)、取对象(变量)地址(&)、访问指针所指对象(*)、指针比较(==、!=、>、<等)、指针算术运算(+、-、+=等)、指针增1或减1(++、--)等各种运算的含义和使用。3.数组名的指针含义。

4.一维数组元素的下标访问方式与指针访问方式及其之间的转换。

5.二维数组元素的下标访问方式与指针访问方式及其之间的转换。6.动态存储分配函数malloc()和calloc()以及动态存储空间释放函数free()的定义格式与调用方法。

考核要求:

理解指针的概念,掌握利用指针访问简单数据和数组元素的方法,掌握进行动态存储分配与释放的方法。

第六 函数

考核内容(知识点): 1.函数的定义格式。

2.函数调用表达式的语法格式及执行过程。

3.函数定义中形参变量的作用及实虚参数结合的过程。5.函数声明(原型)语句的定义格式及作用。

6.形参为一维数组或二维数组时的说明格式,调用时数组参数传递的过程。

7.变量的作用域的概念和含义;系统对全局变量、static变量、局部变量的建立和初始化过程。

8.函数的递归调用的概念和递归函数的具体执行过程。9.头文件在程序文件中的位置和作用。

考核要求:

掌握用户自定义函数的定义、声明与调用方法,掌握函数调用中一般参数、指针参数、数组参数的传递,以及函数体执行和返回的过程。

第七 结构与联合考核内容(知识点):

1.结构的概念,结构类型的定义格式,结构类型的声明(即不完整定义)格式。

2.结构对象(变量)的各种定义格式和初始化,结构大小的计算,结构对象和结构数组对象的动态分配和初始化。

3.结构赋值,结构成员的直接访问和间接访问,利用结构数组保存和处理数据。

4.结构和结构指针作为函数参数和返回值类型的具体应用。5.链表的概念,链表中结点的结构,链表的建立和遍历的方法和算法。

6.联合的概念,联合类型的定义格式,联合对象的定义和初始化,联合的存储结构及大小的计算,匿名联合的特点。

考核要求:

理解和掌握结构和联合类型的特点以及数据成员的访问方法,了解和理解链表中结点的结构和建立与访问链表的方法,以及结构与联合嵌套定义的概念。

第八

文件

考核内容(知识点):

1.数据文件的概念。

2.文件的打开和关闭方法。

3.文件的各种访问方式的表示。

4.对字符文件进行的输入和输出数据的方法。

5.对字节文件进行的输入和输出数据的方法。考核要求:

了解和理解文件的有关概念和访问方式,会利用字符或字节文件保存和处理数据。

下载c语言期末复习word格式文档
下载c语言期末复习.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    期末复习

    八年级上期末复习 基础句子 你何不把正确的拼写和语法写在错的地方? And _____________________ write down the correct spelling and grammar next to the mistakes? 还有......

    期末复习

    期末复习 一神奇多义字,快乐ABC. 花:A 供观赏的植物B 颜色C用掉 1 完成这项工作得花整整一年的时间。 2 头发花白的老爷爷坐在墙根下抽着烟斗。 3 爱护花草树木是我们每个......

    期末复习

    期末复习 第1课中国人民站起来了 1、第一届中国人民政治协商会议举行的时间、地点、会议通过了《》。 内容:(1)选举中华人民共和国中央人民政府委员会,选举为中央人民政府主席; (2......

    如何期末复习

    如何进行小学语文期末总复习时光飞逝,一个学期即将结束,总复习又成为我们老师的工作重点。 作为老师,我们把期末阶段的总复习都看的很重,每天又是考卷,又是评价,又是后进生的辅导......

    八年级上语文期末系统复习语言运用

    八年级上语文期末系统复习资料 语言运用篇 1.给下列横线上填人恰当的成语。 圆明园是一座了不起的 的博物馆,那儿不仅仅有艺术珍品,还有大堆的金银制品。 孙小龙模仿......

    小学语言近义词反义词期末总复习(合集五篇)

    饥饿(饥渴) 惧怕(害怕) 鼓励(鼓舞) 智慧(才智) 急切(着急) 知趣(懂事)随便(随意) 采访(访问) 兴趣(兴致) 赶紧(赶忙) 建议(意见) 选择(选取)环绕(包围) 周游(环游)继续(持续) 似乎(仿佛) 程度(层面) 亲切(亲热)......

    文言文期末复习

    《小石潭记》 (一)阅读下列语段,完成相关练习从小丘西行百二十步,隔篁竹,闻水声,如鸣佩环,心乐之。伐竹取道,下见小潭,水尤清冽。金石以为底,近岸,卷石底以出,为 ,为 ,为 ,为 。青树翠蔓,......

    期末复习总动员

    大家好!今天我讲话的题目是“期末考试复习总动员”。 时间过得真快,今天,时间老人已把我们带入了期末考试的冲刺阶段。同学们,你准备好了吗?老师教的你懂了吗?你会了吗?考验我们的......