Gmail Kalender Dokument Reader Nätet mer »
Nyligen besökta grupper | Hjälp | Logga in
Startsida för Google-grupper
Meddelande från diskussion C++ programming challenge
Gruppen som du skickar meddelanden till är en Usenet-grupp. Meddelanden som skickas till den här gruppen gör ditt mail synligt för alla på Internet.
Ditt svarsmeddelande har inte skickats.
Ditt meddelande har publicerats
 
Från:
Till:
Kopia:
Uppföljning på:
Lägg till kopia | Lägg till uppföljning | Redigera ämne
Ämne:
Validering:
Av verifieringsskäl ber vi dig att skriva in de bokstäver du ser i bilden nedan eller de siffror som du hör om du klickar på tillgänglighetsikonen. Lyssna och skriv talen du hör
 
agelos.anaptixi....@gmail.com  
Visa profil   Översätt till Översatt (visa ursprungstexten)
 Fler alternativ 11 Juni 2009, 01:10
Nyhetsgrupper: comp.lang.c++
Från: agelos.anaptixi....@gmail.com
Datum: Wed, 10 Jun 2009 16:10:25 -0700 (PDT)
Lokalt: Tor 11 Juni 2009 01:10
Ämne: Re: C++ programming challenge
On 10 Éïýí, 13:54, Peter Jansson <webmas...@jansson.net> wrote:

> Dear news group,

> I have created a small programming challenge for those of you who are
> interested in challenging your Standard C++ programming skills. The
> challenge is about counting character frequency in large texts,
> perhaps useful for spam filtering or classical crypto analysis. You
> can read more about it here:

> http://blog.p-jansson.com/2009/06/programming-challenge-letter-freque...

> With kind regards,
> Peter Jansson

Actually, just changing the line :
        ifstream inputFile(argv[argc -1]);
with
        ifstream inputFile(argv[argc -1],std::ios::binary);

beats any other post (on my PC at least :))

Here's the new code (just added the binary open mode)

#include <fstream>
#include <iostream>
#include <ctime>

int main(int argc, char **argv)
{
    using namespace std;

        int frequency[128];
        memset(frequency, 0, sizeof(int) * 128);

        const int BUFFER_SIZE = 4096;
    char buffer[BUFFER_SIZE];
        unsigned int totalChars = 0;

    if (argc != 2)
    {
        cerr << "\nUsage: " << argv[0] << " fileNameToRead\n\n";
        return EXIT_FAILURE;
    }

        clock_t time1, time2;

    time1 = clock();

        ifstream inputFile(argv[argc -1],std::ios::binary);

    if (!inputFile.good())
    {
        cerr << "Bad file, ciao!\n";
        return EXIT_FAILURE;
    }

        int *p;
        char *end;

        do
    {
        inputFile.read(buffer, BUFFER_SIZE);
                int bytesRead = inputFile.gcount();

                totalChars += bytesRead;

                end = buffer + bytesRead;
                for (p = (int *)buffer; p <= (int *)(end - sizeof(int)); p++)
                {
                        frequency[(*p & 0xff000000) >> 24]++;
                        frequency[(*p & 0x00ff0000) >> 16]++;
                        frequency[(*p & 0x0000ff00) >> 8 ]++;
                        frequency[(*p & 0x000000ff)      ]++;
                }

        }while(!inputFile.eof());

        char *c = (char *)p;
        while (c != end)
        {
                frequency[*c]++;
                c++;
        }

        inputFile.close();

        double dTotalChars = (double)totalChars;

        for (int i = 'A'; i <= 'Z'; i++)
        {
                cout << (char)i << " = " << (frequency[i] / dTotalChars) * 100.0 <<
"%\n";
        }

        for (int i = 'a'; i <= 'z'; i++)
        {
                cout << (char)i << " = " << (frequency[i] / dTotalChars) * 100.0 <<
"%\n";
        }

    time2 = clock();

    double totalTimeInSeconds =  (time2- time1);
        cout << "Time elapsed (ms) : " << totalTimeInSeconds << endl;

}


    Vidarebefordra  
Du måste Logga in innan du kan skicka meddelanden.
Om du vill skicka ett meddelande måste du först delta i den här gruppen.
Uppdatera ditt smeknamn på sidan Prenumerationsinställningar innan du skickar.
Du har inte behörighet att skicka meddelanden.

Skapa en grupp - Google-grupper - Googles startsida - Användarvillkor - Sekretesspolicy
©2010 Google