前言
本章讲解:二维数组每行最大值与首元素交换、删除结构体的重复项、取出单词首字母适用人群:
- 要参加C语言二级
- 中职学生
- 想提升C语言编程思维
- C语言学习者
一、程序填空 --- 二维数组每行最大值与首元素交换
难度:⭐
题目
函数 fun 的功能是:根据所给的二维数组,将二维数组每一行中的最大值,与该行中的第一个元素进行交换。
例如,如有二维数组:
51 27 44 50 99
74 58 28 62 84
45 75 71 97 76
51 35 72 67 46
91 34 42 73 32
则输出结果是:
99 27 44 50 51
84 58 28 62 74
97 75 71 45 76
72 35 51 67 46
91 34 42 73 32
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:源程序存放在 BLANK1.C 中。不得增行或删行,也不得更改程序的结构!
代码如下:
在1️⃣2️⃣3️⃣处填空
#include <stdio.h> #define N 5 void fun(int a[N][N]) { int i,j,k,t; for(i=0;i<N;i++) { /**********found**********/ ____1️⃣____; for(j=1;j<N;j++) /**********found**********/ if(a[i][j]>____2️⃣____) k=j; t=a[i][0]; a[i][0]=a[i][k]; /**********found**********/ ____3️⃣____ =t; } } main() { int i,j; int a[N][N]={ {51,27,44,50,99}, {74,58,28,62,84}, {45,75,71,97,76}, {51,35,72,67,46}, {91,34,42,73,32}}; fun(a); for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%3d",a[i][j]); printf("\n"); } }
分析
本题就是要找一行中最大的值,步骤如下:
- 假设每一行中的第一个为最大值
- 与同行其余值进行比较
- 找到最大值后进行交换
解答代码如下:
#include <stdio.h> #define N 5 void fun(int a[N][N]) { int i,j,k,t; for(i=0;i<N;i++) { /**********found**********/ //由下方代码可知 //这个k是控制列的 //所以先假设第一个是最大值 k = 1️⃣0; for(j=1;j<N;j++) /**********found**********/ //找一行的最大值 if(a[i][j] > 2️⃣a[i][k]) k=j; t=a[i][0]; a[i][0]=a[i][k]; /**********found**********/ //从上方两个语句可以知道这里是一个交换语句 3️⃣a[i][k]=t; } } main() { int i,j; int a[N][N]={ {51,27,44,50,99}, {74,58,28,62,84}, {45,75,71,97,76}, {51,35,72,67,46}, {91,34,42,73,32}}; fun(a); for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%3d",a[i][j]); printf("\n"); } }
知识点 --- 交换语句
这里要记住的是这个交换语句,例如:
int a = 1, b = 2; int t; t = a; a = b; b = t;
这样就实现了变量a与变量b的交换,这里有个技巧就是:
二、程序修改 --- 删除结构体的重复项
难度:⭐
题目
已知用户记录由账号和密码两项信息构成,N 名用户的数据已经存入结构体数组 a 中,函数 fun 的功能是:删除用户记录中账号重复的记录,如有多个重复账号记录,则保留第一个账号的用户记录。
请改正程序中的错误,使它能得到正确结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。
代码如下:
在代码中找出3个错误并修改
#include <stdio.h> #include <string.h> #define N 10 struct user{ char name[20]; char password[20]; }; int fun(struct user users[]) { int i=0,j,k; int n=N; while(i<n) { /**********found**********/ j=0; while(j<n) { if(strcmp(users[i].name,users[j].name)==0) { k=j; /**********found**********/ for(;k<n;k++) /**********found**********/ users[k]=users[k-1]; n--; } j++; } i++; } return n; } main() { int i,n=N; struct user users[N]={ {"zhang","skf"},{"li","kf123"},{"chen","df77dd"},{"zhang","tt186"}, {"ou","ou1236"},{"li","kk99qq"},{"sun","s9527"},{"guo","gg99"}, {"yu","qiqi11367"},{"li","ww8866"}}; printf("删除用户记录中账号重复的记录之前:\n"); for(i=0;i<n;i++) printf("%4d%20s%20s\n",i,users[i].name,users[i].password); printf("删除用户记录中账号重复的记录之后:\n"); n=fun(users); for(i=0;i<n;i++) printf("%4d%20s%20s\n",i,users[i].name,users[i].password); }
分析
删除结构体中的重复项,也还好理解,就是要注意第2空和第3空要一起来看
解答代码如下:
#include <stdio.h> #include <string.h> #define N 10 struct user{ char name[20]; char password[20]; }; int fun(struct user users[]) { int i=0,j,k; int n=N; while(i<n) { /**********found**********/ //由下面字符串对比可知 //j要从i的后一位开始 j=i+1; while(j<n) { if(strcmp(users[i].name,users[j].name)==0) { k=j; /**********found**********/ //由下方的赋值语句可知 //当前位置要被后一位赋值 //那么最后只要循环到倒数第二个就可以了 //也就是,倒数第一的赋值给倒数第二的位置 for(;k<n - 1;k++) /**********found**********/ users[k]=users[k+1]; n--; } j++; } i++; } return n; } main() { int i,n=N; struct user users[N]={ {"zhang","skf"},{"li","kf123"},{"chen","df77dd"},{"zhang","tt186"}, {"ou","ou1236"},{"li","kk99qq"},{"sun","s9527"},{"guo","gg99"}, {"yu","qiqi11367"},{"li","ww8866"}}; printf("删除用户记录中账号重复的记录之前:\n"); for(i=0;i<n;i++) printf("%4d%20s%20s\n",i,users[i].name,users[i].password); printf("删除用户记录中账号重复的记录之后:\n"); n=fun(users); for(i=0;i<n;i++) printf("%4d%20s%20s\n",i,users[i].name,users[i].password); }
三、程序设计 --- 取出单词首字母
难度:⭐⭐⭐
题目
请编写函数 fun,fun 的功能是按顺序将形参 a 所指的字符串中每个单词的第一个字母取出,依次存放到形参 b 所指的字符串中去。
形参 a 所指的字符串中的单词以一个或多个空格进行分隔,字符串首部和尾部可以有一个或多个空格
代码如下
在fun函数中编写
#include <stdio.h> #include <string.h> void fun(char *a,char *b) { } main() { char a[50],b[50]; gets(a); fun(a,b); puts(b); }
分析
之前做过一道类似的:程序设计:提取单词尾部元素
而这道题是提取单词的第一个字母
这题思路还是差不多的,就是反着来
- 先取第一个单词的首字母
- 循环判断,空格后面是否是字母
如果空格后面是字母,则表示为首部字母,就保存到b数组中
解答代码如下:
#include <stdio.h> #include <string.h> void fun(char *a,char *b) { int i = 0,j = 0; //考虑到第一个单词前面可能有空格 while( a[i] == ' ' ) i++; //因为第一个单词可以直接加 b[j++] = a[i]; while( a[i + 1] != '\0' ) { if(a[i] == ' ' && a[i+1] != ' ') { b[j++] = a[i + 1]; } i++; } b[j] = '\0'; } main() { char a[50],b[50]; gets(a); fun(a,b); puts(b); }
这里就是要注意,前面有空格的情况,使用while循环将空格跳过
希望这篇文章对您(* ̄︶ ̄)
专栏:二级C语言