GRY-Online.pl --> Archiwum Forum

::: C++ - zadanko :::

14.01.2003
23:22
[1]

alan09 [ Konsul ]

::: C++ - zadanko :::

A wiec, zadanie polega na napisaniu funkcji, ktora doda 2 duze liczby np. 30 cyfrowe. Oczywiscie nalezy wykorzystac tablice. Piszcie jakie macie pomysly. Do tego trzeba napisac funkcje, ktora bedzie odejmowala i funkcje mnazaca takie liczby. Powodzenia!!!

14.01.2003
23:24
[2]

mORfeOoSH [ NULL ]

przeladuj operator

(dobrze pamietam? tak to sie mowi? :)

14.01.2003
23:28
[3]

alan09 [ Konsul ]

mORfeOoSH --> prosze o kod funkcji :-). Tak, to sie nazywa przeladowanie operatora.

14.01.2003
23:52
[4]

Dundee [ Centurion ]

Wiesz co koles , ty chyba sie chwilowo uczysz na uniwerku warszawskim na infie , bo wiesz tak sie sklada, ze mieszkam z kolesiem ktory ma tam taki maly projekt zaliczeniowy z programowania obiektowego, i wiesz co , wstyd, naucz sie dodawac pisemnie :)))

14.01.2003
23:56
[5]

alan09 [ Konsul ]

Dundee --> hehehe, nie ucze sie na uniwerku w W-wie, pismnie dodawac umiem (chyba :-) )
Nikt nie ma pomyslu??? Nie wierze. Przeciez jest tu tylu madrych ludzi !!!

15.01.2003
00:00
[6]

Dundee [ Centurion ]

Ok moze nie studiujesz na uniwerku ( bo widze ze z dodawaniem to raczej slabo) ale wiesz co... to z dodawaniem PISEMNYM to byla podpowiedz :)))))))).... dalej musisz poradzic sobie sam :)))))

15.01.2003
00:02
[7]

alan09 [ Konsul ]

Mam kalkulator, ale niestety brakuje podzialki :)))

15.01.2003
08:06
[8]

Eliash [ Generaďż˝ ]

alan09 -- >Z Twojego opisu nic nie wynika, dodawanie dużych liczb można zrobić np. w taki sposób:

double dodaj (double liczba1, double liczba2)

return liczba1+liczba2;


:))))

Ja nie widzę żadnego zastosowania tablic

BTW. Gdzie się uczysz ? :)

15.01.2003
08:41
[9]

Zajkos [ Generaďż˝ ]

moze chodiz o taka funkcje ktora bedzie sumowac liczby cyfra po cyfrze, czyli tak jak sie to robi na kartce papieru ręcznie?

15.01.2003
11:31
[10]

alan09 [ Konsul ]

Eliash --> widze ze jestes swietnym programista :-), ale jezeli dodajemy olbrzymie liczby np. 30 czy 70 cyfrowe to wynik jest zwracany w postaci np. 1.128347e+34, a to nie o to chodzi.
Zajkos --> tak, wlasnie chodzi o to aby dodac cyfra po cyfrze i zapisac pozniej, tez cyfra po cyfrze do tablicy. (tak jak na kartce papieru)

15.01.2003
11:33
[11]

alan09 [ Konsul ]

Dla ulatwienia pobieramy olbrzymia liczbe takze cyfra po cyfrze w petli i zapisujemy do tablicy. Potrzebne nam beda, jak widac 3 tablice, dwie na liczby pobierane od uzytkownika i jedna na wynik.

15.01.2003
11:42
[12]

Zajkos [ Generaďż˝ ]

no ale to przecież banalny program, weź się w garść i do roboty

15.01.2003
11:53
[13]

alan09 [ Konsul ]

Przygotowalem to dla Was :-)

15.01.2003
11:56
smile
[14]

Quetzalcoatl [ Konsul ]

orany, ciekawe jak doda do siebie 2 liczby 70-cio znakowe na kompie? [double]a +[double]b? ha-ha dobre. nie zapominaj ze najwiekszy typ calkowity ma zakres do ok. 4 mld, zas zmiennoprzecinkowy - okolo 1e+100 ALE pamieta tylko pierwsze 12 cyfr liczby!!

