请编写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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值