| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 979 人关注过本帖
标题:输出全部最长单词!高手帮帮忙!多谢啦!
只看楼主 加入收藏
ybjkl
Rank: 2
等 级:论坛游民
帖 子:86
专家分:85
注 册:2011-6-21
收藏
得分:0 
回复 10楼 ybjkl
怎么按你的思路改着改着有递归的味道了。还是希望哪位大神帮我用指针数组解决,一是程序写到用指针数组是很自然的事,再就是对指针数组不是很了解,想看下眼!多谢啦!
2011-08-30 10:47
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
收藏
得分:0 
很不错   

Discuz!  
好好学习  天天向上
2011-08-30 10:58
ybjkl
Rank: 2
等 级:论坛游民
帖 子:86
专家分:85
注 册:2011-6-21
收藏
得分:0 
  高手都在忙啥呢?真的期待在原有思路和框架上看到指针数组的牛B运用,也好让我这菜鸟开开眼啊!
  问题的关键是在一个字符串中有并列最长单词的时候都能输出,为简单起见,字符串以.结束,也算是有标点吧!省去最长单词在最后面的情况。在线等。高手拜托啦!
2011-08-30 15:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
你自己接着做看看:

程序代码:
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <new.h>
#include <ctype.h>
#include <conio.h>

struct WORDS
{
    size_t Count;
    wchar_t* pWord[4096];
} Words;

size_t Get_Word(FILE* File, wchar_t* Word);
void my_strcpy(wchar_t* Destination, size_t Count, const wchar_t* Source);

void main(int argc, char* argv[])
{
    FILE* File;
    errno_t Error;
    wchar_t Word[1024] = {'\0'};
    size_t Count;

    setlocale(LC_ALL, "chs");        // 设中文输出

    if (argc < 1)
    {
        wprintf_s(L"格式: test <FileName>\n");
        goto end;
    }

    Error = fopen_s(&File, argv[1], "rt");
    Words.Count = 0;
    while (!feof(File))
    {
        Count = Get_Word(File, Word);
        if (Count > 0)
        {
            Words.pWord[Words.Count] = new wchar_t[Count+1];
            my_strcpy(Words.pWord[Words.Count], Count, Word);
            _putws(Words.pWord[Words.Count]);
            Words.Count++;
        }
    }
    fclose(File);
   
end:
    wprintf_s(L"\n=== 按任意键继续 ===");
    _getwch();
    while (Words.Count > 0)
    {
        delete[] Words.pWord[Words.Count-1];
        Words.Count--;
    }
}

size_t Get_Word(FILE* File, wchar_t* Word)
{
    wchar_t Character;
    size_t Count = 0;

    while (!feof(File))
    {
        Character = fgetwc(File);
        if (!iswspace(Character) && !iswpunct(Character))            // 过滤空白符号和标点符号
        {
            Word[Count] = Character;
            Count++;
        }
        else
        {
            break;
        }
    }
    Word[Count] = '\0';

    return Count;
}

void my_strcpy(wchar_t* Destination, size_t Count, const wchar_t* Source)
{
    size_t Index;

    for (Index = 0; Index < Count; Index++)
    {
        Destination[Index] = Source[Index];
    }
    Destination[Index] = '\0';

}

用法:把你的文章放在一个文本文件中,将此文件名作为参数传给程序。

btw: 有人说main()函数可以重复调用,请他们实现一下反复从操作系统获取参数的main()怎么做。用函数指针弄一个void main(void)的把戏,这个是main()的完全功能?还没叫你返回东西给操作系统呢。

[ 本帖最后由 TonyDeng 于 2011-8-30 17:24 编辑 ]

授人以渔,不授人以鱼。
2011-08-30 17:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
具体实现了一下,用法:事先建立一个文本文件(假设名为111.txt),输入一些文章,例如下面所示。编译下面程序,假设名为test.exe,则用test 111.txt运行,则看到按单词长度从长到短逐行输出的结果。

fdskjfdsfd  ifewerew,  34u32! dlkfjdfjd
dfjdsfjds. kdkd
ncxkhd


下面是完整的程序代码:

程序代码:
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <new.h>
#include <ctype.h>
#include <conio.h>

#define MAX_COUNT    4096

// 单词表
struct WORDS
{
    size_t Count;                    // 实际单词数
    wchar_t* pWord[MAX_COUNT];        // 单词
    size_t Len[MAX_COUNT];            // 单词长度表
    size_t Index[MAX_COUNT];        // 序号
} Words;

bool Read_Data(char* FileName);
size_t Get_Word(FILE* File, wchar_t* Word);
void Sort();

void main(int argc, char* argv[])
{

    setlocale(LC_ALL, "chs");        // 设定语言为中文输出

    if (argc < 2)
    {
        printf_s("格式: %s <FileName>\n", argv[0]);
        goto end;
    }

    if (Read_Data(argv[1]))
    {
        Sort();
        for (size_t Count = 0; Count < Words.Count; Count++)
        {
            wprintf_s(L"%s\n", Words.pWord[Words.Index[Words.Count - Count - 1]]);
        }
        while (Words.Count > 0)
        {
            delete[] Words.pWord[Words.Count-1];
            Words.pWord[Words.Count-1] = nullptr;
            Words.Count--;
        }
    }
    else
    {
        printf_s("文件%s打开错误,请检查再运行!\n", argv[1]);
    }

end:
    wprintf_s(L"\n=== 按任意键继续 ===");
    _getwch();
}