trza wiec zrobic jak alan09 podal, ale wystarczy 1 tablica i okolo 4-5 zmienne:
1)odczytujesz pierwsza liczbe znak po znaku wstawiajac do tablicy WARTOSC cyfry a nie jej kod!
2)petla od n=1 dopoki cyfry drugiej sie nie skoncza na wejsciu:
.......1)odczytujesz nastepna cyfre
.......2)dodajesz ja i przeniesienie do n-tej liczby w tablicy ( tab[n]+=x+p )
.......3)jezeli wynik dodawania przekroczyl 9 to p=tab[n]/10;tab[n]-=p*10; (to nie bedzie tosamo bo p jest calkowite!)
.......4)n++;
3) na koncu wyswietlasz tablice znak-po-znaku zamieniajac wartosc cyfry na kod znaku (bodajze kod=wartosc+48, ale glowy nie dam)

DISCLAIMER:TO jest schemat a NIE gotowy program.

15.01.2003
12:15
[15]

alan09 [ Konsul ]

Quetzalcoalt --> ja myslalem o "funkcji" ktora nie zwraca wartosc tzn. void , cos takiego:

void dodaj()

int pierwsza[40];
int druga[40];
int suma[50];
int cyfra1;
int cyfra2;
cout<<"Ile cyfr ma pierwsza liczba?"<<endl;
int ilosc1,ilosc2;
cin>>ilosc1;
cout<<"Ile cyfr ma druga liczba?"<<endl;
cin>>ilosc2;

if (ilosc1==ilosc2)

for (int i=0;i<ilosc1;i++)

cout<<"Podaj "<<i+1<<" cyfre pierwszej liczby"<<endl;
cin>>cyfra1;
pierwsza=cyfra1;

for (int j=0;j<ilosc1;j++)

cout<<"Podaj "<<j+1<<" cyfre drugiej liczby"<<endl;
cin>>cyfra2;
druga[j]=cyfra2;






Chcialem w ten sposob wypalniac tablice. Wielkosci tablic sa przykladowe. Najlepiej by bylo zrobic z tablicami dynamicznymi, ale dajmy sobie z nimi spokoj. Jeszcze na poczatku dobrze by bylo wypelnic wszystkie tablice zerami. Ten kod bedzie analogiczny dla liczb, ktore maja rozna ilosc cyfr.

15.01.2003
12:36
[16]

Zajkos [ Generaďż˝ ]

program Pierzastego też nic nie zwraca, jesli bys jednak chcial zeby funkcja cos zwracałą to musiałnby to być odnośnik do pierwszego wyrazu tablicy

15.01.2003
12:45
[17]

alan09 [ Konsul ]

Zajkos --> masz racje, tylko ja nie jestem zbyt biegly w programowaniu w C i dlatego chcialbym abyscie wysnuli jakies propozycje. Funkcja ktora napisalem na koniec poprostu wyswietli tablice w petli. Mozna by jeszcze przekazywac tablice do funkcji, ale nie bawmy sie w to. Najwazniejsze jest dodanie tych 2 liczb. Najrozsadniej nalezaloby jeszcze wypelniac tablice z wynikiem od konca. Tablice z liczbami tez mozna by tak zrobic, ale mozna ja przeczytac od konca. Jakies pomysly. Moj program dodaje liczby ale takie ktorych suma cyfr nie przekracza 9 :-), a jezeli przekracza to czasami zrobi dobrze a czasami zle.

15.01.2003
13:52
smile
[18]

Carlos3k [ Junior ]

na jakiej stronie macie e-mail ja mam na wp a wy !!

15.01.2003
15:24
[19]

alan09 [ Konsul ]

Carlos3k --> my na pw a takze na onte

15.01.2003
16:56
[20]

alan09 [ Konsul ]

^up^

15.01.2003
17:41
[21]

Rav_s [ Konsul ]

alam09 --> Małe pytanko, do czego jest Ci to potrzebne?

Jak przyjde do domu to zrobe Ci taka funkcje.

