Troche total offtopu

Bezkarność wypowiedzi gwarantowana!

Troche total offtopu

Wiadomośćprzez Arthanis » Pt cze 17, 2005 10:51 am

Wybaczcie, że tak zaśmiecam forum, ale mam pytanko z dziedziny programowania.

Mianowicie ostatni pisałem konkurs informatyczny (z programowania) i zrobiłem wszystko, poza dwoma zadaniami, w których trzeba było cytuję:
Napisz program, który wczyta (z klawiatury - przyp. Arth.) liczbę z przedziału 0 - 32000 i wypisze ją na ekranie w odwróconej kolejności, np dla wczytanej liczby 1234 program powinien wypisać 4321


Jeśli ktoś ma jakiś pomysł, jak rozdzielić liczbę na jedności, dziesiątki, setki itd. to prosze o riposty.

Pozdrawiam
Arthanis
"Jeśli coś wydaje się właściwe, to należy się trzy razy zastanowić, czy jest właściwe"
Emblemat użytkownika
Arthanis
 
Wiadomości: 89
Dołączył(a): Pt mar 19, 2004 2:07 pm

Wiadomośćprzez muzgus » Pt cze 17, 2005 11:06 am

przy pobieraniu danych zapisujesz je do tablicy, po czym wypisujesz w odwrotnej kolejności.

ewentualnie robisz tak:

wypisujesz resztę z dzielenia przez 10, potem dzielisz przez 10 itd. (zakładając, że liczba jest całkowita i typ zmiennej to integer)
Ostatnio edytowano N cze 19, 2005 5:27 pm przez muzgus, łącznie edytowano 2 razy
gg: 5224983 | jabber: m [at] jabber.cz| tlen: muzgus [at] tlen.pl | icq: 314995403
(___________(Już pusto...) ___________)
Emblemat użytkownika
muzgus
 
Wiadomości: 827
Dołączył(a): Śr gru 24, 2003 11:30 am
Lokalizacja: Hrabstwo Anin

Wiadomośćprzez Quandarthall » Pt cze 17, 2005 11:29 am

Czesc. Wlasnie napisalem cos takiego... na szybko, ale dziala.
w przykladzie oddzielam dziesiatki tysiecy od reszty liczby:

for(int x=0; x<10;) //dziesiatki tysiecy
{
if (x*10000 < liczba)
x++;

else
{
if(x*10000 == liczba)
dt = x;

else
{
if (x!=0)
dt = x-1;

else
dt = 0;
}
liczba -= dt*10000;
break;
}
}

to samo zrob z tysiacami, setkami, dziesiatkami i jednostkami, na sam koniec:

wynik = j*10000; //jednostki
wynik += d*1000; //dziesiatki
wynik += s*100; //setki
wynik += t*10; //tysiace
wynik += dt*1; //dziesiatki tys.

i masz odwróconą liczbe :)

pozdrawiam
when all else fails, read the instructions
Quandarthall
 
Wiadomości: 29
Dołączył(a): Śr kwi 09, 2003 1:03 am
Lokalizacja: Szczecin

program(?)

Wiadomośćprzez orenold » Pt cze 17, 2005 12:07 pm

#include <iostream.h>
char wpisana[4];
main(){
int i;
cout<<"\nwpisz liczbe"<<endl;
cin>>wpisana;
for(i=4;i>=0;i--){
if(wpisana[i]!=NULL)cout<<wpisana[i];
}
cout<<endl;
}
orenold
 

Wiadomośćprzez Quandarthall » Pt cze 17, 2005 12:11 pm

"który wczyta ... liczbę z przedziału 0 - 32000"

string nie jest liczbą. myślę, że chodzi tu o INTa, bo to by było zbyt proste jak na konkurs programowania.
when all else fails, read the instructions
Quandarthall
 
Wiadomości: 29
Dołączył(a): Śr kwi 09, 2003 1:03 am
Lokalizacja: Szczecin

Re: program(?)

Wiadomośćprzez Arthanis » Pt cze 17, 2005 12:23 pm

orenold napisał(a):char wpisana[4];

Orenoldzie, jedyny kłopot w tym, że wczytywana liczba jest jedna, tzn nie jest 1 [enter] 2 [enter] 3 [enter] 4 [enter], tylko 1234 [enter]
Muzgusie, to samo się tyczy Twojego pomysłu, ale dziękuję Wam za pomoc.
Quandarthallu, liczby z tego przedziału zawiera również WORD (wprzwdzie można użyć INTEGER, jednak na konkursie była premiowana oszczędność miejsca, a chyba WORD zajmuje mniej), a poza tym to rzeczywiście dobry algorytm, szkoda, że nie miałem zadań PRZED konkursem :wink: Jednak dziękuję za odpowiedzi.
Pozdrawiam
Arthanis
"Jeśli coś wydaje się właściwe, to należy się trzy razy zastanowić, czy jest właściwe"
Emblemat użytkownika
Arthanis
 
