| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1740 人关注过本帖
标题:这题C语言怎么解啊
只看楼主 加入收藏
解忧杂货店
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2018-4-26
结帖率:25%
收藏
已结贴  问题点数:20 回复次数:6 
这题C语言怎么解啊
图片附件: 游客没有浏览图片的权限,请 登录注册

不会
搜索更多相关主题的帖子: C语言 
2018-04-26 21:36
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
看来出题的还不了解memmove和qsort(当然这不是重点)~

那可以看看这个~

程序代码:
#include<stdio.h>

void fun( const char* [],size_t,int (*)( const void*,const void* ) );

int check(const char* [],size_t,size_t,int (*)( const void*,const void* ) );
int comp( const void*,const void* );
int _strcmp( const char*,const char* );

void reset( const void** ,size_t );
void swap( void*,void* );

int main( void )
{    
    #define __ARR_LEN( s )    \
    (sizeof (s)/sizeof (*s))
    
    char str[5][100];
    
    const char* p[__ARR_LEN(str)];
    
    size_t i;
     
    puts("Input 5 strings:");  
    for (i=0;i!=__ARR_LEN(str);++i)
    {
        fgets(str[i],__ARR_LEN(*str),stdin);
        
        p[i]=str[i];
    }
    
    fun(p,__ARR_LEN(str),comp);
   
   puts("--------------------");
    for (i=0;i!=__ARR_LEN(str);++i)
        printf("%s",p[i]);

    return 0;
    
    #undef __ARR_LEN
}

void fun( const char* str[],size_t n,int (*comp)( const void*,const void* ) )
{
    while (check(str,0,n,comp)!=n-1)     
       reset(( const void** )str,n);
}

int check(const char* str[],size_t i,size_t n,int (*comp)( const void*,const void* ) )
{
    
    if (i>=n-1)
        return i;
    
    for (--n;(i!=n)&&(comp(str[i],str[i+1])==0);++i);
    
    return i;
}

int comp( const void* p,const void* q )
{
    return _strcmp(p,q)>0?1:0;
}

int _strcmp( const char* p,const char* q )
{
    for (;*p&&*q&&(*p==*q);++p,++q);

    return *p-*q;
}

#include<stdlib.h>

void reset( const void** p,size_t n )
{
    size_t i;
    
    for (i=0;i!=n;++i)
        swap(&p[i],&p[rand()%n]);            
}

void swap( void* p,void* q )
{       
    const void** const _p=( const void** const )p;
    const void** const _q=( const void** const )q;
    
    const void* const t=*_p;
        
    *_p=*_q;
    *_q=t;
}


