计算机二级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.hqwc.cn/news/434770.html

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

相关文章

C语言指针数组的一篇补充

这段代码是我今早在想指针数组应该怎么去了解清楚的时候想到的一个代码&#xff0c;纠结了1半个多小时将代码理清楚&#xff0c;分享给大家看一下&#xff0c;对我最近发布的博文应该有一个补充帮助理解的作用。 对于这段代码的解释&#xff1a; 要正确理解指针数组是一个数组&…

直线拟合(支持任意维空间的直线拟合,附代码)

文章目录 一、问题描述二、推导步骤三、 M A T L A B MATLAB MATLAB代码 一、问题描述 给定一系列的三维空间点 ( x i , y i , z i ) , i 1 , 2 , . . . , n (x_i,y_i,z_i),i1,2,...,n (xi​,yi​,zi​),i1,2,...,n&#xff0c;拟合得到直线的方程。本文的直线拟合方法适用于任…

深度学习之处理多维特征的输入

我们首先来看一个糖尿病的数据集&#xff1a; 在数据集中&#xff0c;我们称每一行叫做sample&#xff0c;表示一个样本&#xff0c;称每一列是feature&#xff0c;也就是特征在数据库里面这就是一个关系表&#xff0c;每一行叫做记录&#xff0c;每一列叫做字段。 每一个样本都…

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

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

java关键字概述——final及常量概述

前言&#xff1a; 打好基础&#xff0c;daydayup! final final概述 final关键字是最终的意思&#xff0c;可以修饰&#xff08;类&#xff0c;方法&#xff0c;变量&#xff09; final作用 修饰类&#xff1a;该类被称为最终类&#xff0c;特点为不能被继承 修饰方法&#xff…

Git常用命令介绍

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目 一、Git的安装 安装包下载地址&#xff1a;https://gitforwindows.org/ 国内的镜像地址&#xff1a;https://npm.taobao.org/mirrors/git-for-windows/ 完成安装之后&#xff0c;在开…

fastapi学习

fastapi框架 fastapi&#xff0c;一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的web框架。 fastapi是建立在Starlette和Pydantic基础上的&#xff0c;Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工…

C#,数据检索算法之跳跃搜索(Jump Search)的源代码

数据检索算法是指从数据集合&#xff08;数组、表、哈希表等&#xff09;中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 本文提供跳跃搜索的源代码。 1 文本格式 using System; namespace Legalsoft.Truffer.Algorithm { public static class ArraySe…

3d导入的模型怎么缩小内存---模大狮模型网

要缩小导入的3D模型的内存占用&#xff0c;可以尝试以下方法&#xff1a; 优化模型&#xff1a;检查模型是否存在多余的面、顶点或边。通过删除重复的几何体、简化细节或使用优化算法&#xff0c;可以减少模型的复杂度&#xff0c;从而降低内存占用。 减少纹理贴图大小&#x…

无线路由探索

实验大纲 第一部分&#xff1a; 探索无线网络 步骤 1&#xff1a; 探索拓扑 步骤 2&#xff1a; 验证连接 第二部分&#xff1a; Wi-Fi 连接添加到董事会议室 步骤 1&#xff1a; 安装新的 LAP-PT 设备以覆盖新的董事会议室 步骤 2&#xff1a; 检验连接 第三部分&#…

redis过期事件监听、可以做延时任务 第二篇(简单)

在使用redis时&#xff0c;所有的key都要设置过期时间&#xff0c;过期之后&#xff0c;redis就会把对应的key清除掉。 此方法可以监听redis的key失效&#xff0c;在失效时做一些逻辑处理 redis过期监听 不像mq有保证 不推荐用来弄需要有保证的业务 现象&#xff1a; redis …

xshell无法连接linux,查询本机ip时出现<NO-CARRIER,BROADCAST,MULTICAST,UP>

在用xshell连接虚拟机VMware中的linux时&#xff0c;发现昨天还能连通的&#xff0c;今天连接不了了 我寻思应该是网卡配置出问题了&#xff0c;就去终端ip addr试了一下&#xff0c;果然发现问题&#xff0c;ip 查看网卡ens33就发现出现ens33:<NO-CARRIER,BROADCAST,MULTI…