Wiadomości: 89
Dołączył(a): Pt mar 19, 2004 2:07 pm

Wiadomośćprzez muzgus » Pt cze 17, 2005 1:21 pm

Muzgusie, to samo się tyczy Twojego pomysłu


pobieraj dane funkcją getchar(), pobiera ona po jednym znaku, który od razu sobie możesz zapisać. Jak dostanie znak końca linii, zakończ pobieranie i tyle.
Emblemat użytkownika
muzgus
 
Wiadomości: 827
Dołączył(a): Śr gru 24, 2003 11:30 am
Lokalizacja: Hrabstwo Anin

Wiadomośćprzez Ghrhambra » Pt cze 17, 2005 1:31 pm

Quandarthall napisał(a):string nie jest liczbą. myślę, że chodzi tu o INTa, bo to by było zbyt proste jak na konkurs programowania.


A jak to nie jest?
Właśnie, że jest, tylko jest tak sformatowaną liczbą, żeby było
jak najwygodniej przedstawiać za jej pomocą teksty.
Czyli łańcuch "1234" jest (może być) ciągiem bajtów reprezenujących liczbę 1234, choć zapisanych w trochę niewygodnym dla obliczeń formacie.

Czyli najprostszym sposobem jest odwrócenie kolejności w tablicy tekstowej (łańcuchu).
Ostatnio edytowano Pt cze 17, 2005 1:42 pm przez Ghrhambra, łącznie edytowano 1 raz
Emblemat użytkownika
Ghrhambra
łowca trolli
 
Wiadomości: 267
Dołączył(a): Śr maja 30, 2001 2:00 am
Lokalizacja: Jastrzębie

Wiadomośćprzez orenold » Pt cze 17, 2005 1:36 pm

Odnośnie mojego: Warnunek ' if (wpisana[i]!=NULL)' jest do usunięcia, mój błąd. :anxious:
orenold
 

Wiadomośćprzez Quandarthall » Pt cze 17, 2005 1:51 pm

Grhra... masz racje ;) Wszystko moze byc liczba, tylko jest ona sformatowana w pewien sposob, ktory ja reprezentuje. O tym nie pomyslalem :)

Czyli rzeczywiscie najlepiej jest skorzystac z getchara i pracowac na zwyklym stringu.
when all else fails, read the instructions
Quandarthall
 
Wiadomości: 29
Dołączył(a): Śr kwi 09, 2003 1:03 am
Lokalizacja: Szczecin

Wiadomośćprzez Arastroch. » Pt cze 17, 2005 2:26 pm

No fajnie, ja se wchodze na forum laca, a ci o stringach gadają :D
Klnę się prawdą i nieprawdą,
Klnę się mieczem, słuszną bitwą,
Klnę się gwiazdą, tą poranną,
Klnę się weczorną modlitwą.
Arastroch.
 
Wiadomości: 219
Dołączył(a): So lip 17, 2004 9:33 pm

Wiadomośćprzez Ghrhambra » Pt cze 17, 2005 2:29 pm

Arastroch. napisał(a):No fajnie, ja se wchodze na forum laca, a ci o stringach gadają :D

I to odwróconych na "lewą" stronę :P
Emblemat użytkownika
Ghrhambra
łowca trolli
 
Wiadomości: 267
Dołączył(a): Śr maja 30, 2001 2:00 am
Lokalizacja: Jastrzębie

Wiadomośćprzez Alu » So cze 18, 2005 11:41 am

Banalistyka =)
Kod: Zaznacz cały
#include <iostream>
#include <string>

using namespace std;

int main( )
{
    string liczba;
    cin >> liczba;
    for( int i = liczba.length( ); i >= 0; i-- ) cout << liczba[ i ];
    cout << "\n";
   
    return 0;
}

Użytkowanie:
g++ dupa.cpp
./a.out
1222145

Wypluwa:
5412221

=)
Emblemat użytkownika
Alu
 
Wiadomości: 84
Dołączył(a): N gru 21, 2003 10:47 pm

Wiadomośćprzez muzgus » So cze 18, 2005 12:17 pm

cin jest 20 razy wolniejszy od getch() :PPPP
Emblemat użytkownika
muzgus
 
Wiadomości: 827
Dołączył(a): Śr gru 24, 2003 11:30 am
Lokalizacja: Hrabstwo Anin

Wiadomośćprzez Alu » So cze 18, 2005 2:19 pm

muzgus napisał(a):cin jest 20 razy wolniejszy od getch() :PPPP

Tyle Ci powiem, bzdura. =P
Emblemat użytkownika
Alu
 
Wiadomości: 84
Dołączył(a): N gru 21, 2003 10:47 pm

