计算机二级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];//该元素赋给n1xx[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:522    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该初始化为0for(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 stringBeijing
Shanghai
Tianjing
Nanjing
WuhanThe 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/数组元素个数Nfor(i=j=0; i<N; i++)if( x[i]>av ){
/**********found**********/y[__2__]=x[i]; x[i]=-1;}//先把数组x中大于平均数的元素存入数组y,并把数组x中这些元素赋为-1for(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.500000The 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:abs5def126jkm8The 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->EndThe 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!]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AlexNet,ZFNet详解

1 AlexNet 网络结构 对于AlexNet网络来说&#xff0c;因为当时资源环境受限&#xff0c;他从第一步卷积开始就把一个图像分到两个GPU上训练&#xff0c;然后中间进行组合最后进行融合成全连接成1000个置信度 1 得到一张3x224x224的图像&#xff0c;然后进行11x11的卷积&…

山海鲸智慧医疗解决方案:让医疗数据说话

在医疗领域&#xff0c;数据可视化对于提高诊疗效率、辅助医学研究和提升患者就医体验具有重要意义。作为山海鲸可视化软件的开发者&#xff0c;我们致力于利用先进的数据可视化技术&#xff0c;为医疗行业提供高效、智能的解决方案&#xff0c;本篇文章就带大家一起了解一下这…

【Linux】开始使用 vim 吧!!!

Linux 1 what is vim &#xff1f;2 vim基本概念3 vim的基本操作 &#xff01;3.1 vim的快捷方式3.1.1 复制与粘贴3.1.2 撤销与剪切3.1.3 字符操作 3.2 vim的光标操作3.3 vim的文件操作 总结Thanks♪(&#xff65;ω&#xff65;)&#xff89;感谢阅读下一篇文章见&#xff01;…

Power ModeII 插件的下载与使用-----idea

下载 Marketplace里面搜索下载即可 使用 下载后重启软件就可以用了 下面是一些关于Power ModeII &#xff0c;我的个性化设置截图 以及相关设置解释 插件或扩展的设置面板【用于给代码编辑器或集成开发环境&#xff08;IDE&#xff09;添加视觉效果】 主要设置 ENTER POWE…

数学知识第三期 欧拉函数

前言 相信大家在高中的时候接触过欧拉函数&#xff0c;希望大家通过本篇文章能够进一步理解欧拉函数&#xff01;&#xff01;&#xff01; 一、什么是欧拉函数&#xff1f; 欧拉函数是一个在数论中用于描述特定正整数的互质数的概念。具体来说&#xff0c;对于一个正整数n&…

华为机考入门python3--(0)模拟题3-计算字符串重新排列数

分类&#xff1a;排列组合 知识点&#xff1a; 计算字符串中每个字符出现的次数 Counter(string) 计算列表中每个元素出现的次数 Counter(list) 阶乘 math.factorial(num) 排列去重 题目来自【华为招聘模拟考试】 先把每个字符当成唯一出现过一次&#xff0c;计算所有排列…

keepalived+nginx双主热备(有问题私信)

keepalivednginx双主热备 前言keepalivednginx双主热备keepalivednginx双主热备部署安装nginx安装keepalived修改master节点的keepalived配置文件 修改backup节点的keeepalived配置文件配置keepalived主备配置keepalived双主热备 前言 有关keepalived和nginx的一些工作原理&am…

【论文笔记】《Learning Deconvolution Network for Semantic Segmentation》

重要说明&#xff1a;严格来说&#xff0c;论文所指的反卷积并不是真正的 deconvolution network 。 关于 deconvolution network 的详细介绍&#xff0c;请参考另一篇博客&#xff1a;什么是Deconvolutional Network&#xff1f; 一、参考资料 Learning Deconvolution Netwo…

【Leetcode】2861. 最大合金数

文章目录 题目思路代码结果 题目 题目链接 假设你是一家合金制造公司的老板&#xff0c;你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用&#xff0c;并且你可以使用 k 台机器来制造合金。每台机器都需要特定数量的每种金属来创建合金。 对于第 i 台…

