计算机二级C语言的注意事项及相应真题-6-程序填空

51.将参数num按升序插入到数组xx中

给定程序BLANK1. C中,函数fun的作用是:参数xx的前10个元素已经按升序排好序,将参

数num按升序插入到数组xx中。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

BLANK1. C:

#include <stdio.h>

void func(int xx[], int num)
{
	int n1,n2,pos,i,j;
	pos=xx[9];//数组已经按升序排好序,那么pos也就是数组最大元素
	if (num > pos)//当num大于数组最大元素时,num也就是最大元素
/**********found**********/
		xx[10] = __(1)___;//故而num是最后一个元素
	else {
		for(i=0;i<10;i++)//遍历数组
		{
			if(xx[i]>num){//遍历到大于num的元素
				n1=xx[i];//该元素赋给n1
				xx[i]=num;//按升序插入数组
				for(j=i+1;j<11;j++){//后面的元素后移
					n2=xx[j];
					xx[j] = n1;
/**********found**********/
					_____(2)____;//交换赋值的形式,让元素一个接一个往后移
				}
/**********found**********/
				_____(3)_____;//num已经插入数组,后面的元素也后移完了,直接跳出
			}
		}
	}
}

int main()
{
	int xx[11] = {2,5,7,10,17,51,63,73,85,99};
	int i,num;
	printf("original array is:\n");
	for(i=0;i<10;i++) printf("%5d",xx[i]);
	printf("\n");
	printf("insert a new number:");
	scanf("%d", &num);
	func(xx, num);
	for(i=0;i<11;i++) printf("%5d", xx[i]);
	printf("\n");
	return 0;
}

解题思路:
在有序数组里按原来的顺序插入数据

答案:

#include <stdio.h>

void func(int xx[], int num)
{
	int n1,n2,pos,i,j;
	pos=xx[9];
	if (num > pos)
/**********found**********/
		xx[10] = num;
	else {
		for(i=0;i<10;i++)
		{
			if(xx[i]>num){
				n1=xx[i];
				xx[i]=num;
				for(j=i+1;j<11;j++){
					n2=xx[j];
					xx[j] = n1;
/**********found**********/
					n1=n2;
				}
/**********found**********/
				break;
			}
		}
	}
}

int main()
{
	int xx[11] = {2,5,7,10,17,51,63,73,85,99};
	int i,num;
	printf("original array is:\n");
	for(i=0;i<10;i++) printf("%5d",xx[i]);
	printf("\n");
	printf("insert a new number:");
	scanf("%d", &num);
	func(xx, num);
	for(i=0;i<11;i++) printf("%5d", xx[i]);
	printf("\n");
	return 0;
}

测试:

换了个编译器,顺眼多了


original array is:
    2    5    7   10   17   51   63   73   85   99
insert a new number:52
    2    5    7   10   17   51   52   63   73   85   99

52.在数组中找出两科成绩之和最高的学生并返回其在数组中的下标

给定程序BLANK1.C中,函数fun的功能是在数组中找出两科成绩之和最高的学生并返回其

在数组中的下标。对所给函数int fun(STU *d, int n),主函数传给形参d的是学生数组名,而

传给形参n的是该数组中学生的个数。

例如:若学生数组数据为:2016500301李清水83 92

2016500336刘世才85 94

2016500371王子晨88 88

则调用该函数后,程序输出为: 2016500336 刘世才85 94

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include<stdio.h>
typedef struct stu
{
	char ID[30];
	char name[20];
	int score[2];
} STU;
int fun(STU *d,int n)
{
	int i,m;
	/******found******/
	______(1)______;//我们要遍历结构体数组,然后比较,比较后大的赋给m,m该初始化为0
	for(i=1;i<n;i++)//遍历结构体数组
	/******found******/
		if(d[i].score[0]+d[i].score[1]>________(2)________)//大于下标为m的进入该if分支
			m=i;
	/******found******/
	______(3)______;//返回两科成绩之和最高的学生的数组下标
}

void main()
{
	STU a[10]={ "2016500301","李清水",83,92,"2016500336","刘世才",85,94,"2016500371","王子晨",88,88};//创建结构体数组
	int i,n=3;
	i=fun(a,n);
	printf("%30s%20s%4d%4d",a[i].ID,a[i].name,a[i].score[0],a[i].score[1]);
	printf("\n");
}

解题思路:
考查对结构体数组的调用,没什么难点( ̄_, ̄ )