[此贴子已经被作者于2018-4-27 02:57编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-27 00:31
解忧杂货店
Rank: 1
等 级:新手上路
帖 子:13
专家分:4
注 册:2018-4-26
收藏
得分:0 
回复 2楼 九转星河
看不懂
2018-04-27 10:49
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 解忧杂货店
换了一种排序方法,这个感觉正常一点了~

程序代码:
#include<stdio.h>

void fun( const char* [],size_t,int (*)( const void*,const void* ) );

int check(const char* [],size_t,size_t,int (*)( const void*,const void* ) );
int comp( const void*,const void* );
int _strcmp( const char*,const char* );

void swap( void*,void* );

int main( void )
{    
    #define __ARR_LEN( s )    \
    (sizeof (s)/sizeof (*s))
    
    char str[5][100];
    
    const char* p[__ARR_LEN(str)];
    
    size_t i;
     
    puts("Input 5 strings:");  
    for (i=0;i!=__ARR_LEN(str);++i)
    {
        fgets(str[i],__ARR_LEN(*str),stdin);
        
        p[i]=str[i];
    }
    
    fun(p,__ARR_LEN(str),comp);
   
   puts("--------------------");
    for (i=0;i!=__ARR_LEN(str);++i)
        printf("%s",p[i]);

    return 0;
    
    #undef __ARR_LEN
}

void fun( const char* str[],size_t n,int (*comp)( const void*,const void* ) )
{
    size_t i;
    
    for (i=0;(i=check(str,i,n,comp))!=n-1;i?--i:0)
         swap(&str[i],&str[i+1]);
}

int check(const char* str[],size_t i,size_t n,int (*comp)( const void*,const void* ) )
{
    
    if (i>=n-1)
        return i;
    
    for (--n;(i!=n)&&(comp(str[i],str[i+1])==0);++i);
    
    return i;
}

int comp( const void* p,const void* q )
{
    return _strcmp(p,q)>0?1:0;
}

int _strcmp( const char* p,const char* q )
{
    for (;*p&&*q&&(*p==*q);++p,++q);

    return *p-*q;
}

void swap( void* p,void* q )
{       
    const void** const _p=( const void** const )p;
    const void** const _q=( const void** const )q;
    
    const void* const t=*_p;
        
    *_p=*_q;
    *_q=t;
}


[此贴子已经被作者于2018-4-27 11:16编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-27 11:13
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
弄了一种可以看看的专门对于字符串排序的算法,自己弄出来的,不保证没有bug,可以看看~

弄好了bug并且顺便优化了一下~

程序代码:
#include<stdio.h>

typedef struct Load
{   
    const char* p;
    
    size_t index;
}Load;

void nodeMal( void** ,size_t );
void nodeFree( void** );

int comp( const void*,const void* );

void fun( const char* [],size_t,int (*)( const void*,const void* ) );

void _sort( Load* ,size_t,size_t,int (*)( const void*,const void* ) );

int main( void )
{    
    #define __ARR_LEN( s )    \
    (sizeof (s)/sizeof (*s))
    
    char str[5][100];
    
    const char* p[__ARR_LEN(str)];
    
    size_t i;
     
    puts("Input 5 strings:");  
    for (i=0;i!=__ARR_LEN(str);++i)
    {
        fgets(str[i],__ARR_LEN(*str),stdin);
        
        p[i]=str[i];
    }
    
    fun(p,__ARR_LEN(str),comp);
   
   puts("--------------------");
    for (i=0;i!=__ARR_LEN(str);++i)
        printf("%s",p[i]);

    return 0;
    
    #undef __ARR_LEN
}

#include<stdlib.h>
#include<string.h>
#include<assert.h>

void nodeMal( void** p,size_t size )
{
    assert(p);
    
    *p=malloc(size);
    
    assert(*p);

    memset(*p,0,size);
}

void nodeFree( void** p )
{
    assert(p);
    
    free(*p);
    *p=NULL;
}


int comp( const void* p,const void* q )
{
    const char* const _p=(( Load* )p)->p;
    const char* const _q=(( Load* )q)->p;
    
    const size_t index=(( Load* )p)->index;
    
    return _p[index]-_q[index];
}

void fun( const char* str[],size_t n,int (*comp)( const void*,const void* ) )
{
    Load* load=NULL;
    
    size_t i;
    
    nodeMal(( void** )&load,n*sizeof (*load));
    
    for (i=0;i!=n;++i)
        load[i].p=str[i];
    
   qsort(load,n,sizeof (*load),comp);
   
   _sort(load,0,n,comp);
   
   for (i=0;i!=n;++i)
       str[i]=load[i].p;  
    
    nodeFree(( void** )&load);
}

void _sort( Load* load,size_t low,size_t height,int (*comp)( const void*,const void* ) )
{
    if ((low>=height)||(load[low].p[load[low].index]=='\0'))
        return ;

    {                
        const Load key=load[low];
        
        size_t i=low;
       
        for (;(i!=height)&&load[i].p[load[i].index]&&(comp(&key,&load[i])==0);++load[i++].index);
      
      if (i-low>1)
          qsort(&load[low],i-low,sizeof (*load),comp);
     
      if (height-low<2)
          return ;

        _sort(load,low,i,comp);
        _sort(load,i,height,comp);
    }      
}


[此贴子已经被作者于2018-4-27 19:54编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-27 18:02
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:10 
程序代码:
#include<stdio.h>
int strcompare(char *a,char *b)           
{
    for(;*a&&*b&&*a==*b;++a,++b);
    return *a-*b;    
}
void copyarr(char *a,char *b)  
{
    for(;*b?(*a++=*b):*b;++b);
    *a='\0';
}
int main()
{
    char str[5][81];
    char temp[81];
    int i,j;
    printf("Input 5 strings:\n");
    for(i=0;i<5;++i)
        gets(str[i]);
    for(i=0;i<5;++i)
        for(j=i+1;j<5;++j)
        {
            if(strcompare(str[i],str[j])>0)
            {
                copyarr(temp,str[i]);
                copyarr(str[i],str[j]);
                copyarr(str[j],temp);
            }
        }
    printf("---------------------------\n");
    for(i=0;i<5;++i)
        puts(str[i]);
    return 0;
}
2018-04-27 19:08
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 李晨经纪人
补充一下~记得strcpy函数可以这样

while (*p++=*q++);

(记得谭那本就有这种写法,虽然谭那本很多都说笑笑算了)

这种是最说不上些什么的无言写法了~


[此贴子已经被作者于2018-4-28 09:48编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-28 09:34
快速回复:这题C语言怎么解啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019761 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved