首页 > 其他分享 >C语言练习之姓名排序

C语言练习之姓名排序

时间:2025-01-14 20:33:43浏览次数:3  
标签:name int void 练习 C语言 char 数组 排序 输入

 从今天开始,练习题的博客都会迎来一个升级,我们会注意更多细节,让这个程序尽可能的完善(尽可能想象到千奇百怪的输入,比如让输个数偏输入个字母的),尽量走向实际应用

题干

请设计一个程序,输入用户指定的数量的名字,然后根据名字长度排序,按长度由大到小进行输出

思路

名字长度排序(数组排序)-->选择、冒泡

指定数量名字并且可以用循环修改-->指针数组(二位字符串数组)

 内存分配把指针数组的指针变成可以存东西的东西-->动态内存

(狠狠引流)

我们先把简单的名字输入以及指针数组的内存动态分配写出来,看了这些博客应该不难想了

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Namelength 30

void Get_name(char *p[],int n);
void Put_name(char *p[],int n);
void Sort_name(char *p[],int n);

int main()
{
    char *name[20];
    int n;
    printf("Enter the number of names:");
    if (scanf("%d", &n) != 1) 
    {
        // 输入不是一个整数
        printf("Input is not an integer. Exiting program.\n");
        return 1; // 异常终止
    }
    getchar();
    Get_name(name,n);
    Put_name(name,n);
    //Sort_name(name,n);
    return 0;
}

void Get_name(char *p[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("Enter name No.%d:",i+1);
        p[i] = (char*)malloc(Namelength*sizeof(char));
        fgets(p[i],Namelength,stdin);
    }
}

void Put_name(char *p[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%s",p[i]);
    }
}

这里顺手写个输出的检查一下,不要说写的时候一点不检查最后一堆bug拼在一起(简直是地狱)

这里还有一个限制输入的小技巧,或者说一个知识点

scanf()函数也有结果

如果输入类型匹配 “ ” 里面的东西(比如“%d”),那么scanf()函数值会等于1(也就是真),否则为0(假)  

所以就可以这么写(return 1也是截止,不会有什么实际效果,但是会相当于给其他程序员一个标注代表没有正常终止)

if (scanf("%d", &n) != 1) 
    {
        // 输入不是一个整数
        printf("Input is not an integer. Exiting program.\n");
        return 1; // 异常终止
    }

if括号里面的东西是从左到右执行的,所以if括号外面不需要再来一句scanf()了(执行过了)

可以正常运行,接下来开始数组排序(这里用冒泡),但是之前都是int类型数组排序,这个字符串数组排序有什么变化吗?

还真有,就是等号需要和中间量变一变,变成字符串函数操作以及分配了空间的内容为空的字符串数组

void Sort_name(char *p[],int n)
{
    for(int i=0;i<n-1;i++)
    {
        for(int j=0;j<n-1-i;j++)
        {
            if(strlen(p[j])<strlen(p[j+1]))
            {
                char temp[Namelength] = "";     //有空间但是内容为空
                strcpy(temp,p[j]);              //原先的等号变成拷贝
                strcpy(p[j],p[j+1]);
                strcpy(p[j+1],temp);
            }
        }
    }
}

按照冒泡法写的,但是注意原先的等号变成了拷贝 

然后再修改一下打印的函数

void Put_name(char *p[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("第%d长的名字是%s",i+1,p[i]);
    }
}

再调整一下main函数,最后结果就是这个

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Namelength 30

void Get_name(char *p[],int n);
void Put_name(char *p[],int n);
void Sort_name(char *p[],int n);

int main()
{
    char *name[20];
    int n;
  
    printf("Enter the number of names:");
    
    if (scanf("%d", &n) != 1) 
    {
        // 输入不是一个整数
        printf("Input is not an integer. Exiting program.\n");
        return 1; // 异常终止
    }
    getchar();
    Get_name(name,n);
    Sort_name(name,n);
    Put_name(name,n);
    return 0;
}

void Get_name(char *p[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("Enter name No.%d:",i+1);
        p[i] = (char*)malloc(Namelength*sizeof(char));
        fgets(p[i],Namelength,stdin);
    }
}

void Put_name(char *p[],int n)
{
    for(int i=0;i<n;i++)
    {
        printf("第%d长的名字是%s",i+1,p[i]);
    }
}

