美文网首页
C 语言作业 - 1 - 指针使用与冒泡排序

C 语言作业 - 1 - 指针使用与冒泡排序

作者: 捡个七 | 来源:发表于2019-03-26 13:34 被阅读0次

上周四 Programming 课程布置了一个作业,要求如下:

Write a C module for sorting string pointer array. And write a test program for string sorting using the module.



大致意思就是对一个字符数组进行排序;比较的方法有两种,一种是基于 ASCII 码的大小,一个是基于整数值的大小;最后用冒泡排序来测试这两种比较方法。

真的是,时隔很久又重新捡起 C 语言啊。

charstrcmp()

该函数是基于 ASCII 码来比较字符串的。一般的字符串比较都是基于这种方法,先比较首字母的 ASCII 码的大小,如果首字母相同再比较第二个字母,以此类推。举例来说:

“april” and “may” -> “may” > “april” 

“standard” and “stantalone” -> “standard” > “tandalone” (‘r’>’l’) 

因此,这个函数比较好实现:

/*
    function charstrcmp(): compare two strings based on ASCII
*/
int charstrcmp(char *s, char *t)
{
    int i=0;
    
    while(s[i]!='\0' || t[i]!='\0')
    {
        if(s[i] > t[i]) 
        {
            return 1;
        }
        else if(s[i] < t[i])
        {
            return -1;
        }
        i++;
    }
    return 0;
}

initstrcmp()

该函数是基于整数值来比较字符串的。这里第一想法是把字符串数字转换成数字,然后进行比较,但是试过之后感觉好麻烦,而且很多报错。后面就按照下面的步骤来进行了,比较简单:

  1. 基于正负数的符号比较
  2. 如果符合相同,基于长度比较
  3. 如果长度相同,基于字符串大小比较

实现如下:

int initstrcmp(char *s, char *t)
{
    int i = 0, sign = 1;

    // if s or t is negative
    if (s[i] != '-' && t[i] == '-') { return 1; }
    if (s[i] == '-' && t[i] != '-') { return -1; }
    
    // if s and t are all negative
    if (s[i] == '-' && t[i] == '-' ) { sign =  -1; }
    
    // compare based on the length of  strings
    if(strlen(s) > strlen(t)) { return sign; }
    if(strlen(s) < strlen(t)) { return -sign; } 
        
    // compare based on the value of strings
    while(s[i] != '\0' || t[i] != '\0')
    {
        if(s[i] > t[i]) { return sign; }
        else if(s[i] < t[i]) { return -sign; }
        i++;
    }
    return 0;
}

bubble_sort()

该函数是实现基于前两个比较方法的冒泡排序。关于冒泡排序就不多说了,直接看下面代码:

/*
    funciton swap(): swap two pointers
*/
void swap(char **s, char **t)
{
    char *tmp;
    tmp = *s;
    *s = *t;
    *t = tmp;
    tmp = NULL;
}

/*
    function bubble_sort(): bubble sort for strings
*/
void bubble_sort(void *str[], int num, int(*compare)(char *, char*))
{
    int i, j;
    for(i=0; i<num-1; i++)
    {
        for(j=0;j<num-1-i;j++)
        {   
            // if str[j] > str[j+1], should swap them
            if(compare((char *)str[j], (char *)str[j+1]) > 0)
            {
                // swap 
                swap(&str[j], &str[j+1]);
            }
        }
    }
 } 
 

实现结果

完整代码如下:

#include <stdio.h>
#include <string.h>

/*
    function ptint_out(): print out strings 
*/

void print_out(char *str[], int num)
{
    printf("{ ");
    int i;
    for(i=0; i<num; i++)
    {
        printf("%s ", str[i]);
    }
    printf("}\n");
}

/*
    function charstrcmp(): compare two strings based on ASCII
*/
int charstrcmp(char *s, char *t)
{
    int i=0;
    
    while(s[i]!='\0' || t[i]!='\0')
    {
        if(s[i] > t[i]) 
        {
            return 1;
        }
        else if(s[i] < t[i])
        {
            return -1;
        }
        i++;
    }
    return 0;
}

