C语言程序设计题库附答案

  • 简答题

1、程序设计(Programming)是根据要解决的问题,使用某种程序设计语言,设计出能够完成这一任务的计算机指令序列。程序设计是指设计、编制、调试程序的方法和过程。

 程序=算法+数据结构+程序设计方法+语言工具和环境

2、程序设计语言,通常简称为编程语言,是一组用来定义计算机程序的语法规则。它是一种被标准化的交流技巧,用来向计算机发出指令。

   语言处理程序把源程序翻译成语义等价的计算机能够识别的低级语言,它是在高级语言(或汇编语言)与计算机之间起到翻译作用的程序。经过语言处理程序处理后得的程序称目标程序。

3、程序设计的基本原则:正确性、有效性、鲁棒性、可理解性、可维护性、可移植性。

4、算法(Algorithm)是为解决某一具体问题而采取的确定的、有限的方法和步骤。

5、算法的基本特征:

有穷性(有限性)、确定性(唯一性)、可行性(能行性)、有0到多个输入、一个算法执行结束之后必须有数据处理结果输出。

6、自然语言描述法:用人们日常使用的语言来描述算法,称为算法的自然语言描述,特点是:存在很大缺陷,如果算法中含有多分支或循环操作,则很难表述清楚。此外,使用自然语言描述算法还很容易造成歧义;

程序流程图描述法:程序流程图(Program Flow Chart)是软件开发者最熟悉的一种算法表达工具,它独立于任何程序设计语言。它的优点是直观、清晰、易于掌握,便于转化成任何计算机程序设计语言。因此,它是软件开发者常用的算法表示方式;缺点:程序流程图的符号在使用过程中不容易规范,特别是在标准中没有严格规定流程线的用法,流程线能够指示流程控制方向的随意转移,很容易造成算法中操作步骤的执行次序混乱,而且不便于开发人员交流。

N-S图描述法:N-S图是1973年由美国学者I.Nassi和B.Shneiderman提出的一种新的流程图形式,N和S是两学位者姓氏的首字母。在这种流程图中,摒弃了带箭头的流程线。算法的具体内容都写在一个矩形柜内,框内又可以包含其他的从属框。

7、略

8、结构化程序设计是一种面向过程的设计思想,把程序定义为"数据结构+算法",它包括三种基本结构:顺序结构、选择结构和循环结构。

9、(1)使用程序设计语言中的顺序、选择、循环等有限的控制结构表示程序的控制逻辑; 

(2)选用的控制结构只允许有一个入口和一个出口; 

(3)程序语句组成容易识别的语句序列块,每块只允许有一个入口和一个出口; 

(4)复杂结构的程序设计时,仅用嵌套的基本控制结构进行组合嵌套来实现; 

(5)严格控制无条件转移(goto)语句的使用。

一、选择题

1-8、CABDDCCC

二、填空题

1、main   {}

2、/*    */

3、头文件

4、数据类型

5、函数首部   函数体

三、简答与程序设计

1、略

2、略

3、#include "stdio.h"

   void main()

   {

    printf("********************************\n");

    printf("      C语言的学习要努力!\n");

    printf("********************************\n");

   }

4、#include "stdio.h"

   void main()

   {

    int a,b;

    printf("输入两个数值分别给 a,b:");

    scanf("%d%d",&a,&b);

    printf("%d-%d=%d\n",a,b,a-b);

   }

一、选择题

1~5:CBBCB  

6~10:CDCCD

11-12:DB

二、填空题

1、16

2、b=i+1   c

3、i<=9  j%3!=0

4、1 3 2

5、j<=i   f=f*j

三、程序设计题

1、void main()

{ int a,b;

   scanf("%d",&a);

if(a/10000==a%10&&(a/1000%10)== (a%100)/10)

   printf("%d",a);

}

2、void main()

{ int i=1,s=0,flag=1;

  for(i=1;i<=100;i++)

   { s=s+i*flag;

      flag=flag*(-1);

   }

   printf("%d",s);

}

3、void main()

{ int n,i,s=1;

  scanf ("%d", &n);

   for(i=1;i<=n;i++)

  { s=s*i;

  }

  printf (" n!=%d", s);

}

4、#include

#include

int fun(float a,float b,float c)

{

if(b*b+c*c==a*a||a*a+c*c==

    b*b||b*b+a*a==c*c)

  return 1;

}

void  main( )

 { float a,b,c;

   printf("Please input three numbers:\n"); scanf("%f%f%f",&a,&b,&c);

   if( fun(a,b,c) == 1)

     printf("Yes\n");

   else

     printf("No\n");

   getch( );  }

5、void main()

 {  int a,i,j,n,s=0,w=0;

    scanf("%d,%d",&a,&n);

    for(i=1;i<=n;i++)

     {  w=0;

      for(j=1;j<=i;j++)

      { w=w*10+a;}  

      s=s+w;

      }

 printf("%d\n",s);

}

6、void main()

{int a,b,c;

 for(a=1; ;a++)

 { b=(int)sqrt(a+100);

    c=(int)sqrt(a+268);

if(b*b==a+100&& c*c==a+268)

    {printf("%d\n",a); break;}

  }

}

7、void main()

{int x,y,z; /*x表示鸡翁,y表示鸡雏*/

   for(y=1;y<=300;y++)

     { if(y%3!=0) continue;

        for(x=1;x<=20;x++)

         {if(100-x-y<0) continue;

          if(x*5+(100-x-y)*3+y/3==100)

          printf("%d,%d,%d\n",x,100-x-y,y);

         }

     }

}

8、void main()

{  int i,s=0,w=0,n;

   scanf("%d",&n);

    for(i=1;i<=n;i++)

    { w=0;

       for(j=1;j<=i;j++)

         {w=w+j;}

     s=s+w;

    }

   printf("%d\n",s);

}

一、选择题

1-5、CCBDC  6-10、BCAAD  11-15、AABCC  16-20、ADDDD

二、填空题

1、i==j  a[i][j]

2、j

3、k=i  j=i max=a[k]  a[k]=a[j]  a[j]=max

4、b[i][j+1]=a[i][j]   i=0  i<2   printf("\n")

5、a[N][N]   (i+1)*N-j

6、58

7、1  2  3

   0  5  6

   0  0  9

8、5 7 4 8 9 1

   1 5 7 4 8 9

   9 1 5 7 4 8

   8 9 1 5 7 4

   4 8 9 1 5 7

   7 4 8 9 1 5

9、1 0 0 1 0

10、21

三、程序设计