16.01.2003
01:03
[22]

Rav_s [ Konsul ]

Alan09 --> procedurka do dodawania dwoch liczb

int* dodawanie(int *liczba1, int *liczba2, int wlkLiczby)

int i, *nowaLiczba, przeniesienie = 0;
nowaLiczba = new int[wlkLiczby+1];
for (i = 0; i < wlkLiczby; i++)

nowaLiczba = liczba1+liczba2+przeniesienie;
przeniesienie = nowaLiczba/10;
nowaLiczba %= 10;

nowaLiczba[wlkLiczby] = przeniesienie;
return nowaLiczba;


Uwagi:
- obie liczby maja rownej dlugosci tablicy; zrobienie z roznymi dlugosciami tez nie jest problemem, ale mysle ze to Ci wystarczy
- ciag komorek w tablicy a[0] = 6, a[1] = 5, a[2] = 2; oznacza liczbe 256,
- gdy zmienisz dzielenie oraz dzielenie modulo z 10 na inna liczbe to dostaniesz inny system liczbowy, tzn rownie dobrze mozesz dodawac ta procedura dwojkowo (gdy zmienisz na 2), jak i 16. Mozesz tez dodawac w systemie 2 mln :) Ograniczenie na to jest tylko taki zeby nie przekraczac miliarda z kawalekiem.
- przyklad wyswietlania na ekran
int a[3], b[3], *c;
a[0] = 6;
a[1] = 5;
a[2] = 2;
b[0] = 6;
b[1] = 5;
b[2] = 2;
c = dodawanie(a, b, 3);
printf("%d%d%d%d\n",c[3],c[2],c[1],c[0]);

Jak by cos nie gralo to daj znac co to poprawie.

16.01.2003
01:11
[23]

Rav_s [ Konsul ]

Alan09 --> Jeszcze raz ta procedurka, bo zapomnialem ze gdy wpisze i w nawiasach kwadrtowych to na forum mi tego nie wyswietli tylko wlaczy sie italic. Rozni sie tylko tym, ze zmienilem nazwe zmiennej z i na k. I jeszcze mi sie przypomnialo, zebys po tym wyswietleniu zwolnil pamiec liczby, ktora dostales, po dodawaniu.


int* dodawanie(int *liczba1, int *liczba2, int wlkLiczby)

int k, *nowaLiczba, przeniesienie = 0;
nowaLiczba = new int[wlkLiczby+1];
for (k = 0; k < wlkLiczby; k++)

nowaLiczba[k] = liczba1[k]+liczba2[k]+przeniesienie;
przeniesienie = nowaLiczba[k]/10;
nowaLiczba[k] %= 10;

nowaLiczba[wlkLiczby] = przeniesienie;
return nowaLiczba;

16.01.2003
01:42
[24]

Quetzalcoatl [ Konsul ]

o chryste, ludzie, zlitujcie sie. PO CO alokowac 130 INT'ow na 130-to znakowa liczbe? zmiencie to na chary. przeciez cyfra to 0...9 wiec po co wam az 4-bajtowy zakres 0...4mld ?? Racja przy wysoko podstawowych systemach moze i to sie przyda, ale po kiego diabla tutaj? :))

>printf("%d%d%d%d\n",c[3],c[2],c[1],c[0]);
tia, zapisz tak wyswietlanie tablicy c[130] :))

for(int X=0;X<stab_size;X++)printf("%c",c[X]+48); //zakladajac ze w c[X] masz wartosc cyfry, ach zreszta, co mi szkodzi..

//******* wszystko dziala, jezeli postepujesz zgodnie z instrukcja, i nie dajesz mu liter zamiast cyfr.
//******* kod jest prosty, wiec zostawiam bez komentarzy
//******* obsluga bledow zerowa. sprawdza jedynie czy liczby nie sa wieksze niz zadeklarowane i nadmiarowe
//******* poprostu omija