答案:

#include<stdio.h>
typedef struct stu
{
	char ID[30];
	char name[20];
	int score[2];
} STU;
int fun(STU *d,int n)
{
	int i,m;
	/******found******/
	m=0;
	for(i=1;i<n;i++)
	/******found******/
		if(d[i].score[0]+d[i].score[1]>d[m].score[0]+d[m].score[1])
			m=i;
	/******found******/
	return m;
}

void main()
{
	STU a[10]={ "2016500301","李清水",83,92,"2016500336","刘世才",85,94,"2016500371","王子晨",88,88};
	int i,n=3;
	i=fun(a,n);
	printf("%30s%20s%4d%4d",a[i].ID,a[i].name,a[i].score[0],a[i].score[1]);
	printf("\n");
}

测试:

                    2016500336           刘世才  85  94


53.删除所有串长超过k的字符串,输出剩下的字符串

给定程序中,函数fun的功能是:在形参ss所指字符串数组中,删除所有串长超过k的字符串,函数返回所剩字符串的个数。ss所指字符串数组中共有N个字符串,且串长小于M。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#include  <string.h>
#define   N   5
#define   M   10
int fun(char  (*ss)[M], int  k)
{ int  i,j=0,len;
/**********found**********/
  for(i=0; i< __1__ ; i++)//遍历所有字符串,一个字符串为一行
  {  len=strlen(ss[i]);
/**********found**********/
     if(len<= __2__)//第二空要先弄明白第三个空
/**********found**********/
        strcpy(ss[j++],__3__);//可以看出j是计数串长不超过k的字符串,在main函数可以看到只输出了前f(j)个字符串,也就是这前f(j)个字符串都是不超过k的字符串,
  }
  return  j;//返回串长不超过k的字符串数
}
main()
{ char  x[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"};
  int  i,f;
  printf("\nThe original string\n\n");
  for(i=0;i<N;i++)puts(x[i]);  printf("\n");
  f=fun(x,7);
  printf("The string witch length is less than or equal to 7 :\n");
  for(i=0; i<f; i++)  puts(x[i]);printf("\n");
  getchar();
}

解题思路:
题目说删除串长超过k的字符串,其实就是只输出串长不超过k的字符串

题目中fun函数就是把串长没超过k的字符串存储在前面,然后输出

答案:

#include  <stdio.h>
#include  <string.h>
#define   N   5
#define   M   10
int fun(char  (*ss)[M], int  k)
{ int  i,j=0,len;
/**********found**********/
  for(i=0; i< N ; i++)
  {  len=strlen(ss[i]);
/**********found**********/
     if(len<= k)
/**********found**********/
        strcpy(ss[j++],ss[i]);
  }
  return  j;
}
main()
{ char  x[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"};
  int  i,f;
  printf("\nThe original string\n\n");
  for(i=0;i<N;i++)puts(x[i]);  printf("\n");
  f=fun(x,7);
  printf("The string witch length is less than or equal to 7 :\n");
  for(i=0; i<f; i++)  puts(x[i]);printf("\n");
  getchar();
}

测试:


The original string

Beijing
Shanghai
Tianjing
Nanjing
Wuhan

The string witch length is less than or equal to 7 :
Beijing
Nanjing
Wuhan



54.根据所给的一组学生的成绩,计算出平均成绩,并计算低于平均成绩的学生的平均成绩

给定程序BLANK1. C中,函数fun的功能是:根据所给的一组学生的成绩,计算出平均成

绩,并计算低于平均成绩的学生的平均成绩作为函数值返回。

例如:如有成绩为: 50, 60, 70, 80, 90, 100, 55, 65, 75, 85, 95, 99,

则运行结果应为:62.500000

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构!

BLANK1. C:

#include <stdio.h>
double fun(double x[], int n)
{
	int i,k=0;
	double avg = 0.0,sum=0.0;
	for(i=0;i<n;i++)
/***********found**********/
		avg+=___(1)___;//所有学生成绩总和
/***********found**********/
	___(2)___/=n;//学生成绩平均分
	for(i=0;i<n;i++)
		if(x[i]<avg)//小于学生成绩平均分的
		{
/***********found**********/
			___(3)___+=x[i];//统计小于成绩平均分的
			k++;//小于学生成绩平均分人数
		}
	return sum/k;//返回低于平均成绩的学生的平均成绩
}
main()
{
	double score[12]={50,60,70,80,90,100,55,65,75,85,95,99};
	double aa;
	aa=fun(score,12);
	printf("%f\n",aa);
}

解题思路:
之前做过一样的题,不过空变了位置(‾◡◝)

答案:

#include <stdio.h>
double fun(double x[], int n)
{
	int i,k=0;
	double avg = 0.0,sum=0.0;
	for(i=0;i<n;i++)
/***********found**********/
		avg+=x[i];
/***********found**********/
	avg/=n;
	for(i=0;i<n;i++)
		if(x[i]<avg)
		{
/***********found**********/
			sum+=x[i];
			k++;
		}
	return sum/k;
}
main()
{
	double score[12]={50,60,70,80,90,100,55,65,75,85,95,99};
	double aa;
	aa=fun(score,12);
	printf("%f\n",aa);
}

测试:

62.500000


55.将所指数组中大于平均值的数据移至数组的前部,小于等于平均值的数据移至x所指数组的后部

给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),将所指数组中大于平均值的数据移至数组的前部,小于等于平均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。

例如,有10个正数:46 30 3240 6 17 45 15 48 26,平均值为:30.500000

移动后的输出为:46 32 40 45 48 30 6 17 15 26

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdlib.h>
#include  <stdio.h>
#define   N   10
double fun(double  *x)
{ int  i, j;    double  s, av, y[N];
  s=0;
  for(i=0; i<N; i++)  s=s+x[i];//可见s是数组所有元素和
/**********found**********/
  av=__1__;//求平均值,就是数组所有元素和s/数组元素个数N
  for(i=j=0; i<N; i++)
    if( x[i]>av ){
/**********found**********/
      y[__2__]=x[i]; x[i]=-1;}//先把数组x中大于平均数的元素存入数组y,并把数组x中这些元素赋为-1
  for(i=0; i<N; i++)
/**********found**********/
    if( x[i]!= __3__) y[j++]=x[i];//前面的把元素变为-1,就是为了区分出小于平均数的元素
  for(i=0; i<N; i++)x[i] = y[i];
  return  av;
}
main()
{ int  i;     double  x[N]= {46,30,32,40,6,17,45,15,48,26};
  for(i=0; i<N; i++) printf("%4.0f ",x[i]);
  printf("\n");
  printf("\nThe average is: %f\n",fun(x));
  printf("\nThe result :\n",fun(x));
  for(i=0; i<N; i++)  printf("%5.0f ",x[i]);
  printf("\n");
  getchar();
}

解题思路:
题目代码的思路是先用数组y存储数组x大于平均数的元素,并把这些元素赋为-1,以此区分小于平均数的元素,再把小于平均数的元素接在数组y的末尾存入,最后再把数组y中元素赋给数组x

这道题前面也有一样的,只是空变了╰(°▽°)╯

答案:

#include  <stdlib.h>
#include  <stdio.h>
#define   N   10
double fun(double  *x)
{ int  i, j;    double  s, av, y[N];
  s=0;
  for(i=0; i<N; i++)  s=s+x[i];
/**********found**********/
  av=s/N;
  for(i=j=0; i<N; i++)
    if( x[i]>av ){
/**********found**********/
      y[j++]=x[i]; x[i]=-1;}
  for(i=0; i<N; i++)
/**********found**********/
    if( x[i]!= -1) y[j++]=x[i];
  for(i=0; i<N; i++)x[i] = y[i];
  return  av;
}
main()
{ int  i;     double  x[N]= {46,30,32,40,6,17,45,15,48,26};
  for(i=0; i<N; i++) printf("%4.0f ",x[i]);
  printf("\n");
  printf("\nThe average is: %f\n",fun(x));
  printf("\nThe result :\n",fun(x));
  for(i=0; i<N; i++)  printf("%5.0f ",x[i]);
  printf("\n");
  getchar();
}

测试:
不用疑惑这输出怎么是无序的,可以回头再看一遍代码,并没有做排序处理

  46   30   32   40    6   17   45   15   48   26 

The average is: 30.500000

The result :
   46    32    40    45    48    30     6    17    15    26 


56.在有n个元素的结构体数组std中,查找有一门或两门不及格科目的学生

函数fun的功能是:在有n个元素的结构体数组std中,查找有一门或两门不及格科目的学生,找到后输出学生的学号;函数的返回值是有不及格科目的学生人数。例如,主函数中给出了4名学生的数据,则程序运行的结果为;

学号:N1002 学号:N1006

共有2位学生有不及格科目

请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
typedef struct
{ char num[8];     /* 学号 */
  double score[2]; /* 两门课成绩 */
/**********found**********/
} __(1)__ ;//这个是定义的结构体类型的名称,往后面看想必很清楚了
int  fun(STU  std[ ], int  n)
{  int  i, k=0;
   for(i=0; i<n; i++)
/**********found**********/
     if( (std[i].score[0]<60) __(2)__ (std[i].score[1]<60) ) //查找一门或两门不及格
     { k++;     printf("学号:%s ",std[i].num);   }//k是不及格学生人数
/**********found**********/
   return __(3)__ ;//返回不及格学生人数
}
main()
{  STU  std[4]={ "N1001", 76.5,82.0 ,"N1002", 53.5,73.0, 
                "N1005", 80.5,66.0,"N1006", 81.0,56.0 };
  printf( "\n共有%d位学生有不及格科目\n" , fun(std,4) );
  getchar();
}

解题思路:
&&: 且
|| :或

STU 是通过 typedef 关键字定义的结构体类型的别名。

答案:

#include  <stdio.h>
typedef struct
{ char num[8];     /* 学号 */
  double score[2]; /* 两门课成绩 */
/**********found**********/
} STU ;
int  fun(STU  std[ ], int  n)
{  int  i, k=0;
   for(i=0; i<n; i++)
/**********found**********/
     if( (std[i].score[0]<60) || (std[i].score[1]<60) ) 
     { k++;     printf("学号:%s ",std[i].num);   }
/**********found**********/
   return k ;
}
main()
{  STU  std[4]={ "N1001", 76.5,82.0 ,"N1002", 53.5,73.0, 
                "N1005", 80.5,66.0,"N1006", 81.0,56.0 };
  printf( "\n共有%d位学生有不及格科目\n" , fun(std,4) );
  getchar();
}

测试:

学号:N1002 学号:N1006 
共有2位学生有不及格科目


57.输出a所指数组中的前n个数据,要求每行输出5个数

函数fun的功能是:输出a所指数组中的前n个数据,要求每行输出5个数。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#include  <stdlib.h>
void fun( int *a,  int n )
{  int  i;
   for(i=0; i<n; i++)//遍历输出数组前n个元素
   {
/**********found**********/
     if( ___1___==0 )//要求每一行输出5个数,也就是每输出完5个数,需要输出一个换行符\n,i就是输出元素个数,也就是当i为5的倍数,就要输出一个换行符
/**********found**********/
           printf("___2___");//这里结合第一个空看,显然是输出换行符
/**********found**********/
      printf("%d  ",___3___);//这里很简单,肯定是输出数组元素
   }
}
main()
{  int  a[100]={0}, i,n;
   n=22;
   for(i=0; i<n;i++) a[i]=rand()%21;//数据由随机数获取
   fun( a, n);
   printf("\n");
  getchar();
}

解题思路:
这题不是很严谨,答案第一个空是i%5,如果第一个空只是填 i%5,那么在一开始就会输出一个换行,为了避免这种情况,要加一个&&i!=0

rand() :随机数函数,
rand()%(n-m+1)+m //取值范围为[m,n]

答案:

#include  <stdio.h>
#include  <stdlib.h>
void fun( int *a,  int n )
{  int  i;
   for(i=0; i<n; i++)
   {
/**********found**********/
     if( i!=0&&i%5==0 )//这样才算是正确答案
/**********found**********/
           printf("\n");
/**********found**********/
      printf("%d  ",a[i]);
   }
}
main()
{  int  a[100]={0}, i,n;
   n=22;
   for(i=0; i<n;i++) a[i]=rand()%21;
   fun( a, n);
   printf("\n");
  getchar();
}

测试:

1  4  9  19  8  
10  10  9  15  10  
2  19  20  4  20  
7  3  15  16  16  
17  14  


58.将形参s所指字符串中的数字字符转换成对应的数值计算出这些数值的累加和

给定程序中,函数fun的功能是:将形参s所指字符串中的数字字符转换成对应的数值计算出这些数值的累加和作为函数值返回。

例如,形参s所指的字符串为: abs5def126jkm8,程序执行后的输出结果为:22.

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#include  <string.h>
#include  <ctype.h>
int fun(char  *s)
{ int  sum=0;//数值累加和
  while(*s) {//遍历字符串
/**********found**********/
    if( isdigit(*s) )  sum+= *s- __1__ ;//判断数字字符函数isdigit(),数字字符转化为整数要减去字符'0'
/**********found**********/
    __2__;//指针后移
  }
/**********found**********/
  return  __3__ ;//返回数值累加和
}
main()
{ char  s[81];    int  n;
  printf("\nEnter a string:\n\n");  gets(s);
  n=fun(s);
  printf("\nThe result is:  %d\n\n",n);
  getchar();
}

解题思路:

int isdigit(char c) //检查所传的字符是否是十进制数字字符。

字符’0’的ASCII码是49

答案:

#include  <stdio.h>
#include  <string.h>
#include  <ctype.h>
int fun(char  *s)
{ int  sum=0;
  while(*s) {
/**********found**********/
    if( isdigit(*s) )  sum+= *s- '0' ;
/**********found**********/
    s++;
  }
/**********found**********/
  return  sum ;
}
main()
{ char  s[81];    int  n;
  printf("\nEnter a string:\n\n");  gets(s);
  n=fun(s);
  printf("\nThe result is:  %d\n\n",n);
  getchar();
}

测试:


Enter a string:

abs5def126jkm8

The result is:  22


59.将带头结点的单向链表逆置

给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为: 2、4、6、8、10,逆置后,从头至尾结点数据域依次为:10、8、6、4、2。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#include  <stdlib.h>
#define    N    5
typedef struct node {
  int  data;
  struct node  *next;
} NODE;
void fun(NODE  *h)
{ NODE  *p, *q, *r;
/**********found**********/
  p = h->__1__;//头节点也就是链表的开头,不会被改变位置,不参与排序,一般也不存放数据,把p初始化为头节点后的第一个节点
/**********found**********/
  if (p==__2__)  return;//链表为空时
  q = p->next;//q设为p的下一个节点
  p->next = NULL;//经过排序后,这个时候p所指的节点会排到链表的末尾,后面没有节点了
  while (q)//遍历链表
  {  r = q->next;    q->next = p;//r存q的下一节点,后一句是将节点q移至p的前面
/**********found**********/
     p = q;          q = __3__;//前一句是把p节点变为q节点,遍历链表是指针q的后移,前面的r就是为了现在赋给q节点,实现q节点的后移
  }
  h->next = p;//最后p所指的节点会是第一个节点,第一个节点得是头节点的下一个节点
}
NODE *creatlist(int  a[])//创建链表
{  NODE  *h,*p,*q;        int  i;
  h = (NODE *)malloc(sizeof(NODE));//开辟空间,创建节点
  h->next = NULL;//现在是刚开始创建链表的时候,头节点初始化
  for(i=0; i<N; i++)
  {  q=(NODE *)malloc(sizeof(NODE));//开辟空间,创建节点
     q->data=a[i];//存入数据
     q->next = NULL;//下一节点为空
     if (h->next == NULL)  h->next = p = q;//当头节点下一节点(也就是第一个节点)为空时,把q节点赋给p,再把p置为第一个节点
     else    {  p->next = q;  p = q;   }//不为空时,把q置为p的下一个节点,再把q节点赋给p
  }
   return  h;
}
void outlist(NODE  *h)//输出链表
{ NODE  *p;
  p = h->next;//p为第一个节点
  if (p==NULL)  printf("The list is NULL!\n");
  else
  {  printf("\nHead  ");
     do
     {  printf("->%d", p->data); p=p->next;  }//p指向下一个节点
     while(p!=NULL);//到指向节点为空时,跳出循环
     printf("->End\n");
  }
}
main()
{  NODE  *head;
   int  a[N]={2,4,6,8,10};
   head=creatlist(a);
   printf("\nThe original list:\n");
   outlist(head);
   fun(head);
   printf("\nThe list after inverting :\n");
   outlist(head);
  getchar();
}

解题思路:
给张图理下fun函数的循环:

只演示了两次循环,应该很清楚了

while循环的排序只理了从第一个节点到最后一个节点的指向顺序,在while循环结束后,头节点的下一个节点仍然是一开始那个数据域为2的节点,所以最后有一句 h->next = p; 把经过排序后的第一个节点置为头节点的下一个节点

答案:

#include  <stdio.h>
#include  <stdlib.h>
#define    N    5
typedef struct node {
  int  data;
  struct node  *next;
} NODE;
void fun(NODE  *h)
{ NODE  *p, *q, *r;
/**********found**********/
  p = h->next;
/**********found**********/
  if (p==NULL)  return;
  q = p->next;
  p->next = NULL;
  while (q)
  {  r = q->next;    q->next = p;
/**********found**********/
     p = q;          q = r;
  }
  h->next = p;
}
NODE *creatlist(int  a[])
{  NODE  *h,*p,*q;        int  i;
  h = (NODE *)malloc(sizeof(NODE));
  h->next = NULL;
  for(i=0; i<N; i++)
  {  q=(NODE *)malloc(sizeof(NODE));
     q->data=a[i];
     q->next = NULL;
     if (h->next == NULL)  h->next = p = q;
     else    {  p->next = q;  p = q;   }
  }
   return  h;
}
void outlist(NODE  *h)
{ NODE  *p;
  p = h->next;
  if (p==NULL)  printf("The list is NULL!\n");
  else
  {  printf("\nHead  ");
     do
     {  printf("->%d", p->data); p=p->next;  }
     while(p!=NULL);
     printf("->End\n");
  }
}
main()
{  NODE  *head;
   int  a[N]={2,4,6,8,10};
   head=creatlist(a);
   printf("\nThe original list:\n");
   outlist(head);
   fun(head);
   printf("\nThe list after inverting :\n");
   outlist(head);
  getchar();
}

测试:


The original list:

Head  ->2->4->6->8->10->End

The list after inverting :

Head  ->10->8->6->4->2->End


60.将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序

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

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

BLANK1.C:

#include  <stdio.h>
#include  <string.h>
struct student {
  long  sno;
  char  name[10];
  float  score[3];
};
void fun(struct student  a[], int  n)
{
/**********found**********/
 __1__ t;//可以看到下面t被用在结构体变量的交换赋值,所以t也必然是结构体变量
  int  i, j;
/**********found**********/
  for (i=0; i<__2__; i++)//要遍历结构体数组,用的是选择排序的思路
    for (j=i+1; j<n; j++)
/**********found**********/
      if (strcmp(__3__) > 0)//比较字符串
      {  t = a[i];   a[i] = a[j];  a[j] = t;  }
}
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;
  printf("\n\nThe original data :\n\n");
  for (j=0; j<4; j++)
  {  printf("\nNo: %ld  Name: %-8s      Scores:  ",s[j].sno, s[j].name);// %-8s 就是占8个格子,靠左对齐
     for (i=0; i<3; i++)  printf("%6.2f ", s[j].score[i]);
     printf("\n");
  }
  fun(s, 4);
  printf("\n\nThe data after sorting :\n\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");
  }
  getchar();
}

解题思路:

对代码出现的函数做下简单介绍:

int strcmp(const char *str1, const char *str2) //把 str1 所指向的字符串和 str2 所指向的字符串进行比较,比较是自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。

该函数返回值如下:

如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。

答案:

#include  <stdio.h>
#include  <string.h>
struct student {
  long  sno;
  char  name[10];
  float  score[3];
};
void fun(struct student  a[], int  n)
{
/**********found**********/
 struct student t;
  int  i, j;
/**********found**********/
  for (i=0; i<n-1; i++)
    for (j=i+1; j<n; j++)
/**********found**********/
      if (strcmp(a[i].name,a[j].name) > 0)
      {  t = a[i];   a[i] = a[j];  a[j] = t;  }
}
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;
  printf("\n\nThe original data :\n\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");
  }
  fun(s, 4);
  printf("\n\nThe data after sorting :\n\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");
  }
  getchar();
}

测试:



The original data :


No: 10001  Name: ZhangSan      Scores:   95.00  80.00  88.00 

No: 10002  Name: LiSi          Scores:   85.00  70.00  78.00 

No: 10003  Name: CaoKai        Scores:   75.00  60.00  88.00 

No: 10004  Name: FangFang      Scores:   90.00  82.00  87.00 


The data after sorting :


No: 10003  Name: CaoKai        Scores:   75.00  60.00  88.00 

No: 10004  Name: FangFang      Scores:   90.00  82.00  87.00 

No: 10002  Name: LiSi          Scores:   85.00  70.00  78.00 

No: 10001  Name: ZhangSan      Scores:   95.00  80.00  88.00 


暂时程序填空算更新完了,接下来更新程序修改了<( ̄︶ ̄)↗[GO!]

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值