// 读入文本文件中的单词,存入单词表
bool Read_Data(char* FileName)
{
    FILE* File;
    errno_t Error;
    size_t Count;
    wchar_t Word[1024] = {'\0'};

    Error = fopen_s(&File, FileName, "rt");
    if (Error == 0)
    {
        Words.Count = 0;
        while (!feof(File))
        {
            Count = Get_Word(File, Word);
            if (Count > 0)
            {
                Words.Len[Words.Count] = Count;
                Words.pWord[Words.Count] = new wchar_t[Count+1];
                wcscpy(Words.pWord[Words.Count], Word);
                Words.Index[Words.Count] = Words.Count;
                Words.Count++;
            }
        }
        fclose(File);
        return true;
    }
    else
    {
        return false;
    }
}

// 从文件中读入一个单词
size_t Get_Word(FILE* File, wchar_t* Word)
{
    wchar_t Character;
    size_t Count = 0;

    while (true)
    {
        Character = fgetwc(File);
        if (Character == WEOF)
        {
            break;
        }
        if (!iswspace(Character) && !iswpunct(Character))            // 过滤空白符号和标点符号
        {
            Word[Count] = Character;
            Count++;
        }
        else
        {
            break;
        }
    }
    Word[Count] = '\0';

    return Count;
}

// 对数组排序
void Sort(void)
{
    unsigned int i, j;
    unsigned int Temp1, Temp2;

    for (i = 0; i < Words.Count - 1; i++)
    {
        for (j = i + 1; j < Words.Count; j++)
        {
            if (Words.Len[j] < Words.Len[i])
            {
                Temp1 = Words.Len[j];
                Words.Len[j] = Words.Len[i];
                Words.Len[i] = Temp1;
                Temp2 = Words.Index[j];
                Words.Index[j] = Words.Index[i];
                Words.Index[i] = Temp2;
            }
        }
    }
}



[ 本帖最后由 TonyDeng 于 2011-9-1 14:27 编辑 ]

授人以渔,不授人以鱼。
2011-09-01 14:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
修改代码如下:
程序代码:
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <new.h>
#include <ctype.h>
#include <conio.h>

size_t Get_Word(FILE* File, wchar_t* Word);
void Sort(wchar_t* Words[], const size_t Count);

void main(int argc, char* argv[])
{
    FILE* File;
    errno_t Error;
    wchar_t* Words[4096];            // 单词数组
    size_t Word_Count = 0;            // 单词数目
    wchar_t Buffer[1024];            // 缓冲字符串
    size_t Characters_Number;        // 字符数

    setlocale(LC_ALL, "chs");        // 设定语言为中文输出

    if (argc < 2)
    {
        printf_s("Usage: %s <FileName>\n", argv[0]);
        goto end;
    }

    if ((Error = fopen_s(&File, argv[1], "rt")) != 0)
    {
        printf_s("文件%s打开错误,请检查再运行!\n", argv[1]);
        goto end;
    }
    while (!feof(File))
    {
        Characters_Number = Get_Word(File, Buffer);
        Words[Word_Count] = new wchar_t[Characters_Number+1];
        Words[Word_Count] = wcscpy(Words[Word_Count], Buffer);
        Word_Count++;
    }
    fclose(File);
    wprintf_s(L"共%d个单词, 按长度由大到小排序如下:\n", Word_Count);
    Sort(Words, Word_Count);
    while (Word_Count > 0)
    {
        wprintf_s(L"%s\n", Words[Word_Count-1]);
        delete[] Words[Word_Count-1];
        Words[Word_Count-1] = nullptr;
        Word_Count--;
    }

end:
    wprintf_s(L"\n=== 按任意键继续 ===");
    _getwch();
}

// 从文件中读入一个单词
size_t Get_Word(FILE* File, wchar_t* Word)
{
    wchar_t Character;            // 读入字符
    size_t Count = 0;            // 字符计数器

    while ((Character = fgetwc(File)) != WEOF)
    {
        if (!iswspace(Character) && !iswpunct(Character))            // 过滤空白符号和标点符号
        {
            Word[Count++] = Character;
        }
        else break;
    }
    Word[Count] = '\0';

    return Count;        // 返回字符串的字符数
}

// 对数组排序
void Sort(wchar_t* Words[], const size_t Count)
{
    unsigned int i, j;
    wchar_t* Temp;

    for (i = 0; i < Count - 1; i++)
    {
        for (j = i + 1; j < Count; j++)
        {
            if (wcslen(Words[j]) < wcslen(Words[i]))
            {
                Temp = Words[j];
                Words[j] = Words[i];
                Words[i] = Temp;
            }
        }
    }
}

授人以渔,不授人以鱼。
2011-09-02 02:08
快速回复:输出全部最长单词!高手帮帮忙!多谢啦!
数据加载中...
 
   



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

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