C Primer Plus(第六版)11.13 编程练习 第11题

/*
编写一个函数,读入10个字符串或者读到EOF时停止。
该程序为用户提供一个有5个选项的菜单:
打印源字符串列表
以ASCII中的顺序打印字符串
按长度递增顺序打印字符串
按字符串中第1个单词的长度打印字符串
退出
菜单可以循环显示,除非用户选择退出选项。当然,该
程序要能真正完成菜单中各选项的功能。
*/

/*测试用字符串 
sadflkj
 dskfjs
fsdf
 dsfsd
sdf sdf sdf
sdfs
x
xcvcxv
b
a
*/

//测试用字符串 
//={"  Jddd de","ISD","HS"," ASDFA DFDS","FW"," aEQWerw e","DBV","Cc","BS dD","A DFF"}
//{"J","I","H","G","F","E","D","C","B","A"};

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

#define SIZE 10

void get_string(char tr[][40]);
void bubble_sort(int arr[], int len);
int word_len(char *tr);
void repeat_zero(int len[]);
void a(char tr[][40]);
void b(char tr[][40]);
void c(char tr[][40]);
void d(char tr[][40]);

int main(void)
{    
    int i=0;
    char strings[SIZE][40]={"\0"} ;
    
    printf("输入10个字符串 CTRL+Z结束\n");
    get_string(strings);
    printf("1.打印源字符串列表\n2.以ASCII中的顺序打印字符串\n3.按长度递增顺序打印字符串\n4.按字符串中第1个单词的长度打印字符串\n5 to quit\n");
    while((scanf("%d",&i))!=EOF&&i>5)
    {
        printf("1.打印源字符串列表\n2.以ASCII中的顺序打印字符串\n3.按长度递增顺序打印字符串\n4.按字符串中第1个单词的长度打印字符串\n5 to quit\n");
        while(getchar()!='\n')
            continue;    
    }
    switch(i)
    {
        case 1: a(strings); break;
        case 2: b(strings); break;
        case 3: c(strings); break;
        case 4: d(strings); break;
        case 5: break;
        default:printf("erro"); break;
    }
    return 0;
}
void get_string(char tr[][40])//读10个字符串 
{  
    int i; 
    for (i = 0; i < SIZE ; i++) 
        fgets(tr[i], 40, stdin);//fgets读到EOF时会停止 
}

void bubble_sort(int arr[], int len) //冒泡排序 
{
    int i, j, temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
            if (arr[j] > arr[j + 1]) 
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}

int word_len(char *tr)//取词长
{
    int i=0,flag=0,j=0;
    while(tr[i]==' '&&i<40)
        i++;
     while((tr[i]!=' '&&tr[i]!='\0'&&tr[i]!='\n'&&tr[i]!='\t')&&i<40)
    {
        i++;
         j++;     
    }
    return j; 
}//写的不是很好,不过能用. 

void repeat_zero(int len[])//重复改为0 
{
    int i;
    
    for(i=0;i<SIZE;i++)
    {
        if(len[i]==len[i+1])
            len[i]=0;
    }
}

void a(char tr[][40])
{
    int i;
    for(i=0;i<SIZE;i++)
        printf("tr[%d]=%s\n",i,tr[i]);
}

void b(char tr[][40])//对首字母进行冒泡排序得到新的数组后去重,让tr按照去重后的数组输出 
{
    int asc[SIZE]={0};
    int i,j,k;
    
    for(i=0;i<SIZE;i++)
    {    
        j=0;
        while(tr[i][j]==' ')
            j++;
        asc[i] = tr[i][j];
    }
    bubble_sort(asc,SIZE);
    repeat_zero(asc);
    for(i=0;i<SIZE;i++)
    {
        if(asc[i]!=0)
        {
            for(j=0;j<SIZE;j++)
            {
                k=0;
                while(tr[j][k] == ' ')
                    k++;
                if(asc[i] == tr[j][k])//asc放的是首字母,要找到tr字符串的首字母和它比较 
                    {
                    printf("tr[%d]:%s\n",j,tr[j]);
                    }
                else
                    continue;
            }
        }
    }
}

void c(char tr[][40])//对长度进行冒泡排序得到新的数组后去重,让tr按照去重后的数组输出 
{
    int len[SIZE]={0};
    int i,j;
    char *p[SIZE];


    for(i=0;i<SIZE;i++)
    {
        len[i] = strlen(tr[i]);
    }
    bubble_sort(len,SIZE);
    repeat_zero(len);
    for(i=0;i<SIZE;i++)
    {
        if(len[i]!= 0)
        {
        for(j=0;j<SIZE;j++)
            if(len[i] == strlen(tr[j]))
            {    
                printf("tr[%d]:%s\n",j,tr[j]);
            }
            else
                continue;
        }
    }        
}


void d(char tr[][40])//对单词长度进行冒泡排序得到新的数组后去重,让tr按照去重后的数组输出 
{
    int len[SIZE]={0};
    int i,j;
    for(i=0;i<SIZE;i++)
        len[i]=word_len(tr[i]);
    bubble_sort(len,SIZE);
    repeat_zero(len);
    for(i=0;i<SIZE;i++)
    {
        if(len[i]!= 0)
        {
        for(j=0;j<SIZE;j++)
            if(len[i] == word_len(tr[j]))
            {    
                printf("tr[%d]:%s\n",j,tr[j]);
            }
            else
                continue;
        }
    }        
}

  • 43
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值