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

目录

    • 51.将参数num按升序插入到数组xx中
    • 52.在数组中找出两科成绩之和最高的学生并返回其在数组中的下标
    • 53.删除所有串长超过k的字符串,输出剩下的字符串
    • 54.根据所给的一组学生的成绩,计算出平均成绩,并计算低于平均成绩的学生的平均成绩
    • 55.将所指数组中大于平均值的数据移至数组的前部,小于等于平均值的数据移至x所指数组的后部
    • 56.在有n个元素的结构体数组std中,查找有一门或两门不及格科目的学生
    • 57.输出a所指数组中的前n个数据,要求每行输出5个数
    • 58.将形参s所指字符串中的数字字符转换成对应的数值计算出这些数值的累加和
    • 59.将带头结点的单向链表逆置
    • 60.将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序

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!]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354914.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python算法题集_找到字符串中所有字母异位词

本文为Python算法题集之一的代码示例 题目438&#xff1a;找到字符串中所有字母异位词 说明&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字…

【c++】高精度算法(洛谷刷题2024)玩具谜题详解(含图解)

系列文章目录 第三题&#xff1a;玩具谜题 视频讲解&#xff1a;http://【洛谷题单 - 算法 - 高精度】https://www.bilibili.com/video/BV1Ym4y1s7BD?vd_source66a11ab493493f42b08b31246a932bbb 文章目录 目录 系列文章目录 文章目录 前言 一、题目分析以及思考 二、代码…

查询redis路径,清除redis缓存

查询redis路径 1、执行ps -ef | grep redis 命令&#xff0c;结果如下&#xff08;记住PID&#xff09; 2、执行ps -u 系统用户名&#xff0c;进一步确定进程id, 我这里的系统用户名是root&#xff0c;执行ps -u root&#xff0c;结果如下&#xff1a; 结合1的操作结果图可知…

SERVLET生命周期API

SERVLET生命周期API 在servlet的生命周期中,将发生创建Servlet上下文、创建会话、向Servlet上下文添加属性等各种事件。在servlet的生命周期内发生事件时,Web容器将通知侦听器类。要接收事件的通知,侦听器类需要扩展Servlet API的侦听器接口。 1. 事件类型 servlet生命周期…

关于如何利用ChatGPT提高编程效率的

自从去年ChatGPT3.5推出以后&#xff0c;这一年时间在编程过程中我也在慢慢熟悉人工智能的使用&#xff0c;目前来看即使是免费的ChatGPT3.5对于编程效率的提升也是有很大帮助的&#xff0c;虽然在使用过程中确实出现了一些问题&#xff0c;本文记录下我的一些心得体会和用法。…

Peter算法小课堂—二叉堆(优先队列)

课前小视频&#xff1a;(7 封私信 / 62 条消息) 看动画&#xff0c;学算法&#xff0c;C实现建立二叉堆&#xff0c;优先队列和堆排序的基础 - 知乎 (zhihu.com) 二叉堆&#xff08;优先队列&#xff09; 大家想想&#xff0c;什么数据结构能做到插入&#xff08;删除&#x…

IDEA 构建开发环境

本博客主要讲解了如何创建一个Maven构建Java项目。&#xff08;本文是创建一个用Maven构建项目的方式&#xff0c;所以需要对Maven有一定的了解&#xff09; IDEA 构建开发环境 一、创建一个空工程二、构建一个普通的Maven模块 一、创建一个空工程 创建一个空的工程 * 设置整…

声音模拟训练

环境配置 参考文章&#xff1a; https://github.com/SUC-DriverOld/so-vits-svc-Chinese-Detaild-Documents 1:打开CMD nvidia-smi.exe 查询显卡 cuda VERSION:12.3 2:打开https://pytorch.org/get-started 我的系统是12.3 3&#xff1a;使用google 搜索 nvidia develope…

哈希概念 | 哈希函数 | 哈希冲突 | 哈希桶实现 | 哈希线性探测代码实现 | 闭散列 | 开散列 | 字符串哈希算法

文章目录 1.哈希概念2.哈希冲突3.解决哈希冲突3.1.闭散列3.2.开散列 4.字符串哈希算法 1.哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。如果一个顺序结构&am…

80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据1

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级Notice类获得背包基址-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;3be017de38c50653b…

BGP:04 fake-as

使用 fake-as 可以将本地真实的 AS 编号隐藏&#xff0c;其他 AS 内的对等体在指定本端对等体所在的AS 编号时&#xff0c;应该设置成这个伪AS 编号。 这是实验拓扑&#xff0c;IBGP EBGP 邻居都使用物理接口来建立 基本配置&#xff1a; R1: sys sysname R1 int loo0 ip add…

面了快手电商数据分析师岗(实习),被问的汗流浃背。。。。

最近技术群的一位同学&#xff0c;分享了他面试快手数据分析师岗(实习)的经验。我看了一下面试题&#xff0c;说实话内容不难&#xff0c;他直言没有认真准备。 今天整理后分享给大家&#xff0c;如果你对这块面试感兴趣&#xff0c;可以文末加入我们的面试、技术群 内容 1&…

时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测 Multihead-Attention-TCN-LSTM&#xff08;多头注意力-TCN-LSTM&#xff09;是一种结合了多个注意力机制、时序卷积网络&#xff08;TCN&#xff0…

解决方案|构建生物医学科技桥梁:镭速客户案例分享

随着生物科技在医学领域的快速发展&#xff0c;数据传输在实现医疗创新和科学研究中的重要性变得日益突出。数据不仅庞大&#xff0c;而且高度敏感&#xff0c;传统的数据传输方式已经无法满足医学行业对高效、快速的数据交流需求。 如今市场上备受关注的解决方案是基于UDP传输…

计算机毕业设计 基于SpringBoot的校园闲置物品交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【gmsh源码阅读】OCC对象绑定tag及获取几何与网格映射关系

一、Tag是什么&#xff1f; gmsh中的几何模型相对于OCC的模型增加了id编号&#xff0c;也叫tag&#xff0c;在gmsh中可以显示出来。在gmsh中&#xff0c;点、线、面、体都有Tag&#xff0c;以方便对其查找定位查找。在OCC中TopoDS_Shape只有几何与拓扑结构&#xff0c;没有唯一…

数据中心代理IP:最优性价比业务应用指南

数据中心代理IP在应对高速高并发的业务时&#xff0c;以独特的高速传输&#xff0c;游刃有余地应对多任务处理&#xff0c;适合于特定业务场景的高效加速。理性选用数据中心代理IP&#xff0c;可以为业务将迎来更加稳健和迅速的发展。今天&#xff0c;我们将揭示数据中心代理IP…

【Linux】分区向左扩容的方法

文章目录 为什么是向左扩容操作前的备份方法&#xff1a;启动盘试用Ubuntu后进行操作 为什么是向左扩容 Linux向右扩容非常简单&#xff0c;无论是系统自带的disks工具还是apt安装的gparted工具&#xff0c;都有图像化的界面可以操作。但是&#xff0c;都不支持向左扩容。笔者…

MC3172 串口模块

MC3172 支持12个串口对应关系如下 串口模块初始化 第一个是uart0~11 inpin RX 脚 管脚号 outpin TX脚 管脚号 baud 波特率 read_ptr ,数据读取指针 void uart_init(u32 uart_num,u8 in_pin,u8 out_pin,u32 baud,u8* read_ptr) {INTDEV_SET_CLK_RST(uart_num,(INTDEV_RUN|…

《动手学深度学习(PyTorch版)》笔记4.6

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…