Wiadomośćprzez Alu » So cze 18, 2005 2:28 pm

Z resztą, jeśli chcesz się wypowiadać o szybkości, zobacz to:

[EDIT 2]
[USUNIĘTO]
Zakradł się mały błąd do tegoż pomiaru szybkości (pomiar nie był obiektywny - zależał od szybkości rysowania terminalu oraz kolejności). Testowaliśmy to jeszcze z Kerriganem i mogę powiedzieć, że skompilowane na dobrym kompilatorze (GCC 4, Intel C++ 8) printf i cout mają identyczną szybkość. =P
[EDIT 2]

[EDIT]
Jeszcze jeden benczmark pokazujący wydajność std::string. =P
Kod: Zaznacz cały
#include <iostream>
#include <string>
#include <sys/time.h>
#include <cstdlib>

using namespace std;

#define SOURCE "Baaaaaaaaaaaaaaaaaardzo dluuuuuuuuuuuuuuuugi ciag znaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakow do kooooooooooooooooooooopiowania =P"
#define APPEND "Troche krotszy ciag znakow =)"

long GetTickCount( void )
{
    struct timeval tv;
   
    if( gettimeofday( &tv, NULL ) == -1 ) return 0;
    return ( tv.tv_sec * 1000 ) + ( tv.tv_usec / 1000 );
}

int main( )
{
    long lBefore, lChar, lString;
    int i;

    char CharSource[ ] = SOURCE;
    char * CharDest = ( char * )calloc( strlen( SOURCE ) + strlen( APPEND ) + 1, sizeof( char ) );

    string StringSource = SOURCE;
    string StringDest;

    lBefore = GetTickCount( );
    for( i = 0; i < 100000; i++ )
    {
        strcpy( CharDest, CharSource );
        strcat( CharDest, APPEND );
    }
    lChar = GetTickCount( ) - lBefore;

    lBefore = GetTickCount( );
    for( i = 0; i < 100000; i++ ) StringDest = StringSource + APPEND;
    lString = GetTickCount( ) - lBefore;

    cout << "\n\nstring: " << lString << "\nchar: " << lChar << "\n\n";

    free( CharDest );

    return 0;
}

Wypluwa:
string: 78
char: 43

Jak widać, string jest wolniejszy o mniej więcej 1.8 razy. Zdaje się, że nie jest to duże poświęcenie (biorąc pod uwagę, że nigdzie w swoim kodzie nie masz kopiowania ciągów znaków wywoływanego milion razy =]) skoro string'ów nie trzeba zwalniać (a więc żadnych wycieków pamięci) oraz łatwiej się z nich korzysta. (Gdybym pisząc Klacz od początku korzystał z standardowej biblioteki C++ pewnie by nie była taka dziurawa i byłaby dawno skończona =])
[/EDIT]
Ostatnio edytowano Cz cze 23, 2005 8:02 pm przez Alu, łącznie edytowano 1 raz
Emblemat użytkownika
Alu
 
Wiadomości: 84
Dołączył(a): N gru 21, 2003 10:47 pm

Wiadomośćprzez muzgus » So cze 18, 2005 5:14 pm

e, to nie była moja informacja, ale jak było dużo danych w oi to kolega powiedział że szybciej mu działały programy oparte na getch()
Emblemat użytkownika
muzgus
 
Wiadomości: 827
Dołączył(a): Śr gru 24, 2003 11:30 am
Lokalizacja: Hrabstwo Anin

Wiadomośćprzez muzgus » Cz cze 23, 2005 7:18 pm

poza tym ja nie mówię o printf i scanf tylko o getchar
gg: 5224983 | jabber: m [at] jabber.cz| tlen: muzgus [at] tlen.pl | icq: 314995403
(___________(Już pusto...) ___________)
Emblemat użytkownika
muzgus
 
Wiadomości: 827
Dołączył(a): Śr gru 24, 2003 11:30 am
Lokalizacja: Hrabstwo Anin

Wiadomośćprzez Alu » Cz cze 23, 2005 7:57 pm

Ale te kilka milisekund więcej, czy mniej i tak nie robi różnicy. Jak wiesz, getchar pobiera znak od użytkownika, a więc jak jest to możliwe, żeby człowiek wpisywał sto tysięcy znaków na sekundę? Dlatego właśnie nie da się zbenczmarkować tej funkcji i właśnie z tego powodu mówienie o jej szybkości jest bez sensu. Jeśli coś nie jest wykonywane wiele razy nie ma żadnej widocznej różnicy. Z resztą, część STLu skompilowana na dobrym kompilatorze ma taką samą wydajność jak jej odpowiedniki w C. Między innymi cout i cin do nich należą.
Emblemat użytkownika
Alu
 
Wiadomości: 84
Dołączył(a): N gru 21, 2003 10:47 pm


Powrót do Hyde Park



Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 36 gości

cron