1、#include "stdio.h"

   void main()

   { int i,ave,sum=0,a[10];

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

{

scanf("%d",&a[i]);

sum=sum+a[i];

ave=sum/10;

}

printf("ave=%d\n",ave);

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

{

if(a[i]

printf("%4d",a[i]);

}

     }

2、#include "stdio.h"

   void main()

   {

   int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18};

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

    { p=i;q=a[i];

      for(j=i+1;j<10;j++)

        if(q

           if(p!=i)

           {

            s=a[i];a[i]=a[p];a[p]=s;

           }

     printf("%d ",a[i]);

   }

   printf("\ninput number:\n");

   scanf("%d",&n);

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

     if(n>a[i])

     {for(s=9;s>=i;s--) a[s+1]=a[s];

      break;}

    a[i]=n;

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

      printf("%d ",a[i]);

   printf("\n");

}

3、#include "stdio.h"

   void main()

   {

int i,n,a[5]={0};

printf("输入0到4之间的数,以-1结束!\n");

scanf("%d",&n);

while(n!=-1)

{

switch(n)

{

case 0:a[0]++;break;

case 1:a[1]++;break;

case 2:a[2]++;break;

case 3:a[3]++;break;

case 4:a[4]++;break;

default:break;

}

scanf("%d",&n);

}

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

{   printf("%d:%d",i,a[i]);

printf("\n");

}

   }

4、#include "stdio.h"

   #define SIZE 30

   void main()

   {

float b[SIZE/5],sum=0;

int a[SIZE],i,j,k;

for(k=2,i=0;i

{ a[i]=k;  k+=2; }

for(k=0,i=0;i

{ sum+=a[i];

  j=i+1;

  if((i+1)%5==0)

  { b[k]=sum/5;

   sum=0;

   k++;}

}

printf("The result is:\n");

for(i=0;i

printf("%5.2f ",b[i]);

printf("\n");

   }

5、#include "stdio.h"

   #define N 10

   void main()

   {

int i,j,a[N][N]={0};

for(i=0;i

   for(j=0;j

   {

   if((i==j)||(j==0))

   a[i][j]=1;

   }

 for(i=2;i

   for(j=1;j

   {

      a[i][j]=a[i-1][j-1]+a[i-1][j];   

   }

 for(i=0;i

  { for(j=0;j<=i;j++)

    printf("%d ",a[i][j]);

    printf("\n");

   

}

    }

6、#include "stdio.h"

   void main()

   {

int day[2][13]={{0,31,28,31,30,31,30,31,30,31,30,31,30},{0,31,29,31,30,31,30,31,30,31,30,31,30}};

int year,month,leap=0;

printf("请输入年份:");

scanf("%d",&year);

printf("请输入月份:");

scanf("%d",&month);

if(year%400==0||year%4==0&&year%100!=0)

leap=1;

printf("%d年%d月有%d天!\n",year,month,day[leap][month]);

}

7、#include "stdio.h"

  void main()

   { int i,j,a[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};

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

{  for(j=0;j<5;j++)

  {

   if(i>=j)

   printf("%d ",a[i][j]);

  }

  printf("\n");

}

}

一、选择题

1~5:DBDAD

6~10:BCDCD

11~15:ADACA

16~20:DACBC

二、填空题

1、4  2

2、3  5

3、9911

4、7777654321

5、16

6、*pmax=*px

7、10

8、efgh

9、s-1  *s++

10、p+n

三、程序设计题

1、#include "stdio.h"

void main()

{

    float f,*fpointer;

    fpointer=&f;

    scanf("%f",fpointer);

    printf("%f",*fpointer);

}

2、#include

void output(char *s)

{

int i;

for(i=0;i<=strlen(s);i=i+2)

printf("%c",*(s+i));

}

void main( )

{char *s;

 gets(s);

 output(s);

}

3、void Input(int a[], int n)

{int i;

  for(i=0;i

  scanf(“%d”,&a[i]);

}

void Process(int a[], int n)

{int i,k,w,t,max,min;

  max=min=a[0];

  for(i=1;i

   {if(max

     if(min>a[i]) {min=a[i];w=i;}

   }

 t=a[k];a[k]=a[w];a[w]=t;

}

void Output(int a[], int n)

{int i;

  for(i=0;i

  scanf(“%d”,&a[i]);

}

void main( )

{int num[10],n=10;

 Input(num, n);

Process (num, n);

Output(num, n);

}

4、#include

void main()

{

 char *str;

 int k;

 printf("请输入字符串:");

 scanf("%s",str);

 k=strlen(str);

/*for(i=0;i

{

 ch=str[i];

str[i]=str[k-i-1];

str[k-i-1]=ch;

}*/

printf("字符串逆序输出:");

while(k--)

{

printf("%c",*(str+k));

}

}

5、void main()

{char str[100];

  int i,a[20],j=0;

  scanf(“%s”,str)

    for(i=0;str[i]!=‘\0’;i++)

  { a[j]=0;

     while(str[i]>=‘0’&&str[i]<=‘9’)

     {a[j]=a[j]*10+str[i]- ‘0’; i++;}

     j++;

  }

}

6、#include

#include

int main()

{

 char *str;

 int count[5]={0,0,0,0,0};//创建计数器数组并初始化

 char *p=str;//指针p指向字符串数组str

 int i,n;

  gets(str);

 n=strlen(str);//确定输入字符串的长度

 for(i=0;i

 {

  if(*(p+i)>='A'&&*(p+i)<='Z')

  {

   count[0]++;//统计大写字母数目

  }

  else if(*(p+i)>='a'&&*(p+i)<='z')

  {

   count[1]++;//统计小写字母数目

  }

  else if(*(p+i)>='0'&&*(p+i)<='9')

  {

   count[2]++;//统计数字数目

  }

  else if(*(p+i)==32)

  {

   count[3]++;//统计空格数目

  }

  else

  {

   count[4]++;//统计其他字符数目

  }

 }

 printf("大写字母   小写字母  数字   空格    其他字符:\n");

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

 {

  printf("%d\t     ",count[i]);//打印各统计数目

 }

}

7、#include

main()

{

int n;

int array[100];

int a=0,b,c;

int i,j;

scanf("%d",&n);

for(i=1;i<=n;i++)

array[i]=i;

c=n;

b=0;

do

{

for (i=1,j=0;i<=n;i++)

{

if(array[i]%3==0&&array[i]!=0)

{array[i]=0;j++;}

else if(array[i]==0);

else

array[i]=array[i]+c-j;

}  

b=c/3;

c=c-j;

a=a+c;

}while(b);

for (i=1,j=0;i<=n;i++)

{

if(array[i]%3==0&&array[i]!=0)

{array[i]=0;j++;}

else if(array[i]==0);

else

array[i]=array[i]+c-j;

}  

for(i=1;i<=n;i++)

{

if(array[i]!=0) printf("it's %d!\n",i);

}

}

8、#include

adjustAry5(int source[5][5] ){

    int N=5,LOOP=4;

    int *pMax,*pAry[4];

    int i,j,k,z,ibreak,zbreak,tmp;

    pMax=pAry[0]=&source[0][0];

    for(i=0;i

        for(j=0;j

            if(source[i][j] > *pMax){

                pMax=&source[i][j];

            }else if (source[i][j] < *pAry[0]){

                pAry[0]=&source[i][j];

            }

        }

    }

    if(pMax==&source[0][0]){

        pMax=pAry[0];

    }

    tmp=source[0][0];source[0][0]=*pAry[0];*pAry[0]=tmp;pAry[0]=&source[0][0];

    tmp=source[2][2];source[2][2]=*pMax;*pMax=tmp;pMax=&source[2][2];

    for(k=1;k

        pAry[k]=pMax;

        ibreak=0;

        for(i=0;i

            for(j=0;j

                if((source[i][j]<*pAry[k]) && (source[i][j] >= *pAry[k-1])){

                    zbreak=0;

                    for(z=k-1;z>-1;z--){

                        if((pAry[z]== (&source[i][j]) )){

                            zbreak=1;

                            break;

                        }

                    }

                    if(zbreak==1) continue;

                    

                    pAry[k]=&source[i][j];

                    if(*pAry[k]==*pAry[k-1] ){

                        ibreak=1;

                        break;

                    }

                }

            }

            if(ibreak==1) break;

        }

        switch(k){

            case 1:

                 tmp=source[0][4];source[0][4]=*pAry[k];*pAry[k]=tmp;pAry[k]=&source[0][4];

                 break;

            case 2:

                tmp=source[4][0];source[4][0]=*pAry[k];*pAry[k]=tmp;pAry[k]=&source[4][0];

                 break;

            case 3:

                tmp=source[4][4];source[4][4]=*pAry[k];*pAry[k]=tmp;pAry[k]=&source[4][4];

                 break;

        }

    }

}

void print_array5(int source[5][5]){

   int i,j;

   for( i=0;i<5;i++){

    for(j=0;j<5;j++){

            printf("%2d\t",source[i][j]);

        }

        printf("\n");

    }

    printf("\n");

}

void main()

{

    int i,j;

    int b[5][5]={{35,34,33,32,31},{30,29,28,27,26},{25,24,23,22,21},{20,19,18,17,16},{15,14,13,12,11} }    ;

    printf("Please input data? (Array[5][5])\n");

    print_array5(b);    

    adjustAry5(b);    

    print_array5(b);

}

9、void main(){

int n;

char *name[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};

for(n=1;n<=12;n++)

printf("%s\n",name[n-1]);

}

10、void main(){

int n;

char *name[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};

scanf("%d",&n);

printf("%s\n",name[n-1]);

}

11、#define M 3

#define N 4

void main(){

int a[M][N];

int i,j;

for(i=0;i

  for(j=0;j

  {

   scanf("%d",*(a+i)+j);

  }

for(i=0;i

{

  for(j=0;j

  {

   printf("%4d ",*(*(a+i)+j));

  }

  printf("\n");

 }

}

12、#include

int s[4][5];

void fun1()//输入4个学生的5门成绩

{

int i,j;

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

{

printf("请输入第%d位学生的成绩",i+1);

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

{

scanf("%d",*(s+i)+j);

}

}

}

void fun2()//求第一门成绩的平均分

{

float avg=0.0;

int i,sum=0;

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

{

sum=sum+*(*(s+i));

}

avg=sum/4.0;

printf("第一门课程的平均分是%f\n",avg);

}

void fun3()

/*找出有2门以上课程不及格的学生,输出他们的学号、全部课程成绩和平均分;*/

{

int count[4]={0,0,0,0};//统计4个学生不及格课程的数目

float avg[4]={0.0};//存放每个学生的平均分

int sum;

int i,j;

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

{

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

{

if(*(*(s+i)+j)<60)

count[i]++;

}

}

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

{

sum=0;

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

{

sum=sum+*(*(s+i)+j);

}

avg[i]=sum/5.0;

}

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

{

if(count[i]>=2)

{

printf("有2门以上课程不及格的学生学号是%d\n",i+1);

printf("其全部课程成绩如下\n");

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

{

printf("第%d门成绩是:%d\n",j+1,*(*(s+i)+j));

}

printf("平均分是:%f\n",avg[i]);

}

}

}

void fun4()

/*平均成绩在90分以上或全部课程在85分以上的学生*/

{

float avg[4]={0.0};

int flag[4]={0};//标记5门课程成绩是否都在85分以上

int sum;

int i,j;

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

{

sum=0;

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

{

sum=sum+*(*(s+i)+j);

}

avg[i]=sum/5.0;

}

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

{

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

{

if(*(*(s+i)+j)>=85)

 flag[i]++;

}

}

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

{

if(avg[i]>=90.0||flag[i]==5)

printf("平均成绩在90分以上或全部课程在85分以上的学生学号是:%d\n",i+1);

}

}

void main()

{

fun1();

fun2();

fun3();

fun4();

}

一、选择题

1~5: BDABD

6~10:ADBCB

二、填空题

1、55

2、42

3、5

4、14, 10

5、HELLO WORLD

三、程序设计题

1、#include "stdio.h"

#define MOD(x,y) ((x)%(y))

void main()

{

    int x,y;

    scanf("%d,%d",&x,&y);

    printf("%d\n",MOD(x,y));

}

2、

file1.c文件中程序

#define PRINTINT(x) printf("%d\n",x);

#define PRINTFLOAT(x) printf("%f\n",x);

#define PRINTCHAR(x) printf("%c\n",x);

file2.c文件中程序

#include "stdio.h"

#include "D:\JMSOFT\CYuYan\file1.c"

void main()

{

int i=10;

float f=11.2;

char ch='A';

    PRINTINT(i);

    PRINTFLOAT(f);

    PRINTCHAR(ch);

}

3、#include

#define FLAG 1

void main( )

{

 char *s , ch;

 gets(s);

 #if FLAG

 while(*s)

 {  if(*s >= 'a' && *s <= 'z')

        printf("%c",*s - 32);

     else

        printf("%c",*s);

     s++;

}

 #else

while(*s)

 {  if(*s >= 'A' && *s <= 'Z')

        printf("%c",*s+32);

     else

        printf("%c",*s);

 s++;

}

 #endif

}

4、format.h文件中的内容

#define D "%d"

#define F "%f"

#define C "%c"

#define O "%o"

#define X "%x"

#define S "%s"

file.c文件中的内容

#include "stdio.h"

#include "D:\JMSOFT\CYuYan\format.c"

void main()

{

    int i=10;

    printf(D,i);

}

5、#include "string.h"

#define CHANGE 1

void main()  

{char str[80],c;int i=0;

printf("请输入报文:");  

gets(str);  

while(str[i]!='\0')  

{  

#if CHANGE  

if(str[i]==90||str[i]==122) str[i]=str[i]-25;  

else if(str[i]>=65&&str[i]<90||str[i]>=97&&str[i]<122) str[i]=str[i]+1;  

#endif  

i++;  

}  

puts(str);  

}  

一、选择题

1~5:ABBCB

6~10:BDBBB

二、填空题

1、11

2、30

3、4

4、97

5、3

6、Zhao

三、程序设计题

1、#include

typedef struct

{

 int year;

 int month;

 int day;

}date;

int days(date d)

{

 int num = 0;

 int m, da, i;

 if ((d.year %4 == 0 && d.year %100!=0)||(d.year % 400 == 0))

 {

  for (m = 1; m <= d.month ; m++)

  {

   if (m == 2)

    da = 29;

   else if (m==4||m==6||m==8||m==11)

    da = 30;

   else

    da = 31;

   for (i = 1; i <= da;i++)

   {

    num++;

    if ( m == d.month && i == d.day )

     return num;

   }

  }    

 }

 else

 {

  for (m = 1; m <= d.month ; m++)

  {

   if (m == 2)

    da = 28;

   else if (m==4||m==6||m==8||m==11)

    da = 30;

   else

    da = 31;

   for (i = 1; i <= da;i++)

   {

    num++;

    if ( m == d.month && i == d.day )

     return num;

   }

  }

 }

}

void main()

{

 date d;

 scanf("%d%d%d",&d.year,&d.month,&d.day);

 printf("%d年%d月%d日是该年的第%d天",d.year,d.month,d.day,days(d));

}

2、#define N 13   

struct person   

{

     int number;   

     int nextp;   

}

link[N+1];   

void main()   

{

     int I,count,h;   

     for(I=1;I<=N;I++)   

     {

         if(I==N)   

             link[I].nextp=1;

         else    

             link[I].nextp=I+1;   

             link[I].number=I;   

     }   

      

     count=0;   

     h=N;

 printf("出来的顺序是:");  

      while(count

     {

         I=0;   

         while(I!=3)   

         {

             h=link[h].nextp;   

             if(link[h].number)   

             I++;   

         }   

     printf("%5d",link[h].number);   

     link[h].number=0;   

     count++;   

     }   

     printf("\n最后留下来的是:");   

     for(I=1;I<=N;I++)   

         if(link[I].number)   

             printf("%3d",link[I].number);   

}

3、#include "stdio.h"

#define N 5

struct student {

char num[10];

char name[10];

int score;

}stu[N];

void main()

{

int i,max,flag;

    for(i=0;i

    {

     printf("请输入第%d位学生信息:",i+1);

     scanf("%s",stu[i].num);

     scanf("%s",stu[i].name);

     scanf("%d",&stu[i].score);

    }

    max=stu[0].score;

    for(i=1;i

    {

     if(max>stu[i].score)

     {

     max=stu[i].score;

     flag=i;

     }

    }

    printf("成绩最低的学生信息是:");

    printf("学号%s,姓名%s,分数%d\n",stu[flag].num,stu[flag].name,stu[flag].score);

}

4、#include "stdio.h"

#include"malloc.h"

#include"string.h"

#define LEN sizeof(struct number)

struct number

{ int n;

  struct number *next;

};

 struct number *create( )

  { struct number * head;

  struct number * p1,*p2;

  char ch;

  int a=0;       

  head=NULL;    

  printf("是否输入新数据?(y/n):");

  while(toupper(ch=getche())=='Y')

  {  p1=(struct number *)malloc(LEN);

  a++;    

  printf("\n请输入数据:");

  scanf("%d",&p1->n);

  printf("是否输入新数据?(y/n):");

  if(a==1)

  {  head=p1;

  p2=p1;

  }

  else

  {  p2->next=p1;

  p2=p1;

  }

  p1->next=NULL;

  }

  return(head);

  }

struct number *reverse(struct number *head)

{

struct number *p,*q,*r;

p=head;

q=p->next;

while(q!=NULL)

{

r=q->next;

q->next=p;

p=q;

q=r;

}

head->next=NULL;

head=p;

return head;

}

void print(struct number *head)

{  struct number *p;

p=head;

 while(p!=NULL)

{   printf("%d\n",p->n);

p=p->next;

}

}

void main()

{  struct number *p;  

   p=create();

   printf("逆置前链表中的数据是:");    

   print(p);

   p=reverse(p);

   printf("逆置后链表中的数据是:");

   print(p);

}

5、#include

#define MAXSIZE 10

enum{

 January = 1, February, March,

 April, May, June,

 July, August, September,

 October, November, December

};

char month[12][MAXSIZE] = {

 "January", "February", "March",

 "April", "May", "June",

 "July", "August", "September",

 "October", "November", "December"

};

void ShowMonth(int mon);

int main()

{

 ShowMonth(September);

 ShowMonth(3);

 ShowMonth(13);

 return 0;

}

void ShowMonth(int mon)

{

 printf("%i:\t", mon);

 if((mon<1) || (mon>12)) printf("Invalid month!\n");

 else printf("%s\n", month[mon-1]);

}

一、选择题

1-5、BADCB  6-10、DBCAC  11-15、BBBBB  16-19、ADAB

二、填空题

1、"file2.dat"   fgetc(fpr)

2、Progra

3、2  6

4、I love right

5、second

三、程序设计题

1、#include "stdio.h"

   void main( )

  {   FILE *fp;

      char str[80], ch;

      printf("Please input a string(#):");

      if ((fp = fopen("result.txt", "wt")) == NULL)

        {   printf("File open for writing error!");

            exit(0);

        }

      while ((ch = getchar( )) != '#')

      {   if (ch >= 'A' && ch <= 'Z')

            fputc(ch + 32, fp);

        else if (ch >= 'a' && ch <= 'z')

            fputc(ch - 32, fp);

      }

      fclose(fp);

   }

2、#include "stdio.h"

void main( )

{   FILE *fin, *fout;

    char s1[80], s2[80], ch;

    printf("Please input the name of source file:");

    gets(s1);

    if ((fin = fopen(s1, "r")) == NULL)

        {   printf("File open for reading error!");

            exit(0);

        }

    printf("Please input the name of target file:");

    gets(s2);

    if ((fout = fopen(s2, "w")) == NULL)

        {   printf("File open for writing error!");

            exit(0);

        }

    while (!feof(fin))

    {   ch = fgetc(fin);

        fputc(ch, fout);

    }

    fclose(fin);

    fclose(fout);

}

3、#include "stdio.h"

   struct student{

int num;

char name[20];

float ave,total,score[3];

   };

   void main( )

  {

FILE *fp;

int i,j;

float f,ave,total;

struct student stu[5];

if( (fp=fopen("stud.txt", "w"))==NULL )

       { printf("文件打不开。\n");

           exit(1);

       }

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

       {  printf("请输入第%d个学生的姓名、学号及三科学习成绩:", i+1);

      scanf("%s%s", stu[i].num, stu[i].name);

      stu[i].total = 0;

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

        { scanf("%f", &f);

          stu[i].score[j] = f;

          stu[i].total += f;

        }

        stu[i].ave= stu[i].total / 3.0;      

       }

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

       {fprintf( fp, "%10d%15s", stu[i].num, stu[i].name);

        for( j=0; j<3; j++) fprintf( fp, "%8.2f", stu[i].score[j] );

        fprintf( fp, "%8.2f\n", stu[i].ave);

      }  

    }

4、#include "stdio.h"

struct teacher

{   long number;

    char name[6];

    int age;

    float salary;

}t;

void main( )

{   FILE *fp;

    if ((fp = fopen("teacher.dat", "rb")) == NULL)

        {   printf("File open for reading error!");

            exit(0);

        }

    while (!feof(fp))

    {   fread(&t, sizeof(struct teacher), 1, fp);

        if (t.salary > 1000 && t.salary < 2000)

            printf("%ld %s  %d  %f", t.number, t.name, t.age, t.salary);

    }

    fclose(fp);

}

第3章   数据类型、运算符与表达式

习 题 答 案

一、 选择题

  1. 以下表示正确常量的是(   )。

 (A) E-5   (B) 1E5.1   (C) 'a12'   (D) 32766L

【答案】D

  1. 若有定义:int a=1,b=2,c=3,d=4,x=5,y=6; 则表达式 (x=a>b)&&(y=c>d) 的值为(   )。

(A)0   (B) 1   (C) 5   (D) 6

【答案】A

  1. 以下(   )是正确的字符常量。

(A)"c"   (B) '\\''   (C) 'W'   (D) "\32a"

【答案】C

  1. 以下(   )是不正确的字符串常量。

 (A) 'abc'   (B) "12'12"   (C) "0"   (D) " "

【答案】A

  1. 以下是正确的浮点数的是(    )。

(A)e3   (B) .62   (C) 2e4.5   (D) 123

【答案】B

  1. 若有定义:int a=2; 则正确的赋值表达式是(   )。

(A)a-=(a*3)   (B) double(-a)   (C) a*3   (D) a*4=3

【答案】A

  1. 若有定义:int x=1111,y=222,z=33;则语句printf("%4d+%3d+%2d", x, y, z);运行后的输出结果为(    )。     

(A)111122233 (B)1111,222,33

(C)1111  222  33 (D)1111+222+33

【答案】D

  1. 已有如下定义和输入语句:

int a,b;

scanf("%d,%d",&a,&b);       

若要求a、b的值分别为11和22,正确的数据输入是哪一个?(    )

(A)11 22      (B)11,22      (C)a=11,b=22      (D)11;22

【答案】B

  1. 已有如下定义和输入语句,

int a; char c1,c2;

scanf("%d%c%c",&a,&c1,&c2);

若要求a、c1、c2的值分别为40、A和A,正确的数据输入是(   )。              

(A) 40AA      (B) 40  A A      (C) 40A  A       (D) 40,A,A

【答案】A

  1. 语句a=(3/4)+3%2;运行后,a的值为(    )。

 (A) 0   (B) 1   (C) 2   (D) 3

【答案】B

  1. char型变量存放的是(    )。

 (A) ASCII代码值  (B) 字符本身  

(C) 十进制代码值    (D) 十六进制代码值

【答案】A

  1. 在下列运算符中,优先级最高的运算符是(    )。

 (A) <=   (B) !=   (C) !   (D) ||

【答案】C

  1. 设单精度型变量f、g的值均为2.0,使f为4.0的表达式是(   )。

(A) f+=g   (B) f-=g+2   (C) f*=g-6   (D) f/=g*10

【答案】A

  1. 若有定义:int i=7,j=8;则表达式 i>=j||i

 (A) 1   (B) 变量i的值   (C) 0   (D) 变量j的值

【答案】A

  1. 若希望当a的值为奇数时,表达式的值为"真",a的值为偶数时,表达式的值为"假"。则不能满足要求的表达式是(   )。

 (A) a%2==1   (B) !(a%2==0)   (C) !(a%2)   (D) a%2

【答案】C

  1. 若有定义:int x=3,y=4,z=5;则值为0的表达式是(    )。

 (A) 'x'&&'y'   (B) x<=y   (C) x||y+z&&y-z   (D) !((x

【答案】D

  1. 若有定义:float x=3.5;int z=8;则表达式 x+z%3/4 的值为(   )。

(A) 3.75   (B) 3.5   (C) 3   (D) 4

【答案】B

  1. 已知char a='R'; 则正确的赋值表达式是(    )。

 (A) a=(a++)%4   (B) a+2=3   (C) a+=256--   (D) a='\078'

【答案】A

  1. 若有定义:int b=7; float a=2.5,c=4.7;则表达式a+(b/2*(int)(a+c)/2)%4的值是(    )。

 (A) 2.5   (B) 3.5   (C) 4.5   (D) 5.5

【答案】C

  1. 若已定义:int i=3,k;  则语句 k=(i--)+(i--); 运行后k的值为(    )。

 (A) 4   (B) 5   (C) 6   (D) 7

【答案】C

  1. 若已定义:int a=5;float b=63.72;  以下语句中能输出正确值的是(    )。

 (A) printf("%d %d",a,b);    (B) printf("%d %.2f",a,b);

 (C) printf("%.2f %.2f",a,b);    (D) printf("%.2f %d",a,b);

【答案】B

  1. C语言中,能正确表示条件10

 (A) 1010 || x<20

 (C) x>10 && <20   (D) (x>10) && (x<20)

【答案】D

  1. 若表达式!x的值为1,则以下哪个表达式的值为1(    )。

 (A) x==0    (B) x==1   (C) x=!1   (D) x!=0

【答案】A

  1. 语句x=(y=3,b=++y);运行后,x、y、b的值依次为(    )。                

(A)4,4,3 (B)3,3,3 (C)4,4,4 (D)4,3,4

【答案】C

  1. 若有定义:int x,c;则语句x=(c=3,c+1);运行后,x,c的值分别是(    )。

(A)3,3 (B)4,4 (C)3,3 (D)4,3

【答案】D

  1. 语句a=(6/8)+6%5;运行后,a的值为(    )。

(A)1 (B)2 (C)1.75 (D)1.2

【答案】A

  1. 若有定义:int x,y;则表达式(x=2,y=5,x*2,y++,x+y)的值是(    )。

(A)7 (B)8 (C)9 (D)10

【答案】B

  1. 对代数式(4ad)/(bc),正确的C语言表达式是(    )。

(A)a/b/c*d*4    (B)4*a*d/b/c    (C)4*a*d/b*c     (D)a*d/c/b*4

【答案】C

  1. 若x和y为整数,以下表达式中不能正确表示数学关系|x-y|<10的是(   )。

(A)abs(x-y)<10 (B)(x-y)>-10&&(x-y)<10

(C)!(x-y)<-10||!(y-x)>10   (D)(x-y)*(x-y)<100

【答案】C

  1. 若有以下程序段,则z的二进制值是(    )。

int x=3,y=6,z;

z=x^y<<2;

(A)00010100 (B)00011011

(C)00011000   (D)00000110

【答案】B

二、  填空题

  1. 表达式3/5的值是:        ,3.0/5的值是        ,3%5的值是       

【答案】0   0.6    3

  1. 以下程序运行的结果是:         

void  main()

{

char c;

c=’B’+32;

printf(“%c\n”,c);

}

【答案】b

  1. 若有定义:int a=5,b=4;char c1='A',c2='B';则表达式a+b%5+c2-c1的值是        

【答案】10

  1. 若有定义:int b; 则语句b=9/5+ 9%5;运行后,b的值为        

【答案】5

  1. 若已定义:int a=9,b=11,c;  则语句c=a>b; 运行后c的值为        

【答案】0

  1. 若有定义:int a=2,b=3; float x=3.5,y=2.5;则表达式(float)(a+b)/2+(int)x%(int)y的值是     

【答案】3.5

  1. 已知double a=5.2; 则语句a+=a-=(a=4)*(a=3);运行后a的值为        

【答案】-18.0

  1. 若有定义:int x,y;则表达式(x=2,y=5,x++,x+y++)的值是       。 

【答案】8

  1. 若有定义:int m=3,n=5;则表达式(m+1,n+1,(--m)+(n--))的值是       。    

【答案】7

  1. 若有定义:int x=3,y=4;则表达式 !x||y 的值为       

【答案】1

  1. 若有定义:int a=5,b=2,c=1;则表达式a-b       。

【答案】0

  1. 若有定义:int a=2,b=2,c=2; 则语句 ++a||++b&&++c;运行后b的值为       。   

【答案】2

  1. 以下程序段中,要将a的值的低4位取反,b的值应取       

unsigned char a=0x39,b;

b=       ;

a=a^b;

【答案】15或0xf

  1. pow(3.0,2.0)的函数值是        

【答案】9.0

  1. 若有定义:int k,i=3,j=3; 则表达式 k=(++i)*(j--) 的值是          。              

【答案】12

三、程序设计题

1. 编写程序,从键盘输入大写字母,用小写字母输出。

【参考答案】

void main

{

char c1;

printf(“input a uppercase:”);

scanf(“%c”,&c1);

c1=c1+32; /*在ASCII表中,小写字母的ASCII值比对应的大写字母大32*/

printf("%c\n", c1);

}

2. 编写程序,从键盘输入一个矩形的长度和宽度,输出面积和周长。

【参考答案】

void main

{

float len,wid,size; /*len,wid,size分别表示矩形的长、宽、面积*/

printf("input length:");

scanf("%f",&len);

printf("input width:");

scanf("%f",&wid);

size=len*wid;

printf("size of the rectangle is: %f\n", size);

}

3. 编写一个程序,从键盘输入华氏温度,将其转换成摄氏温度值后输出。转换的公式为:C=(F-32)/1.8

【参考答案】

void main

{

float c,f;

printf("input Fahrenheit temperature f:");

scanf("%f",&f);

c=(f-32)/1.8;

printf("Centigrade temperature c is: %f\n", c);

}

4. 编写程序,输入两个字符,利用条件运算符,输出其中较小字符的ASCII 码值。

【参考答案】

void main()

{

char c1,c2;

int i;

printf("input two letters:");

scanf("%c,%c",&c1,&c2);    /*注意:输入的两个字符之间要用逗号隔开*/

i= c1

printf("minimum ASCII is %d\n",i);

}

5. 用C赋值语句表示以下计算式:

1)Area=pr2+2prh

2)Torque=

3)Side=

4)Energy=mass[acceleration×height+]

【参考答案】

1)Area=PI*r*r+2*PI*r*h

2)Torque=((2*m1*m2)/(m1+m2))*g

3)Side=sqrt(a*a+b*b-2*a*b*cos(x))

4)Energy=mass(acceleration*height+velocity*velocity/2)

第6章   函数

习题解答

一、 选择题

1下列关于函数定义的描述中,错误的是(     )。

 A.定义函数时函数的存储类型可以省略

B.定义函数时函数名和函数类型必须指明

C.定义函数时必需有函数体

D.定义函数时必需指明函数参数

 【答】D

2下列关于函数(原型)声明的描述中,错误的是(     )。

A.函数声明可放在函数体内,也可放在函数体外

B.函数声明既要给出函数名和类型,又要指出函数参数

C.函数调用前必须给出被调函数的函数声明,否则出错

D.被调函数的定义在主调函数前面时,可以不用函数声明

     【答】C

3以下正确的定义函数首部的形式是(     )。

A.float func(int n;float x)

B.float func(int n,float x);

C.float func(int n;float x);

D.float func(int n,float x)

【答】D

4下列关于函数参数的描述中,错误的是(     )。

A.定义函数时可以有参数,也可以没有参数

B.在传值调用时,实参只能是变量名,不可以是表达式

C.函数的形参在该函数被调用前是没有确定值的

D.要求函数的形参和对应的实参个数应相等、类型应赋值兼容

     【答】B

5下列说法中,不正确的是(     )。

  A.实参可以为任意类型

  B.形参与对应实参的类型要赋值兼容

  C.形参可以是常量、变量或表达式

  D.实参可以是常量、变量或表达式

【答】C

6下面函数调用语句中,实参的个数是(     )。

    func(n1,n2+n3,func(n4,n5,n6));

A.6        B.5        C.4         D.3

   【答】D

7设有下面函数调用语句,则其所调函数fun中形参的个数是(     )。

     fun(f(n1,n2),n3,n4 + n5);

A.5        B.4        C.3         D.2

【答】C

8下面说法中正确的是(     )。

  A.实参占用存储单元,形参不占用存储单元

  B.相对应的实参与形参共用同一存储单元

  C.相对应的实参与形参同名时,它们共用同一存储单元

D.相对应的实参与形参占用不同的存储单元

【答】D

9实参为简单变量,其与对应形参之间的数据传递方式为(     )。

  A. 由用户另外指定传递方式

  B. 双向值传递

  C. 单向值传递

D. 地址传递

【答】C

10实参用数组名,则传递给对应形参的是(     )。

  A.数组的地址

  B.数组的长度

  C.数组中每一个元素的地址

  D.数组中每一个元素的值

【答】A

11下列关于函数调用的描述中,错误的是(     )。

  A.在函数调用中,形参是变量名,实参可以是变量、常量和表达式

  B.在函数调用中,形参是指针时,实参必须是地址值

C.在传址调用方式中,可以在被调用函数中改变调用函数的参数值

D.在传值调用方式中,可以在被调用函数中改变调用函数的参数值

  【答】D

12下列关于函数返回值的论述中,错误的是(     )。

  A.函数返回值能够实现函数间的数据传递

  B.函数返回值是由return<表达式>实现的

  C.函数返回的值和值的类型是由返回语句中表达式的值和类型决定的

  D.一个函数可有多条返回语句,但只可有一个返回值

  【答】C

13.函数返回值的类型由(     )。

  A.调用该函数的函数类型决定           B.return语句中表达式的类型决定

  C.主函数决定                         D.该函数的函数类型决定

【答】D

14.下列关于函数的论述中正确的是(     )。

A.不允许函数嵌套定义,但允许函数嵌套调用

B.不允许函数嵌套调用,但允许函数嵌套定义

C.函数的定义和调用都允许嵌套

D.函数的定义和调用都不允许嵌套

【答】A

15.下列关于函数调用的论述中不正确的是(     )。

A.函数间允许嵌套调用                 B.函数间允许间接递归调用

C.函数间允许直接递归调用             D.函数间不允许直接递归调用

【答】C

16.以下说法不正确的是(     )。

A.所有的形式参数都是局部变量

B.不同函数中允许说明并使用相同名字的变量

C.函数内定义的变量其有效范围不超出该函数

D.函数内的复合语句中说明的变量在该函数范围内有效

【答】D

17.在本程序中能被所有函数使用的变量,其存储类别是(     )。

A.auto(自动)  B.static(静态)  C.register(寄存器)  D.exern(外部)

【答】 D

18.在函数中未说明存储类别的局部变量,其隐含的存储类别是(     )。

A.auto(自动)  B.static(静态)  C.register(寄存器)  D.exern(外部)

【答】A

19.下列关于变量的论述中,不正确的是(     )。

A.外部变量定义与外部变量声明,两者的含义不同

B.外部变量与静态外部变量的存储类型不同(即它们被分配的存储区不同)

C.在同一函数中,既可使用本函数中的局部变量又可使用与局部变量不同名的全局变量

D.在同一程序中,外部变量与局部变量同名时,则在局部变量作用范围内外部变量不起作用

【答】 B  

20.运行以下程序, 其输出结果是(     )。

void swap28(int n0,int n1)

{

 int temp;

temp=n0;

n0=n1;

n1=temp;

}

void swapl4(int n[])

{

int  temp;

   temp=n[0];

 n[0]=n[1];

 n[1]=temp;

 }

void  main()

{

 int a[2]={2,8},b[2]={1,4};

swap28(a[0],a[1]);

  swapl4(b);

  printf(“%d %d %d %d\n”,a[0],a[1],b[0], b[1]);

}

A.2814         B.2841        C.8241          D.8214

【答】 B

二、填空题

1若自定义函数要求返回一个值,则在该函数中应有一条  【1】 语句;若自定义函数要求不返回值,则在该函数说明时加一类型说明符  【2】  

【答案】

【1】带有表达式的return

【2】void

2.函数调用时的实参与对应的形参是数组时,参数传递方式为  【1】  是普通变量时,参数传递方式为  【2】

【答案】

【1】传地址

【2】传

3.静态局部变量的作用域是  【1】

【答案】

【1】定义它的函数或复合语句的内部

4.函数形参的作用域是  【1】 。全局的外部变量与函数体内定义的局部变量同名时,在函数体内,  【2】 变量起作用。

【答案】

【1】整个函数体内

【2】局部

5.下列函数sub( )的功能是求两个参数的差,并将差值返回调用函数。该函数中错误的部分是  【1】 ,改正后应为  【2】

void  sub(double  x, double  y)

{

   double  z;

z= x – y;

return  z;

}

【答案】

【1】void  sub(double  x, double  y)

【2】double  sub(double  x, double  y)

6. 为了使下面程序能够正确运行,程序的第2行应填写的内容是  【1】 ,当输入的数值为66和99时,该程序输出的结果是  【2】

#include

  【1】

main()

{

 double x1,x2;

  scan(“%lf,%lf”,&x1,&x2) ;

printf(“%lf\n”,max(x2,x1)) ;

getch( ) ;

}

double max(double y1,double y2)

{

return(y1>y2 ? y1–y2 : y2-y1);

}

【答案】

【1】double max(double ,double ) ;

【2】 33.000000  

7. 下面程序,在函数sum( ) 中求(m + n)/3 + (m - n)/3的值,在主函数中为m、n

输入10、7,并输出计算结果,请填空。

#include

void main()

{

int m,n;

  【1】

printf(“Please input  m,n:”);

scanf(“%d,%d”,  【2】     );

printf(”The sum=%d\n”,sum(m,n));

}

int sum(int i,int j)

{

int k;

k=    【3】   ;

return k;

}

【答案】

【1】int sum( );

【2】&m,&n

【3】(i+j)/3+(i-j)/3

8. 下面程序功能是求两个浮点数的和,程序内容如下, 请填空。 

#include

double add(double x,double y,double p)

{

p=x+y;

  【1】

}

void main()

{

    double a=55.44, b=44.55 ;

    double k;

    add(a,b,  【2】 );

printf(“%.2lf\n”,k);

}

【答案】

【1】return(p);

【2】k

注:输出的k值是不确定的!

9.下面程序的运行结果是  【1】

#include

void func(int br[])

{ int i=1;

  while(br[i]<=10)

  {

     printf("%5d",br[i]);

     i++;

  }

}

void main()

{

   int ar[]={2,4,8,10,8,4,11,9,7};

   func(ar + 1);

   printf("\n");

   getch();

}

【答案】

【1】    8    10    8     4

10. 函数acopyb将整型数组aarra的内容逆序复制到整型数组barra中(-32768作为数组

元素值的结束标志),请填空。

#include

void acopyb(int aa ,int ba )

{

    int  i=0,j=0;

    while(aa[j]!=-32768)  j++;

    ba[j]=aa[j];  j--;

    while(aa[i]!=-32768)  

   {

       【2】

      j--;

      i++;

   }

}

void main()

{

   static int aarra[]={1,3,5,7,9,2,4,6,8,10,-32768};

   int  barra[20];

 int  i=0;

   acopyb(   【1】  );

   while(barra[i]!=-32768)

       printf("%3d",   【3】  );

printf("\n");

   getch();

}

【答案】

1aarra ,barra 

2ba[j]=aa[i];

【3】barra[i++]

11.   【1】 处填写适当内容,使下面程序的输出结果为264

#include

int func(int m, int n)

{

  return (m * n);

}

void  main()

{

   int a=3,b=11,c=8,d;

   d=func(func(   【1】  ),c);

   printf("%d\n",d);

   getch();

}

【答案】

1a ,b或者b , a

12.面程序的输出结果为  【1】

#include

#define  N 10

void output(int *p,int n)

{

   int i;

   for(i=0;i

      printf("%5d",*p++);

   printf("\n");

}

void main()

{

  int x[N],i, *q;

  for(i=0;i

  q=x;

output(q,N);

for(i=0;i

}

【答案】

【1】0   2   4   6   8   10   12   14   16   18

     0   2   4   6   8   10   12   14   16   18

13. 函数small()5x5矩阵(即从5行、5列二维数组中,找出主对角线上元素的最小值。在函数为数组输入数据。请填写适当内容。   

#include     

int small(int a[5][5])     

{

int  i,vm;

   vm = a[0][0];

   for(i =1;i < 5;i++)

      if(vm > a[i][i])

           vm =   【1】   

   return(vm);

}

void main()

{           

int  i,j,vmin;

   int  array[5][5];    

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

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

          scanf(”%d”,  【2】 );

   vmin = small(array);       

   printf(”vmin = %d\n”, vmin);

}

【答案】

【1】a[i][i];

【2】&array[i][j]

14. 函数max_value()求3x4矩阵所有元素中的最大值。请在下面程序1 、 【2】处填写适当内容。 

#include

void main( )    

{

   int max_value(int array[][4]);   

int a[3][4]=({1,3,5,7},{2,4,6,8},{15,17,34,12});  

printf(”max value is %d\n”, 【1】  );

}

int max_value(int array[][4])  

{

int i,j,max;   

max = array[0][0];

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

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

if(array[i][j] > max)

【2】  =array[i][j];

return(max);

}

【答案】

【1】max_value(a)

【2】max

15.下面程序的功能是调用选择排序法函数select( )对数组中的整数按从小到大的顺序排列,填写适当内容。

#include

void  main( )

{

void select(int a[],int n);  

 int b[10],i;

printf("Input 10 numbers");

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

   scanf("%d",   1     );

printf("\n");

select( 2      ,10);

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

   printf("%d",b[i]);

}  

void select(int a[],int n)     

{    

int  i,j,k,temp;

for(i = 0;i < n - 1;i++)

    {

k = i;

       for(j = i+1;j < n;j++)

          if(a[j] < a[k])    

               k=j;

       if(k    3    i)

         {

temp = a[k];

           a[k] =   4 ;

           a[i] = temp;

            }

   }

 }

【答案】

1&b[i]

2】b

3!=

4a[i]

16.下面程序的运行结果是  【1】   ,函数sort( )采用的算法是  【2】   。

#include

#define M  5

#define N  6

void sort(int a[],int n)

{int i, j,temp;

  for(i=0;i

   {

     for (j=i+1;j

       if(a[i] < a[j])

       {

     temp = a[i];

     a[i] = a[j];

     a[j] = temp;

       }

   }

   for(i=0;i

     printf("%5d",a[i]);

   printf("\n");

}

void main()

{

int i;

int x[]={7,3,9,5,1};

int y[]={46,55,91,64,82,73};

sort(x,M);

sort(y,N);

for(i=0;i

       printf("%5d",x[i]);

printf("\n");

for(i=0;i

       printf("%5d",y[i]);

printf("\n");

}

【答案】

1】  9    7    5    3    1

      91   82   73   64   55   46

       9    7    5    3    1

      91   82   73   64   55   46

【2】函数sort( )采用的是冒泡排序法。

17.下面程序的功能是利用函数的递归调用求1!+2!+3!+ …… +9!,请填写适当内容。

#include

long int fracsum(int n)

{

if(n==1)

return ( 1 );

else

return (n*  【1】 );

}

void  main()

{

   int i=1;

long int sum;

sum=   【2】   

while(i<=9) 

{

sum+=  【3】  ;i++;

}

   printf("%ld\n",sum );

   }

【答案】

【1】fracsum( n-1)

【2】0

【3】fracsum(i)

18.下面程序的功能是  1】    ,程序运行结果是  【2】    。

#include

void main( )

{ int fib(int n);

  int i;

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

    { if(i%5==0) printf("\n")  ;

printf("%10d",fib(i));

    }

    printf("\n");

    getch();

 }

int fib(int n)

{  if(n==0 || n==1)  return n;

    else

     return fib(n-2)+fib(n-1);

}

【答案】

【1】计算斐波那契(Fibonacci)数列前10项的值。

【2】 0         1         1         2         3

5         8        13        21        34

19.运行下面程序,函数func( )中输出的结果是 【1】  ,主函数中输出的结果是【2】

#include

int  n=10;

int func(int p)

{

n += p;

p += n;

printf("%d,%d\n",p,n);

return (n);

}

void  main()

{

   int m=6, pand=8;

   pand=func(m);

   printf("\n%d,%d,%d\n",m,pand,n);

   getch();

}

【答案】

122   16

【2】6   16   16

20.运行下面程序,输出的结果是 【1】   。

#include

int   m,n;

int fun( )

{

  m=88;

  n=99;

  return ( n);

}

void  main()

{

   int m=55, n=66;

   printf("\n%d,%d,%d,%d\n",m, fun( ), m, n);

   getch();

}

【答案】

1 55,99,55,66

21.运行下面程序,输出的结果是   【1】   。

#include

int m=9;

int func(int a, int b )

{

  int m=1;

  printf("\n%d\n",++m);

  return (a*b-m);

}

void  main()

{

   int x=2, y=35;

   printf("\n%d\n",func(x,y)/m);

    getch();

}

【答案】

12 和  7

22.运行下面程序,函数fun( )中输出的结果是 【1】  ,主函数中输出的结果是【2】

#include

void fun(int s[])

{  static int i=0;int j;

   do

   {

      s[i]+=s[i+1];

}while( ++i<3 );

for(j=0;j<5;j++)  printf("%d",s[j]);  printf("\n");

}

void  main()

{

   int i,a[10]={0,1,2,3,4};

   for(i=1;i<3;i++)  fun(a);

   for(i=0;i<5;i++)  printf("%d",a[i]);

   printf("\n");

   getch();

}

【答案】

【1】13534

     13574

【2】13574

23.运行下面程序,输出的结果是 【1】  。

#include

int  n=98;

int  fun()

 {

 static  int  n=1;

 n+=2;

 return (n);

 }

void  main()

{

 n+=2;

 printf("\n%d, %d\n",++n,fun() );

 printf("\n%d, %d\n",n++,fun() );

 getch();

}

【答案】

1101, 3

     101,  5

三、程序设计题

1. 输入任意3个整数,利用函数的嵌套调用,求出3个数中的最小值。

参考程序代码如下:

#include

void main()

{

 int mintwo(int, int);              /*函数声明 */

 int minthree(int,int,int);           /*函数声明 */

 int x,y,z,min;

 printf("\nPlease input three integer:\n");

 scanf("%d,%d,%d",&x,&y,&z);

 min=minthree(x,y,z);              

 printf("\nMin is %d",min);

}

int mintwo(int a,int b)

{

 return(a

}

int minthree(int a,int b,int c)       

{

 int z;

 z=mintwo(a,b);                    /*嵌套调用函数mintwo()*/

 z=mintwo(z,c);

 return(z);

}

2. 由键盘输入两个整数,编写两个函数,分别求这两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。

参考程序代码如下:

#include

long int gcd(long int,long int);                    /* 函数声明 */

long int lcm(long int,long int);                     /* 函数声明 */

void main()

{

  long int a,b;

  printf(" \n Please enter the integer a,b :");

  scanf("%ld,%ld",&a,&b);

  printf("\na=%ld,b=%ld\n",a,b);

  printf("The greatest common divisor of  ");

printf(" %ld and  %ld is  %ld\n",a,b,gcd(a,b)); /*调用函数gcd()求最大公约数*/

  printf("The least common multiple of  ");

printf(" %ld and %ld is %ld\n",a,b,lcm(a,b));  /*调用函数lcm()求最小公倍数 */

}

long int gcd(long int a,long int b)

{

  long int item, c;

  if(a < b)

  {

    item=a;a=b;b=item;

  }

   do

    {

     c=a%b; a=b; b=c;

    } while(c!=0);

  return  a;                                 /* 返回a 与 b的最大公约数 */

}

long int lcm(long int a,long int b)

{

 long int item, i;

 if(a < b)

   {

     item=a; a=b; b=item;

   }

   for(i=1; ; i++)

   {

    item=i*a;

    if(item % b == 0) return item;            /* 返回a 与 b的最小公倍数 */

   }

}

3.编写一个函数,用阶乘倒数之和求e的近似值,即e = 1 + 1/2+ 1/3+  + 1/n!

参考程序代码如下:

#include

    void main()

{

 long int fac(int n);                  /*求阶乘函数fac()的声明*/

 long int n, i;

 float e=0,  p;

 printf("\nPlease input a integer:");

 scanf("%ld",&n);

 if(n<0)

     {

      printf("\n Negative argument!\n");

      exit(-1);                              /*正常退出*/

     }

 for(i=1;i<=n;i++)

     {

      p=fac(i);                            /*函数调用 */

      e=e+1.0/p;                           /*求和*/

     }

    printf("\n sum: %15.12f\n",e);

}

long int fac(int n)                    /*求阶乘的递归函数定义*/

{

 if(n==0‖n == 1)               /* 递归结束条件*/

    return(1);                    

  return (n*fac(n-1));                  /*递归调用*/

}

4. 求方程ax²+ bx + c = 0的根,用个函数分别求当b²- 4ac大于0、等于0和小于0时的根并输出结果。从主函数输入abc的值。

参考程序代码如下:

#include

#include

void solut(double,double,double);         /* 以下4行均为函数声明 */

void solut1(double,double,double);

void solut2(double,double);

void solut3(double,double,double);

void main()

{

 double a,b,c;   /*为了不失一般性,一元二次方程的系数设置为double型*/

 printf(" Please enter a,b,c :\n");

 scanf("%lf,%lf,%lf",&a,&b,&c);

 printf("\na=%lf,b=%lf,c=%lf\n",a,b,c);

 if(a == 0)

    printf("The eguation is not quadratic !\n");

 else

    solut(a,b,c);

}

void solut(double a,double b,double c)

{

 double disc;

 disc=b*b-4*a*c;

 if(disc > 0)

    solut1(disc,a,b);                /* 调用函数solut1,求两个不等实根 */

 else

    if( disc == 0 )

   solut2(a,b);                /* 调用函数solut2,求两个相等实根 */

    else

   solut3(disc,a,b);            /* 调用函数solut3,求虚根 */

}

void solut1(double disc,double a,double b)

{

 double x1,x2;

 x1=(-b+sqrt(disc))/(2*a);

 x2=(-b-sqrt(disc))/(2*a);

 printf("Has distinct real roots:\nx1= %lf,x2= %lf\n",x1,x2);

}

void solut2(double a,double b)

{

 double x1,x2;

 x1=x2=-b/(2*a);

 printf("Has two equal roots:\n x1= %lf,x2= %lf\n",x1,x2);

}

void solut3(double disc,double a,double b)

{

 double realp,imagp;

 realp=-b/(2*a);

 imagp=sqrt(-disc)/(2*a);

 printf("Has two complex roots:\n");

 printf("%lf + %lfi\n",realp,imagp);

 printf("%lf - %lfi\n",realp,imagp);

}

5. 编写程序,使能对分数进行加、减、乘、除四则运算的练习。即要求:对输入的

两个分数可以进行加、减、乘、除运算的选择,并将运算结果以分数形式输出。

参考程序一代码如下:

#include

long int a,b,c,d,x,y,z;                /* 定义全局变量 */

char op;

void main()

{

 int fxz( ), fhj( );                 /* 两个无参函数声明 */

 printf("P1ease input two data for example b/a,d/c \n");

 scanf("%ld/%ld%c%ld/%ld",&b,&a,&op,&d,&c);

 if(a==0 || c==0)

exit(0);

 fsz();           /* 函数调用 */

 fhj();           /* 函数调用 */

 printf("\n%ld / %ld %c %ld / %ld=  %ld / %ld",b,a,op,d,c,y,x);

}

int fsz( )          /* 定义选择四则运算函数,该函数对全局变量进行操作 */

{

 if(op=='+')  {y=b*c+d*a; x=a*c; return;}

 if(op=='-')  {y=b*c-d*a; x=a*c; return;}

 if(op=='*')  {y=b*d; x=a*c; return;}

 if(op=='/')  {y=b*c; x=a*d; return;}

}

int fhj( )     /* 定义将结果分数进行化简的函数,该函数对全局变量进行操作 */

{

 int i;          /* 整型变量i为局部变量,只在本函数内有效*/

 z=x;

 if(x>y) z=y;

 i=z;

 while(i>1)

    {

     if(x%i==0 && y%i==0)

    {x=x/i; y=y/i; continue;}

     i--;

    }

 }

参考程序二代码如下:

#include

void main( )

{

 void fhj(int *,int * );         /* 函数声明 */

 int a,b,c,d,x,y;                /* 定义局部变量 */

 int number;

 printf("P1ease input two data for example b/a,d/c \n");

 scanf("%d/%d,%d/%d",&b,&a,&d,&c);    /* 由用户输入两个分数 */

 if(a==0 || c==0)

exit(0);

 printf("\n\n");

 printf(" 1----add\n");

 printf(" 2----sub\n");

 printf(" 3----mult\n");

 printf(" 4----divi\n");

 printf("P1ease your select?");

 scanf("%d" ,&number);            /* 由用户选择要进行哪种计算 */

 printf(" The result is :");

switch(number)

{

 case 1: y=b*c+d*a; x=a*c;     /* 进行加法运算 */

   fhj(&y,&x );          /* 调用化简函数调用 */

   printf("\n%d/%d + %d/%d=%d/%d\n",b,a,d,c,y,x);

   break;

   case 2: y=b*c-d*a; x=a*c;    /* 进行减法运算 */

     fhj(&y,&x );          /* 调用化简函数调用 */

     printf("\n%d/%d - %d/%d=%d/%d\n",b,a,d,c,y,x);

     break;

   case 3: y=b*d;

         x=a*c;   /* 进行乘法运算 */

     fhj(&y,&x );         /* 调用化简函数调用 */

     printf("\n%d/%d * %d/%d=%d/%d\n",b,a,d,c,y,x);

     break;

   case 4: y=b*c;

         x=a*d;   /* 进行除法运算 */

     fhj(&y,&x );         /* 调用化简函数调用 */

     printf("\n%d/%d / %d/%d=%d/%d\n",b,a,d,c,y,x);

     break;

  }

}

void fhj(int *y,int *x )    /* 定义化简函数fhj(),形参为指针变量 */

{

 int i,z;

 z=*x;

 if(*x > *y) z =*y;

 i=z;

 while(i>1)

    {

     if(*x%i==0 && *y%i==0)

     {*x=*x/i; *y=*y/i; continue;}

     i--;

    }

 }

6. 写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。

参考程序代码如下:

#include

#include

int isprime(int n)                        /*定义判断素数的函数 */

{

 int i;

 for(i=2; i

    if(n%i==0) return 0;

 return 1;

}

void main()

{

 int number,is;

 printf("\nPlease a number:\n");

 scanf("%d",&number);

 is=isprime(number);                      /* 调用判断素数的函数 */

 if(is==1)

    printf("%d is prime!",number);       /* 输出是素数的信息*/

 else

    printf("%d is not prime!",number);   /* 输出不是素数的信息*/

}

7.  编写程序输出如下“万年历”功能:当用户输入年份时能输出该年的日历,在日历上能够看出某天是星期几,可以显示任意一年任意一天,并能够知道是否是闰年等。

参考程序代码如下:

#include

void main()

{

 int i,j,day,year,temp,temp_i;

 long int Year_days;

 long int sumdays(int year);                  /* 函数声明 */

 int IsLeapYear(int year);                    /* 函数声明 */

 int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31,29}, everyday[6][14];          

/* 数组everyday用于保存计算所得的日历 */

 printf("Please enter the year?");

 scanf("%d", &year);

 Year_days=sumdays(year);      /* 调用函数sumdays()计算天数 */

 for(temp=1;temp<=6;temp++)    /* 分 6 次输出12个月的日历*/

 {

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

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

      everyday[i][j]=0;

  switch(temp)                  /* 一行输出两个月份 */

  {

   case 1:printf("\n\n\tJanuary   %d\t\t\tFebruary %d\n",year,year);break;

   case 2:printf("\n\n\tMarch     %d\t\t\tApril    %d\n",year,year);break;

   case 3:printf("\n\n\tMay       %d\t\t\tJune     %d\n",year,year);break;

   case 4:printf("\n\n\tJuly      %d\t\t\tAugust   %d\n",year,year);break;

   case 5:printf("\n\n\tSeptember %d\t\t\tOctober  %d\n",year,year);break;

   case 6:printf("\n\n\tNovember  %d\t\t\tDecember %d\n",year,year);break;

  }

  printf("Mon Tue Wed Thu Fri Sat Sun     Mon Tue Wed Thu Fri Sat Sun\n");

  i=j=0;

  for(temp_i=0;temp_i<(Year_days % 7);temp_i++)   /*初始化数组*/

everyday[0][j++]=0;

  day=1;

  while(day<=month_day[2*temp-1])               /*将奇数月日历输入数组*/

   {

    if(j % 7==0)

   {j=0; i++;}

    everyday[i][j++]=day;

    Year_days++;

    day++;

   }

  i=0;j=7;

  for(temp_i=0;temp_i<(Year_days % 7);temp_i++)  /*初始化数组*/

everyday[0][j++]=0;

  day=1;

  if(IsLeapYear(year) && 2*temp==2)            /*调用函数判断闰年*/

     while(day<=month_day[13])               /*将闰年偶数月日历输人数组*/

        {

         if(j%14==0)

        {j=7;i++;}

         everyday[i][j++]=day;

         Year_days++;

         day++;

       }

  else

     while(day<=month_day[2*temp])             /*把偶数月的日历输入数组*/

       {

        if(j % 14==0)

      {j=7;i++;}

           everyday[i][j++]=day;

           Year_days++;

           day++;

          }

      for(i=0;i<6;i++)                             /*输出存储在数组中的日期*/

         {

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

        {if(everyday[i][j]!=0)printf("%-4d",everyday[i][j]);

         else    printf("    ");

         if(j==6)printf("    ");

        }

          printf("\n");

        }

      if(getch()=='q') exit(0);

   }

}

int IsLeapYear(int year)           /*定义IsLeapYear()函数判断是否是闰年*/

{

 if((year % 4==0) && (year % 100 !=0) || (year % 400==0))

    return 1;

 else

    return 0;

}

long int sumdays(int year)       /* 函数sumdays()用于计算输入年份之前的天数*/

{

  int year_start=1 ,leapsum=0;

  while(year_start

  {

    if(IsLeapYear(year_start))   /* 调用IsLeapYear()函数判断闰年 */

        leapsum++;

    year_start++;

  }

  return 366*leapsum+365*(year - leapsum);

}

8. 编写一个函数,使给定的一个4 x 4的二维整型数组转置即行列互换 

参考程序代码如下:

#include

#define N 4

void convert(int arr4x4[][N])        /* 定义数组转置函数 */

{

  int i,j,temp;

  for (i=0;i

     for (j=i+1;j

      {

   temp=arr4x4[i][j];

   arr4x4[i][j]=arr4x4[j][i];

   arr4x4[j][i]=temp;

      }

}

void print(int arr4x4[][N])          /* 定义数组输出函数 */

{

 int i,j;

 for (i=0;i

    {

     for (j=0;j

   printf("%6d",arr4x4[i][j]);

     printf("\n");

    }

}

void main()

{

  int arr4x4[N][N];

  int i,j;

  printf("\n Input array4x4 :\n");

  for (i=0;i

    for (j=0;j

       scanf("%d",&arr4x4[i][j]);

  printf("\n The  original array is :\n");

print(arr4x4);                            /* 调用数组输出函数 */

  convert(arr4x4);                         /* 调用数组转置函数 */

  printf("\n The convert array is :\n");

  print(arr4x4);

}

9. 编写一个函数,使输入的一个字符串按反序存放,在主函数中输人和输出

字符串。

参考程序代码如下:

#include

#include

#define  N  80

void fanx(char s[])         /* 定义实现反序存放字符串的函数fanx() */

 {

  char len,temp;

  int i;

  len=strlen(s);                   /* 求字符串s的长度 */

  for (i=0;i<(strlen(s)/2);i++)

     {

      temp=s[i];

      s[i]=s[len-1];

      s[len-1]=temp;

      len--;

     }

 }

void main()

{

 char s[N];

 printf("\n Please input string:\n");

 scanf("%s",s);

 fanx(s);                       /* 以字符串数组 s为实参,调用fanx()函数 */

 printf("\n The  fanxu  string  is :\n %s\n",s);

}

10. 编写函数,将一个字符串中的元音字母复制到另一字符串,然后输出。

参考程序代码如下:

#include

#define N 80

void copy(char s1[],char s2[])            /* 定义复制元音字母函数copy() */

 {

  int i,j=0;

  for (i=0; s1[i]!='\0'; i++)

     if (s1[i]=='A'||s1[i]=='a'||s1[i]=='E'||s1[i]=='e'||s1[i]=='I'||

  s1[i]=='i'||s1[i]=='O'||s1[i]=='o'||s1[i]=='U'||s1[i]=='u')

     {

          s2[j]=s1[i]; j++;

     }

  s2[j]='\0';

 }

void main()

{

 char str1[N],str2[N];

 printf("\n Please input a string :\n");

 gets(str1);

 copy(str1,str2);                  /* 调用复制元音字母函数copy() */

 printf("\n The vowel letters of the string are:\n %s \n",str2);

}

11. 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格其他字符的个数,在主函数中输入字符串以及输出上述的结果。

参考程序代码如下:

#include

#define N 80

int letter,digit,space,other;              /* 说明全局变量 */

void statis(char s[])

{

 int i;

 for (i=0;s[i]!='\0';i++)

    if (( s[i]>='A' && s[i]<='Z')||(s[i]>='a'&& s[i]<='z')) letter++;

    else if (s[i]>='0' && s[i]<='9')digit++;

        else if (s[i]==32) space++;                /* 空格的ASCII码值为32 */

                  

            else  other++;

}

void main()

{

 char str[N];

 letter= digit= space= other=0;

 printf("\n Please input a string:\n");

 gets(str);

 printf("\n The string is :\n");

 puts(str);  

 statis(str);                             /* 调用函数statis()完成统计 */

 printf("\nLetter:%d\nDigit:%d\nSpace:%d\nOther:%d\n",letter,digit,space,other);

}

12. 编写一个函数,用起泡法对输入的10个字符按由小到大顺序排列。

参考程序代码如下:

#include

#include

#define N 10

void emit_sort(char s[])              /* 定义“起泡法”函数 */

{

 char temp;

 int i,j;

 for(i=1;i

    for (j=0;(j

      if(s[j]>s[j+1])

  {

       temp=s[j];

       s[j]=s[j+1];

   s[j+1]=temp;

  }

}

void main()

{

 char str[N];

 int i,flag=1;

 printf("\n Please input ten characters:\n");

 while(flag)                        

    {

     gets(str);                       /* 控制输入10个字符 */

     if (strlen(str)==N)flag=0;

     else  printf("\n Please input again(ten characters!):\n");

     }

 emit_sort(str);                       /* 调用“起泡法”函数 */

 printf("\n The sorted string is :\n");

 puts(str);                          /* 输出按由小到大顺序排列的10个字符 */

}

13. 用递归法将一个整数n转换成字符串。例如,输入 586,应输出字符串586n的位数不确定,可以是任意位数的整数。

参考程序代码如下:

#include

void cheng(long  n)              /* 定义函数cheng(),实现数字到字符的转换 */

{ long t;

  if ((t=n/10)!=0)

    cheng(t);                    /* 以 t 为实参直接递归调用cheng()函数* /

  printf("%c ",n % 10 + 48);     /* 48 是 0 的ASCII码值 */

}

void main()

{

  long intnum;                   /* 说明长整型变量,用来存放要转换的整数*/

  printf("\n Please input an integer: ");

  scanf("%ld",&intnum);

  printf("\n Chenged output: ");

  if (intnum<0)

    {

     printf("- ");

     intnum=-intnum;

    }

  cheng(intnum);                  /* 调用转换函数cheng()*/

}

14. 输入4个整数,找出其中最大的数。用函数的递归调用来处理

参考程序代码如下:

#include

long max2(long a,long b)            /* 定义从2个整数中找大数的函数max2()*/

{

 if( a > b ) return(a);

 else   return(b);

}

long max4(long n1,long n2,long n3,long n4) /* 定义4个数中找最大数函数max2()*/

{

 return(max2(max2(max2(n1,n2),n3),n4));  /* 直接递归调用max2()函数*/

}

void main()

{

 long int n1,n2,n3,n4,Max;

 printf("\n Please input 4 interger numbers:");

 scanf("%ld, %ld, %ld, %ld",&n1,&n2,&n3,&n4);

 Max=max4(n1,n2,n3,n4);                   /* 调用max4()函数*/

 printf("\nThe max= %ld \n",Max);

}

15.编写函数模拟汉诺塔游戏古代印度有一种游戏,游戏的装置是一块铜板,上面有3根杆子(假定分别称abC,在a杆上自下而上、由大到小顺序地串有64个金盘。游戏的目是把a杆上的金盘全部移到b杆上。条件是一次只能移动一个盘,可以借助ac杆;移动时不允许大盘在小盘的上面。

参考程序代码如下:

#include

void main()

{

 void hanoi(int n,char a,char b,char c);        /* 函数声明 */

 int m;

 printf("Input the number of diskes:");

 scanf("%d",&m);

 printf("The step to moving%3d diskes:\n",m);

 hanoi(m,'a','b','c');                          /* 函数调用  */

}

void hanoi(int n,char a,char b,char c)

{   

static int i=0;                                /* 定义静态局部变量 */

 if(n==1)

 printf("%d:   %d  %c -> %c\n",++i,n,a,b);

 else

    {

 hanoi(n -1,a,c,b);          /* 第一次直接递归调用hanoi()函数 */

 printf("%d:   %d  %c -> %c\n",++i,n,a,b);

 hanoi(n -1,c,b,a);          /* 第二次直接递归调用hanoi()函数 */

    }

}

16. 输入10个学生5门课的成绩,分别用函数实现下列功能:

      计算每个学生平均分;

      计算每门课的平均分;

      找出所有50个分数中最高的分数所对应的学生和课程

参考程序代码如下:

#include

#define M 10

#define N 5

float score[M][N],every_stu[M],every_cou[N];  /* 说明全局数组 */

int lin,col;                                  /* 说明全局变量 */

void stud_aver( )         /* 定义函数stud_aver(),计算每个学生的平均成绩 */

{

 int i,j;

 float s;

 for (i=0;i

     {

      for (j=0,s=0;j

          s+=score[i][j];

  every_stu[i]=s/N;

     }

 }

void scor_aver( )           /* 定义函数scor_aver(),计算每门课的平均分 */

{

 int i,j;

 float s;

 for (j=0;j

     {

      s=0;

  for (i=0;i

s+=score[i][j];

  every_cou[j]=s/M;

     }

 }

float Highest( )        /* 定义函数Highest(),求最高分及其属于哪个学生、哪门课 */

{

 float highest;

 int i,j;

 highest=score[0][0];

 for (i=0;i

     for (j=0;j

        if (score[i][j]>highest)

      {

           highest=score[i][j];

       lin=i+1;             /* 记录最高分的学生学号 */

       col=j+1;             /* 记录最高分的课程号 */

      }

 return(highest);

}

void main()

{ int i,j;

  float h;

  for (i=0;i

   {

printf("\nPlease input score of student%2d:\n",i+1);

    for (j=0;j

        scanf("%f",&score[i][j]);      /* 输入10个学生5门课的成绩单 */

   }

 stud_aver();                        /* 调用函数,计算每个学生的平均成绩 */

 scor_aver();                          /* 调用函数,计算每门课的平均分 */

 printf("\n  NO.     kech1   kech2   kech3   kech4   kech5   piju\n");

 for(i=0;i

   {

printf("\n NO %2d ",i+1);

    for(j=0;j

        printf("%8.2f",score[i][j]);    /* 输出每个学生每门课的分数*/

    printf("%8.2f\n", every_stu[i]);    /* 输出每个学生的平均成绩*/

   }

 printf("\nAverage:");

 for (j=0;j

     printf("%8.2f", every_cou[j]);      /* 输出每门课的平均分数*/

 printf("\n");

 h=Highest();

 printf("Highest:%7.2f   NO.%2d   Course %2d\n",h,lin,col);

}

17. 编写几个函数要求分别实现下列功能:

      输入10个职工的姓名和职工号;

      按职工号由小到大顺序排序,姓名顺序也随之调整;

      要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

参考程序代码如下:

#include

#include

#define N 10

char name[N][8];                    /* 说明全局数组 */

int  num[N];                       /* 说明全局数组 */

void SelectSort()                    /* 定义函数,采用直接选择法排序 */

{

 char tname[8];

 int i,j,k,temp;

 for (i=0;i

    {

     k =i;                         

     for (j=i;j

        if (num[k]>num[j])  k=j;   /* 用k 记录当前一轮选择中最小职工号的位置 */

     if (k!=i)

        {

         temp=num[i];           /* 以下6行实现:按职工号由小到大顺序排序 */

         strcpy(tname,name[i]);    /* 职工姓名的顺序也随之调整确 */

         num[i]=num[k];

         strcpy (name[i],name[k]);

         num[k]=temp;

         strcpy(name[k],tname);

        }

     }

  printf("\n The result is :\n");

  for (i=0;i

     printf("\n %5d%10s",num[i],name[i]);  /* 输出排序结果 */

}

void BinarySearch(int n)                  /* 定义函数,采用折半法进行查找 */

{

 int left,right,mid,sign;                   /* 用mid记录查找区间的中间位置 */

 left=0;                               /* 用left记录查找区间的左端位置 */

 right=N-1;                            /* 用right记录查找区间的右端位置 */

 sign=1;

 if ((nnum[N-1]))

printf("%d : not the number !\n",n);    /* 要查找的职工号不存在 */

 while((sign==1) && (left <= right))

     {

      mid=( left + right)/2;              /* 计算查找区间中间的位置 */

  if (n==num[mid])                /* 如果要查找的职工号在中间位置 */

    {

     printf("NO. %d , His name is : %s\n",n,name[mid]);/* 则输出该职工姓名*/

     sign=-1;

    }

 else if (n

         right=mid-1;          /* 则修改right值,到右半区继续查找*/

     else

         left=mid+1;           /*否则修改left 值,到左半区继续查找*/

}

   if (sign==1 || left>right)

      printf("Number %d :not been found!\n",n);   /* 查找不到该职工 */

}

void main()

{

 int number,flag=1;

 char ch;

 int i;

 printf("\n Please enter number and name of the woker:\n ");

 for (i=0;i

    {

     printf("Enter NO.: ");

     scanf("%d",&num[i]);

     printf("Enter name: ");

       gets(name[i]);

    }

 SelectSort();                              /* 调用排序函数 */

 while (flag)

    {

     printf("\nPlease enter number to look for:");

     scanf("%d",&number);                 /* 输入要查找的职工号 */ 

     BinarySearch(number);                 /* 调用查找函数 */

     printf("Continue search(Y/N)?");

 getchar();

 ch=getchar();

 if (ch=='N'||ch=='n') flag=0;

    }

}

你可能感兴趣的:(c语言)