/*
    function initstrcmp(): compare two strings based on integer value
*/
int initstrcmp(char *s, char *t)
{
    int i = 0, sign = 1;

    // if s or t is negative
    if (s[i] != '-' && t[i] == '-') { return 1; }
    if (s[i] == '-' && t[i] != '-') { return -1; }
    
    // if s and t are all negative, change the sign
    if (s[i] == '-' && t[i] == '-' ) { sign =  -1; }
    
    // compare based on the length of  strings
    if(strlen(s) > strlen(t)) { return sign; }
    if(strlen(s) < strlen(t)) { return -sign; } 
        
    // compare based on the value of strings
    while(s[i] != '\0' || t[i] != '\0')
    {
        if(s[i] > t[i]) { return sign; }
        else if(s[i] < t[i]) { return -sign; }
        i++;
    }
    return 0;
}


/*
    funciton swap(): swap two pointers
*/
void swap(char **s, char **t)
{
    char *tmp;
    tmp = *s;
    *s = *t;
    *t = tmp;
    tmp = NULL;
}

/*
    function bubble_sort(): bubble sort for strings
*/
void bubble_sort(void *str[], int num, int(*compare)(char *, char*))
{
    int i, j;
    for(i=0; i<num-1; i++)
    {
        for(j=0;j<num-1-i;j++)
        {   
            // if str[j] > str[j+1], should swap them
            if(compare((char *)str[j], (char *)str[j+1]) > 0)
            {
                // swap 
                swap(&str[j], &str[j+1]);
            }
        }
    }
 } 
 


/*
    test program for the charstrcmp() and initstrcmp()
*/

int main()
{
    // test strings 
    int num=6;
    char *str[] = {"3", "27", "123", "5", "9", "1"};
    char *str_1[] = {"3", "27", "123", "5", "9", "1"};
    printf("\nOriginal strings: \n");
    print_out(str, num);
    
    printf("\n============ Sorted Result ============\n");
    // compare based on ASCII   
    bubble_sort(str,num,charstrcmp);
    // compare based on Integer Value
    bubble_sort(str_1,num,initstrcmp);
    
    printf("\nResult of %s method:\n", "ASCII");
    print_out(str,num);
    
    printf("\nResult of %s method:\n", "Integer Value");
    print_out(str_1,num);
    

    return 1;
}

运行结果如下:

相关文章

  • C 语言作业 - 1 - 指针使用与冒泡排序

    上周四 Programming 课程布置了一个作业,要求如下: Write a C module for sort...

  • C经典88案例(第二部分)

    案例ex23: 使用指针实现冒泡排序 1 题目 函数:bubble_order()功能:使用指针实现冒泡排序描述:...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 三种初级排序

    三种初级排序 冒泡排序 选择排序 插入排序 此篇文章中展示的代码为 C 语言代码 ,数组索引操作替换为指针操作。 ...

  • 小朋友学数据结构(12):冒泡排序

    咱们在学C语言的时候,学过冒泡排序,请参考《小朋友学C语言(26):冒泡排序》:https://www.jians...

  • C语言数组冒泡排序

    C语言实现冒泡排序

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • 冒泡排序就这么简单

    冒泡排序就这么简单 在我大一的时候自学c语言和数据结构,我当时就接触到了冒泡排序(当时使用的是C语言编写的)。现在...

  • 算法:冒泡排序

    本文内容:1、什么是冒泡排序?2、冒泡排序的 C/OC 实现与算法分析。 算法总目录:算法? 1、什么是冒泡排序?...

  • 在Swift中使用C语言的指针

    在Swift中使用C语言的指针 在Swift中使用C语言的指针

网友评论

      本文标题:C 语言作业 - 1 - 指针使用与冒泡排序

      本文链接:https://www.haomeiwen.com/subject/fljgvqtx.html