请编写C程序,输入5个不同的且为字符格式的学生编号,将其先由大到小排序,再将最大的学生编号和最小的学生编号互换位置,然后输出此时5位学生的编号。 输Л 输入5位学生的编号(只含数字字、英文字母或空格)

二级指针+指针数组解决方案:

#include <stdio.h>
#include <string.h>
void swap(char **,char **);
int main(){
char *p[5];//开一个指针数组.
char str[5][50];//开一个字符数组(5行50列规格),与指针数组p对应
int i,j;
// printf("test_1\n");
for (i = 0;i<5;i++)
{
gets(str[i]);//向字符数组里填东西:(二维数组中的第i行的字符串)
p[i] = str[i];//让指针数组里的指针p[i]指向字符串的首地址str[i];
//printf("___________%s",p[i]);
}
//使得*p[]指针数组中最后的那个指针所指的那个元素被迭代为最小
//类似于冒泡
//if(*p[j] > *p[j-1] )//p[j-1]可以触及p[i];(虽然j无法于i相等)
//如果后指针所指的元素大于前指针所指的元素,那么交换这对相邻指针的指向关系
//最终,最大的那个元素将由最前面的那个指针所指向.那么隐去这一对指向关系后(p[0]----str_var(max))
//由j>=i+1来实现.(可以感受到冒泡思维,再各趟的"排序中" 遇到最大值之前,所作的所有swap操作都是没什么意义的)
for(i=0;i<5;i ++ )//外层循环变量除了可以用来控制循环的次数,还可以参与内部循环的条件控制.(双控变量)
{//冒泡
for(j=4;j>=i+1;j--)
{//!!比较字符串位置索引的前后j>i;j只需要到前推到i+1处即可,i处的元素由此时的j-1,来访问到,使之参与比较.
if(*p[j]>*p[j-1])
// if(p[j] > p[j-1] )//比较的是地址(int(十六进制)).而非地址所指的字符串本身(char).
//实际上就是*pointer.(这里的值是各个字符串)
//字符串的比较是计算机内部逐字符的比较,
//用户把他们简化的当作两个字符的比较的用法一样;
//这里再做一个额外的小区分:*p[j+1](对于str的行指针,指上(前)一个字符串首地址)和*p[j]+1(指这一字符串中的后面(下)一个字符);
{
//直接交换,而不设置最值角标中间变量,冒泡
swap(&p[j],&p[j-1]);//pointer.
//swap(*p[j],*p[j-1]);//*p[j]是字符串本身:即char 类型的变量.
}
}
}
printf("%s\n",p[4]);
for(i = 1;i < 4;i++)
{
printf("%s\n",p[i]);
}
printf("%s\n",p[0]);
}
void swap(char **a,char **b)//交换指向关系而已
{
char *t;
t = *a;//
*a = *b;
*b = t;
}
posted @   xuchaoxin1375  阅读(16)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示