C语言概述综合测试
1请根据自己的认识,写出C语言的主要特点
1)语言简洁、紧凑、灵活
2)运算符和数据类型丰富
3)程序设计结构化、模块化
4)生成目标代码质量高
5)可移植性好
2 语言主要用途是什么?它和其他高级语言有什么异同?C语言与Pascal语言比较
C语言 Pascal语言 含义
{ } BEGIN….END 复合语句
if(e) s; IF(e) THEN s 条件语句
int i ; VAR i:INTEGER 定义i为整型变量
int a[10]; VAR a:ARRAY[.10] OF INTEGER 定义整型数组a
int f(); FUNCTION f():INTEGER 定义f为返值整型的函数
int *p; VAR p:INTEGER 定义p为指向整型变量的指针
i+= 2; i=i+2 赋值i+2Þii++,++i; i=i+1 i自增值
结论:C比 Pascal简练,源程序短。
略
4 C语言以函数为程序的基本单位,有什么好处?
略
5请参照本章例题,编写一个C程序,输出以下信息:
***********
Very godd!
***********
解:
main( )
{ printf(“***********\n”);
printf(“\n”);
printf(“Very good!\n”);
printf(“\n”);
printf(“***********\n”);
}
6 编写一个程序,输入a,b,c三个值,输出其中最大者
解:
main()
{
int a,b,c,max;
printf(“请输入三个数a,b,c:\n”);
scan(“%d,%d,%d”,&a,*b,&c);
max=a;
if(max<b) max=b;
if(max<c) max=c;
printf(“最大数为:%d:”,max);
}
7上机运行本章三个例题,熟悉所用系统的上机方法与步骤
略
8 上机运行本章习题5和6
解:略
位运算综合测试
1编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位为0).
函数调用形式为:
getbits(value,n1,n2)
value为该16位(两个字节)单元中的数据值,n1为欲取出的起始位,n2为欲取出的结束位
如: getbits(0101675,5,8)
表示对八进制101675这个数,取出它从左起的第5位到第8位.
解:
main()
{ unsigned int a;
int n1,n2;
printf(“input an octal number:”);
scanf(“%o”,&a);
printf(“input n1,n2:”);
scanf(“%d,%d”,&n1,&n2);
printf(“result: %o\n”,getbits(a,n1-1,n2));
}
getbits(unsigned value,int n1,int n2)
{ unsigned int z;
z=~0;
z=(z>>n1)&(z<<(16-n2));
z=value&z;
z=z>>(16-n2);
return(z);
}
2 写一个函数,对于一个16位的二进制数取出它的奇数位(即从左边起第1,3,5…..15位).
解:
main()
{ unsigned getbits(unsigned);
unsigned int a;
printf(“\nInput an octal number:”);
scanf(“%o”,&a);
printf(“result:%o\n”,getbits(a));
}
unsigned getbits(unsigned value)
{ int i,j,m,n;
unsigned int z,a,q;
z=0;
for(i=1;i<=15;i++)
{ q=1;
for(j=1;j<=(16-i-1)/2;j++)
q=q*2;
a=value>>(16-2);
a=a<<15;
a=a>>15;
z=z+a*q;
}
return(z);
}
3 编一程序,检查一下你所用的计算机系统的C编译在执行右移时是按照逻辑位移的
原则,还是按照算术右移的原则.如果是逻辑右移,请编译一函数实现算术右移;如
果是算术右移,编译一函数实现逻辑右移.
解:
main()
{ int a,n,m;
a=~0;
if((a>>5)!=a)
{ printf("\nTurbo C,logical move!\n");
m=0;
}
else
{ printf("\nTurbo C,arithmetic move!\n");
m=1;
}
printf("how many digit move towards the right:");
scanf("%d",&n);
if(m==0)
printf("arithmetic right move,result:%o\n",getbits1(a,n));
else
printf("logical right move,result:%o\n",getbits2(a,n));
}
getbits1(unsigned value,int n)
{ unsigned z;
z=~0;
Z=Z>>n;
z=z|(value>>n);
return(z);
}
getbits2(unsigned value,int n)
{ unsigned z;
z=(~(1>>n))&(value>>n);
return(z);
}
4 编译一函数来实现左右循环移位.函数名为move,调用方法为:
move(value,n)
其中value为要循环位移的数,n为位移的位数.如n<0为左移;n>0为右移.如n=4,表示
右移4位,n=-3表示左移3位
解:
main()
{ unsigned moveright(unsigned,int);
unsigned moveleft(unsigned,int);
unsigned a;
int n;
printf("\ninput an octal number:");
scanf("%d",&a);
printf("input n:");
scanf("%d",&n);
if(n>0)
{ moveright(a,n);
printf("result:%o\n",moveright(a,n));
}
else
{ n=-n;
moveleft(a,n);
printf("result:%o\n",moveleft(a,n));
}
}
unsigned moveright(unsigned value,int n)
{ unsigned z;
z=(value>>n)|(value<<(16-n));
return(z);
}
unsigned moveleft(unsigned value,int n)
{ unsigned z;
z=(value>>(16-n))|(value<<n);
return(z);
}
5 设计一个函数,使给出一个数的原码,能得到该数的补码.
解:
main()
{ unsigned int a;
unsigned int getbits(unsigned);
printf("\ninput an octal number:");
scanf("%d",&a);
printf("result:%o\n",getbits(a));
}
unsigned int getbits(unsigned value)
{ unsigned int z;
z=value&0100000;
if(z==0100000)
z=~value+1;
else
z=value;
return(z);
}
函 数综合测试
1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用两个函数,并输出结果,两个整数由键盘输入。
解:
int hcf(intu,intv)
{ int t,r;
if (v>u)
{t=u;u=v;v=t;}
while((r=u%v)!=0)
{ u=v;v=r;}
return(v);
}
int lcd(int u,int v,int h)
{ return(u*v/h); }
main()
{ int u,v,h,l;
scanf(“%d,%d”,&u,&v);
h=hcf(u,v);
printf(“H.C.F=%d\n”,h);
l=lcd(u,v,h);
printf(“L.C.D=%d\n”,l);
}
2求方程ax2 +bx+c=0的根,用3个函数分别求当b2 -4ac大于0、等于0和小于0是的根,并输出结果。从主函数输入a、b、c的值。
解:
#include <math.h>
float x1,x2,disc,p,q;
greater_than_zero(float a,float b)
/*定义一个函数,用来求disc>0时方程的根*/
{ x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
}
equal_to_zero(float a,float b) /*定义一个函数,用来求disc=0时方程的根*/
{
x1=x2=(-b_/(2*a);
}
smaller_than_zero(float a, float b) /*定义一个函数,用来求disc<0时方程的根*/
{
p=-b/(2*a);
q=sqrt(disc)/(2*a);
}
main()
{
float a, b,c;
printf(“\nInput a,b,c:”);
scanf(“%f,%f,%f”,&a,&b,&c);
printf(“\nequation:%5.2f*x*x+%5.2f*x+%5.2f=0\n”,a,b,a);
disc=b*b-4*a*c;
printf(“root:\n);
if(disc>0)
{
greater_than_zero(z,b);
printf(“x1=%5.2f\tx2=%5.2f\n\n”,x1,x2);
}
else
{
smaller_than_zero(a,b);
printf(“x1=%5.2f+5.2fi\tx2=%5.2f-%%5.2fi\n”,p,q,p,q);
}
}
3 写一个判断素数的函数在主函数输入一个整数,输出是否是素数的信息。
解:
main()
{
int prime( int);
int m;
printf(“\nInput an integer:”);
if (prime(n))
printf(“\n%d is a prime.:,n);
else
printf(“\n%d is not a prime.”,m);
}
int prime(int n)
{ int flag=1,i;
for (i=2;I<n/2&&flag+ +1;i++)
if(n%i= =0)
flag=0;
return(flag);
}
4写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。
解:
#include N 3
int arrary[N][N];
convert(int arrary[3][3]) /*定义转置数组的函数*/
{
int i,j,t;
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
{ t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
main()
{
int i,j;
printf(“Input array:\n”);
for(i=0,i<N;i++)
scanf(“%d”,&array[i][j]);
printf(“\noriginal array:\n “);
for(i=0;i<N;i++)
{ for(j=0;j<N;i++)
printf(“%5d”,array[i][j]);
printf(“\n”);
}
convert (array);
printf(“convert array:\n”);
for (i=0;i<N;i++)
printf(“%sd”,array[i][j];
printf(“\n”);
}
}
5写一个函数,使疏通的一个字符串按反序存放,在主函数中输入和输出字符串。
解:
main()
{
int inverse (char str[]); /*函数原型声明*/
char str[100];
printf(“Input string:”);
scanf(“%s,str);
inverse(str);
printf(“Iverser string:%s\n”,str);
}
int inverse(char str[]) /* 函数定义*/
{
char t;
int i,j;
for(i=0,j=strlen(str);i<strlen(str)/2;i++,j--)
{
t=str[i];
str[i]=str[j-1];
str[j-1]=t;
}
}
6写一函数,将两个字符串连接。
解:
char concatenate(char string1[],char string2[],char string[])
{
int i,j;
for(i=0;string1[i]!=’\0’;i++)
string[i]= string1[i];
for(j=0; string2[j]!=’\0’;j++)
string[i+j]= string2[j];
string[i+j]=’\0’;
}
main()
{
char s1[100],s2[100],s[100];
printf(“\nInput string1:”);
scanf(“%s”,s1);
printf(“Input string2:”);
scanf(“%s”,s2);
concatenate(s1,s2,s);
printf(“The new string is %s\n”,s);
}
7写一函数将一个字符串中的元音字母复制到另一字符串,然后输出。
解:
mian()
{ void cpy(char s[],char c[]);
char sty[80],c[80];
printf(“\nInput sreing:”);
gets(sty);
cpy(sty,c);
printf(“\nThe vowel letters are :%s”,c);
}
void cpy(char s[],char c[])
{ inr i,j;
for (i=0,j=0;s[i]!=’\0’;i++)
if( s[i]= =’a’||s[i]= =’A’||s[i]= =’E’||s[i]= =’i’||s[i]= =’I’||s[i]= =’o’||s[i]= =’O’||s[i]= =’u’||s[i]= =’U’)
{
c[j]=s[i];
j++;
}
c[j]=’\0’;
}