Strona 1 z 1
Troche total offtopu

Napisane:
Pt cze 17, 2005 10:51 am
przez Arthanis
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

Napisane:
Pt cze 17, 2005 11:06 am
przez muzgus
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)

Napisane:
Pt cze 17, 2005 11:29 am
przez Quandarthall
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
program(?)

Napisane:
Pt cze 17, 2005 12:07 pm
przez orenold
#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;
}

Napisane:
Pt cze 17, 2005 12:11 pm
przez Quandarthall
"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.
Re: program(?)

Napisane:
Pt cze 17, 2005 12:23 pm
przez Arthanis
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

Jednak dziękuję za odpowiedzi.
Pozdrawiam
Arthanis

Napisane:
Pt cze 17, 2005 1:21 pm
przez muzgus
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.

Napisane:
Pt cze 17, 2005 1:31 pm
przez Ghrhambra
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).

Napisane:
Pt cze 17, 2005 1:36 pm
przez orenold
Odnośnie mojego: Warnunek ' if (wpisana[i]!=NULL)' jest do usunięcia, mój błąd.


Napisane:
Pt cze 17, 2005 1:51 pm
przez Quandarthall
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.

Napisane:
Pt cze 17, 2005 2:26 pm
przez Arastroch.
No fajnie, ja se wchodze na forum laca, a ci o stringach gadają :D

Napisane:
Pt cze 17, 2005 2:29 pm
przez Ghrhambra
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

Napisane:
So cze 18, 2005 11:41 am
przez Alu
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
=)

Napisane:
So cze 18, 2005 12:17 pm
przez muzgus
cin jest 20 razy wolniejszy od getch() :PPPP

Napisane:
So cze 18, 2005 2:19 pm
przez Alu
muzgus napisał(a):cin jest 20 razy wolniejszy od getch() :PPPP
Tyle Ci powiem, bzdura. =P

Napisane:
So cze 18, 2005 2:28 pm
przez Alu
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]

Napisane:
So cze 18, 2005 5:14 pm
przez muzgus
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()

Napisane:
Cz cze 23, 2005 7:18 pm
przez muzgus
poza tym ja nie mówię o printf i scanf tylko o getchar

Napisane:
Cz cze 23, 2005 7:57 pm
przez Alu
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żą.