void main()
‹ char*liczba=0,*liczba2=0,c=0,p=0;
int max_size=0,x=0;
printf("Podaj dlugosc liczb (ilosc cyfr): ");scanf("%u",&max_size);fflush(stdin);
printf("\n");
liczba=new char[max_size+2];liczba2=new char[max_size+2];
for(x=0;x<max_size+2;x++)‹liczba[x]=0;liczba2[x]=0;›
x=max_size;c=0;
printf("Wpisz pierwsza liczbe (dopisz zera z poczatku, aby dlugosc sie zgadzala): ");
while( x>0&&(c=getc(stdin))!=10&&c!=13)
‹ if(c)‹liczba[x-1]=c-48;x--;› ›
printf("\n");fflush(stdin);
printf("Wpisz druga liczbe (dopisz zera z poczatku, aby dlugosc sie zgadzala): ");
x=max_size;c=0;
while( x>0&&(c=getc(stdin))!=10&&c!=13)
‹ if(c)‹liczba2[x-1]=c-48;x--;› ›
printf("\n");fflush(stdin);
x=0;p=0;c=0;
while( x<max_size )
‹ if(liczba2[x])
‹ liczba[x]+=p+liczba2[x];
if(liczba[x]>9)‹p=liczba[x]/10;liczba[x]-=p*10;›
x++;
›else break;

if(p)liczba[x]=p;
x=max_size;
printf("\nA oto i wynik: ");
while( x>0 )‹printf("%c",liczba[x-1]+48);x--;›
printf("\n");
delete[]liczba;liczba=0;delete[]liczba2;liczba2=0;

16.01.2003
01:47
[25]

Quetzalcoatl [ Konsul ]

to jest dosc czerstwy kod, w koncu nie siedzialem nawet 15 minut :)) nalezy dodac wodostryski, rozroznic obie tablice aby mialy rozne rozmiary, w zaleznosci ile dana liczba ma cyfr (tzn. po to aby nie trzeba bylo zer z przodu dopisywac) etc. chodzi mi tylko o to jak to powinno wygladac, aby nie zajmowalo duzo a dzialalo poprawnie (mam nadzieje, nie odwalalem idiot-testow, ani testow dla liczb ponad 10 znakow, bo mi sie sprawdzac wyniku nie chcialo :))

16.01.2003
02:18
[26]

alan09 [ Konsul ]

Quetzalcoatl --> pieknie, ale co z liczbami o roznych dlugosciach???

16.01.2003
02:22
[27]

Rav_s [ Konsul ]

Quetzalcoatl -->
Co do intow to zgoda, rzadko kiedy uzywam charow, gdyz skupiajac sie na efektywnosci (oraz zajetosci programu) czesto zapomina sie o jego przejrzystosci oraz przenosnosci, co widac po Twoim programie.

To wypisywanie tablicy to tylko przyklad na jakim sprawdzalem czy wszystko dziala poprawnie. Nie chcialo mi sie petli pisac, ani tym bardziej wprowadzac danych z klawiatury.

16.01.2003
10:12
smile
[28]

alan09 [ Konsul ]

No to chyba koniec :-( Najblizszy calkowitego rozwiazania byl Quetzalcoatl, ale w jego propozycji nie bylo obslugi liczb o roznych dlugosciach, brak odejmowania i mnozenia, w koncu pisal kod niecale 15 minut :-))) Ale i tak bardzo dobry programik. Jezeli ktos jeszcze chce sie pobawic to zapraszam.

16.01.2003
12:37
[29]

Rav_s [ Konsul ]

alan09 --> Na drugi raz lepiej definiuj to co chcesz uzyskac. Napisales ze chcesz funkcje ktora dodaje dwie liczby, a nie program ktory dodaje dwie liczby.

16.01.2003
13:23
[30]

alan09 [ Konsul ]

Quetzalcoatl --> chyba mialem glowe w d*** piszac ze twoj program nie dodaje liczb o roznych dlugosciach. Wielkie SORRY. :-)

Rav_s --> hmm, co za roznica, moze byc program, pozniej mozna zrobic z niego funkcje. A tak w ogole to Quetzalcoatl napisal funkcje tyklo ze main, :-)))

16.01.2003
14:46
[31]

alan09 [ Konsul ]

^up^

© 2000-2024 GRY-OnLine S.A.