void Sort_name(char *p[],int n)
{
    for(int i=0;i<n-1;i++)
    {
        for(int j=0;j<n-1-i;j++)
        {
            if(strlen(p[j])<strlen(p[j+1]))
            {
                char temp[Namelength] = "";     //有空间但是内容为空
                strcpy(temp,p[j]);              //原先的等号变成拷贝
                strcpy(p[j],p[j+1]);
                strcpy(p[j+1],temp);
            }
        }
    }
}

看看输出(cancanneed) 

咦?这都有符合预期的输出看哦,吼吼吼

总结

今天确实上强度了,我们也学到很多东西

1、怎么拆分任务(把一个具体的任务和学过的联系起来)

2、要思考用户的出生性会输入各种不该输入的 

3、代码要有可读性,进公司都是分工合作,不能只有你自己可以看懂

4、套用的时候注意变化(等号变拷贝),但是原理不变(冒泡法) 

5、一步一步来,尽量写完一个函数测试一下,避免bug集中在一起

以上均是本人理解,如有不对欢迎各位大佬评论区指出~

 

 

 

 

 

标签:name,int,void,练习,C语言,char,数组,排序,输入
From: https://blog.csdn.net/dyudbegdu/article/details/145017367

相关文章

  • 【练习】力扣热题100 有效的括号
    题目给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例1:输入:s=“()”输出:true示例2:输......
  • 排序算法专题总结
    分治基础-二分查找:二分查找是一种高效的查找算法先找到数组的中间位置mid,判断(1)如果要找的数x==a[mid]找到了,mid就是位置(2)如果要找的教x>a[mid],说明要找的数在后一半,递归在后一半找(3)如果要找的数x<a[mid],说明要找的数在前一半,递归在前一半找在下标为left~right之间的......
  • C语言练习(6)
    按要求编写程序。该题的要求是:有1000元,想存5年,可按以下5种办法存:①一次存5年期;②先存2年期,到期后将本息再存3年期;③先存3年期,到期后将本息再存2年期;④存1年期,到期后将本息再存1年期,连续存5次;⑤存活期存款,活期利息每季度结算一次。分别给出了不同存期的利率,要求计算并比......
  • LAMPSecurityCTF5---靶机练习
    LAMPSecurityCTF5靶机练习声明B站UP主泷羽sec笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。✍......
  • eNSP:DHCP及实操练习
     前面三篇博客我们一直在不断扩展拓扑,DHCP我们还是使用之前的拓扑来方便大家理解:(前三篇博客分别为:eNSP基础命令、DNS、Telnet,感兴趣的可以点击查阅,欢迎提出意见)在开始进行配置之前,我们先学习DHCP的基础理论知识: DHCP(动态主机配置协议) 基于UDP6768端口,是一种网络管理......
  • 【C语言】_指针面试题
    目录1.示例12.示例23.示例34.示例45.示例56.示例67.示例71.示例1#include<stdio.h>intmain(){ inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return0;}运行结果如下:分析:(1)a=&a[0],a+......
  • 【C语言】_字符函数
    目录1.字符分类函数1.1相关函数及其功能1.2使用示例2.字符转换函数2.1相关函数及其功能2.2使用示例1.字符分类函数1.1相关函数及其功能函数其参数符合下列条件则返回真iscntrl任何控制字符isspace空白字符:空格'';换页'\f';换行:'\n';回车:'\r';制表符:'\t';垂直制......
  • 嵌入式基础 C语言预科准备
    一、C语言的基本结构(1)、第一个C程序:helloworld配置部署好vsCode之后,就可以直接在上面写代码了,新建一个新的C程序文件,向屏幕输出一串字符“HelloWorld!”下面,从整体上来分析一下这个最简单的C语言程序,将这个最简程序的各个部分剖析清楚,明白我们写下的每一个字符的具体......
  • 重回C语言之老兵重装上阵(五)C语言作用域规则
    C语言中的作用域(Scope)定义了一个变量或函数名可以被访问的范围。作用域规则帮助我们了解变量和函数在代码中有效的区域。C语言中的作用域主要分为两类:变量作用域和函数作用域。1.作用域的类型C语言的作用域主要可以分为以下几种类型:块作用域(BlockScope):在代码块......
  • 重回C语言之老兵重装上阵(四)vscode配置C语言多文件编译运行
    眨眼睛第一次使用vscode写C语言多文件项目发现插件默认配置只能单文件编译,勃然大怒,于是怒了一下首先明确这一件事,只要有环境C文件就能通过命令行编译,插件只是简化输入命令行的工具,所以我们只需修改插件编译的配置即可一.首先我们需要下载对应插件点击跳转具体插件安装......