【word visio绘图】关闭visio两线交叉的跳线(跨线)

【visio绘图】关闭visio两线交叉的跳线&#xff08;跨线&#xff09; 1 如何在Visio绘图中关闭visio两线交叉的跳线&#xff08;跨线&#xff09;第一步&#xff1a;打开Visio并创建您的图形第二步&#xff1a;绘制您的连接线第三步&#xff1a;关闭跳线第四步&#xff1a;手动…

dnSpy调试工具二次开发2-输出日志到控制台

本文在上一篇文章的基础上继续操作&#xff1a; dnSpy调试工具二次开发1-新增菜单-CSDN博客 经过阅读dnSpy的源码&#xff0c;发现dnSpy使用到的依赖注入用了MEF框架&#xff0c;所以在源码中可以看到接口服务类的上面都打上了Export的特性或在构造方法上面打上ImportingConst…

C/C++ - 类的封装特性

目录 类的封装 语法格式 声明定义 分文件 访问权限 类作用域 对象模型 构造函数 默认构造函数 带参构造函数 拷贝构造函数 构造函数重载 委托构造函数 初始数据列表 构造默认参数 构造函数删除 析构函数 析构函数概念 析构函数特性 析构函数示例 析构调用…

坚持刷题 | 平衡二叉树

文章目录 题目考察点代码实现实现总结对实现进一步改进扩展提问 坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天继续二叉树&#xff1a;平衡二叉树 题目 110.平衡二叉树 考察点 递归能力&#xff1a; 能否使用递归来解决问题。树的基本操作&#xff1a;能否正确地访…

DS:带头双向循环链表的实现(超详细!!)

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01;&#xff01; 博主的上篇文章介绍了链表&#xff0c;以及单链表的实现。 单链表的实现&#xff08;超详细&#xff01;&#xff01;&#xff09; 其实单链表的全称叫做不带头单向不循环链表&#xff0c;本文…

zabbix使用自动发现批量监控服务器

当有大量新增服务器需要监控时&#xff0c;为避免一台一台手动操作浪费人力&#xff0c;我们使用自动发现功能来进行操作&#xff1a; 以下以zabbix6.4.0版本为例 如下,点击自动发现&#xff0c;创建发现规则&#xff1a; 点击更新&#xff0c;保存&#xff0c;之后点告警---…

在 React 组件中使用 JSON 数据文件,怎么去读取请求数据呢?

要在 React 组件中使用 JSON 数据&#xff0c;有多种方法。 常用的有以下几种方法&#xff1a; 1、直接将 JSON 数据作为一个变量或常量引入组件中。 import jsonData from ./data.json;function MyComponent() {return (<div><h1>{jsonData.title}</h1>&…

node.js Redis SETNX命令实现分布式锁解决超卖/定时任务重复执行问题

Redis SETNX 特性 当然&#xff0c;让我们通过一个简单的例子&#xff0c;使用 Redis CLI&#xff08;命令行界面&#xff09;来模拟获取锁和释放锁的过程。 在此示例中&#xff0c;我将使用键“lock:tcaccount_[pk]”和“status:tcaccount_[pk]”分别表示锁定键和状态键。 获…

AAC解码算法原理

关于更多音视频开发内容&#xff0c;请参考专栏音视频开发 AAC&#xff08;Advanced Audio Coding&#xff09;是一种高级音频编码标准&#xff0c;它是一种十分流行的音频压缩格式&#xff0c;通常用于存储和传输音频数据。AAC提供了高音质和高压缩效率&#xff0c;广泛应用于…

Android源码设计模式解析与实战第2版笔记(四)

第三章 自由扩展你的项目–Builder 模式 Builder 模式的定义 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 Builder 模式的使用场景 相同的方法&#xff0c;不同的执行顺序&#xff0c;产生不同的事件结果时 多个部件或零件&…

Android 基础技术——Handler

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 Handler 为什么一个线程对应一个Looper&#xff1f; 核心&#xff1a;通过ThreadLocal保证 Looper.prepare的时候&#xff0c;ThreadLocal.get如果不空报异常&#xff1b;否则调用ThreadLocal.set,…