Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Za nadobudnije
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Računarski praktikum 1
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
Crni
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43)
Postovi: (23C)16
Spol: muško
Sarma = la pohva - posuda
= 29 - 25
Lokacija: Zagreb

PostPostano: 23:31 sri, 28. 4. 2004    Naslov: Za nadobudnije Citirajte i odgovorite

Pričal' mi je frend kaj inače ne ide u moju grupu za RP1 da su imali za zadatak napisat' neki "ultrateški" program kaj zbraja dva prirodna broja na način kak se to inače radi na papiru (osnovna škola) pomoću pointera. Rekel' mi je da nikom živom u grupi stvar nije šljakala kak' spada. OK, ja si mislim ono, idem probat'. I uspio sam! 8) Dakle vi nadobudniji, uživajte. Crni je sredil' stvar! 8)

[code:1]#include <stdio.h>
#include <malloc.h>

int max (int a, int b)
{
if (a>=b)
return a;
else
return b;
}

int brz (int a)
{
int s,p;
s=0;
if (a==0)
return 1;
else
{
p=a;
while (p!=0)
{
p=p/10;
s++;
}
return s;
}
}

int prvaz (int a)
{
int p;
p=(a/10)*10;
return a-p;
}

int mem (int a)
{
if (a>=10)
return 1;
else
return 0;
}

void glavna (int a, int b)
{
int *p,*q,*r,br,i,g1,g2,t;
br=brz(max(a,b));
p=(int *) malloc((br+2)*sizeof(int));
q=(int *) malloc((br+2)*sizeof(int));
r=(int *) malloc((br+2)*sizeof(int));
g1=a;
g2=b;
for (i=0; i<=br; i++)
{
p[i]=prvaz(g1);
g1=g1/10;
q[i]=prvaz(g2);
g2=g2/10;
}
t=0;

/*----------Pazi sad ovo! Ključni dio!------------------------*/
for (i=0; i<=br; i++)
{
r[i]=prvaz(p[i]+q[i]+t);
t=mem(p[i]+q[i]+t);
}
/*--------------------------------------------------------------*/

for (i=br; i>=0; i--)
printf("%d",p[i]);
printf("\n");
for (i=br; i>=0; i--)
printf("%d",q[i]);
printf("\n");
for (i=br; i>=0; i--)
printf("%d",r[i]);
free(p);
free(q);
free(r);
}

main()
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
glavna(a,b);
scanf("\n");
}[/code:1]
Pričal' mi je frend kaj inače ne ide u moju grupu za RP1 da su imali za zadatak napisat' neki "ultrateški" program kaj zbraja dva prirodna broja na način kak se to inače radi na papiru (osnovna škola) pomoću pointera. Rekel' mi je da nikom živom u grupi stvar nije šljakala kak' spada. OK, ja si mislim ono, idem probat'. I uspio sam! Cool Dakle vi nadobudniji, uživajte. Crni je sredil' stvar! Cool

Kod:
#include <stdio.h>
#include <malloc.h>

int max (int a, int b)
{
 if (a>=b)
  return a;
 else
  return b;
}

int brz (int a)
{
 int s,p;
 s=0;
 if (a==0)
  return 1;
 else
 {
  p=a;
  while (p!=0)
  {
   p=p/10;
   s++;
  }
  return s;
 }
}

int prvaz (int a)
{
 int p;
 p=(a/10)*10;
 return a-p;
}

int mem (int a)
{
 if (a>=10)
  return 1;
 else
  return 0;
}

void glavna (int a, int b)
{
 int *p,*q,*r,br,i,g1,g2,t;
 br=brz(max(a,b));
 p=(int *) malloc((br+2)*sizeof(int));
 q=(int *) malloc((br+2)*sizeof(int));
 r=(int *) malloc((br+2)*sizeof(int));
 g1=a;
 g2=b;
 for (i=0; i<=br; i++)
 {
  p[i]=prvaz(g1);
  g1=g1/10;
  q[i]=prvaz(g2);
  g2=g2/10;
 }
 t=0;

/*----------Pazi sad ovo! Ključni dio!------------------------*/
 for (i=0; i<=br; i++)
 {
  r[i]=prvaz(p[i]+q[i]+t);
  t=mem(p[i]+q[i]+t);
 }
/*--------------------------------------------------------------*/

 for (i=br; i>=0; i--)
  printf("%d",p[i]);
 printf("\n");
 for (i=br; i>=0; i--)
  printf("%d",q[i]);
 printf("\n");
 for (i=br; i>=0; i--)
  printf("%d",r[i]);
 free(p);
 free(q);
 free(r);
}

main()
{
 int a,b;
 scanf("%d",&a);
 scanf("%d",&b);
 glavna(a,b);
 scanf("\n");
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
satan
Gost





PostPostano: 12:06 sri, 2. 6. 2004    Naslov: Citirajte i odgovorite

u momak, svaka ti dala
u momak, svaka ti dala


[Vrh]
GauSs_
Moderator
Moderator


Pridružen/a: 28. 01. 2004. (21:01:17)
Postovi: (53C)16
Spol: muško
Sarma = la pohva - posuda
72 = 110 - 38
Lokacija: 231

PostPostano: 12:20 sri, 2. 6. 2004    Naslov: Citirajte i odgovorite

evo vam i jedna implementacija pomocu vezanih lista radjena na
proslogodisnjim vjezbama( proizvoljno veliki prirodni brojevi) :
[code:1]
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct cvor_liste *veza;

struct cvor_liste{

int a;

veza iduci;

};


veza inverzna_lista(veza );
int zbrajanje( veza , veza );

int main(){

veza x, pocetak_liste1, pocetak_liste2, trenutni1, trenutni2;
char tmp;
int help;

puts("Ovaj program prihvaca broj sve dok se ne upise nesto razlicito od znamenke(0-9)");

x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
printf("\nUnesite pozitivan cijeli broj_1:\n");
tmp=getchar();
if(!isdigit(tmp)){
puts("Bilo bi lijepo kada biste pozitivan cijeli upisali broj");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
pocetak_liste1=x;
while(isdigit(tmp)){
tmp=getchar();
if(isdigit(tmp)){
x=(x->iduci=(veza) malloc(sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
}
}

/*printf("\n%c\n", x->a);*/

x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
printf("\nUnesite pozitivan cijeli broj_2:\n");
tmp=getchar();
if(!isdigit(tmp)){
puts("Bilo bi lijepo kada biste upisali pozitivan cijeli broj");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
pocetak_liste2=x;
while(isdigit(tmp)){
tmp=getchar();
if(isdigit(tmp)){
x=(x->iduci=(veza) malloc(sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
}
}

/*printf("\n%c\n", x->a);*/

printf("\nZa mnozenje pritisnite 1( nije implementirano), a za zbrajanje 2:\t");
scanf("%d", &help);
switch(help){
case 2:
if(!zbrajanje( inverzna_lista(pocetak_liste1), inverzna_lista(pocetak_liste2))){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
break;
case 1:
default:
puts("\nMislim stvarno ste bezobrazni!!! Zar ne znate citati???\n");
break;
}


return 0;
}

veza inverzna_lista(veza pocetni){

veza y, t, inverzna;

inverzna=NULL;
y=pocetni;

while(y!=NULL){

t=y->iduci;
y->iduci=inverzna;
inverzna=y;
y=t;
}
return inverzna;

}

int zbrajanje( veza pocetak1, veza pocetak2){

veza trenutni;
veza pocetak3, x, rez1;
int tmp;
x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+(pocetak2->a))%10;
tmp=((pocetak1->a)+(pocetak2->a))/10;
pocetak3=x;

while((pocetak1->iduci)!=NULL && (pocetak2->iduci)!=NULL){

pocetak1=pocetak1->iduci; pocetak2=pocetak2->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+(pocetak2->a)+tmp)%10;
tmp=((pocetak1->a)+(pocetak2->a)+tmp)/10;

}
if((pocetak1->iduci)==NULL){

while((pocetak2->iduci)!=NULL){
pocetak2=pocetak2->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak2->a)+tmp)%10;
tmp=((pocetak2->a)+tmp)/10;
}
}
if((pocetak2->iduci)==NULL){

while((pocetak1->iduci)!=NULL){
pocetak1=pocetak1->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10;
}
}

x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=tmp;
x->iduci=NULL;
rez1=inverzna_lista(pocetak3);
trenutni=rez1;

printf("\nZbroj je:\t");
while(rez1!=NULL){
printf("%d", rez1->a);
trenutni=rez1;
rez1=rez1->iduci;
free(trenutni);
}
printf("\n");

return 1;
}
[/code:1]
========
8) :lol: 8)
evo vam i jedna implementacija pomocu vezanih lista radjena na
proslogodisnjim vjezbama( proizvoljno veliki prirodni brojevi) :
Kod:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct cvor_liste *veza;

struct cvor_liste{

   int a;

   veza iduci;

};


veza inverzna_lista(veza );
int zbrajanje( veza , veza );

int main(){

   veza x, pocetak_liste1, pocetak_liste2, trenutni1, trenutni2;
   char tmp;
   int help;

   puts("Ovaj program prihvaca broj sve dok se ne upise nesto razlicito od znamenke(0-9)");

   x=(veza) malloc( sizeof(*x));
   if(x==NULL){
      puts("Pogreska pri alociranju memorije!!!");
      return 1;
   }
   printf("\nUnesite pozitivan cijeli broj_1:\n");
   tmp=getchar();
   if(!isdigit(tmp)){
      puts("Bilo bi lijepo kada biste pozitivan cijeli upisali broj");
      return 1;
   }
   x->a=atoi(&(tmp));
   x->iduci=NULL;
   pocetak_liste1=x;
   while(isdigit(tmp)){
      tmp=getchar();
      if(isdigit(tmp)){
         x=(x->iduci=(veza) malloc(sizeof(*x)));
         if(x==NULL){
            puts("Pogreska pri alociranju memorije!!!");
            return 1;
         }
         x->a=atoi(&(tmp));
         x->iduci=NULL;
      }
   }
   
   /*printf("\n%c\n", x->a);*/

   x=(veza) malloc( sizeof(*x));
   if(x==NULL){
      puts("Pogreska pri alociranju memorije!!!");
      return 1;
   }
   printf("\nUnesite pozitivan cijeli broj_2:\n");
   tmp=getchar();
   if(!isdigit(tmp)){
      puts("Bilo bi lijepo kada biste upisali pozitivan cijeli broj");
      return 1;
   }
   x->a=atoi(&(tmp));
   x->iduci=NULL;
   pocetak_liste2=x;
   while(isdigit(tmp)){
      tmp=getchar();
      if(isdigit(tmp)){
         x=(x->iduci=(veza) malloc(sizeof(*x)));
         if(x==NULL){
            puts("Pogreska pri alociranju memorije!!!");
            return 1;
         }
         x->a=atoi(&(tmp));
         x->iduci=NULL;
      }
   }
   
   /*printf("\n%c\n", x->a);*/
   
   printf("\nZa mnozenje pritisnite 1( nije implementirano), a za zbrajanje 2:\t");
   scanf("%d", &help);
   switch(help){
      case 2:
         if(!zbrajanje( inverzna_lista(pocetak_liste1), inverzna_lista(pocetak_liste2))){
            puts("Pogreska pri alociranju memorije!!!");
            return 1;
         }
         break;
      case 1:
      default:
         puts("\nMislim stvarno ste bezobrazni!!! Zar ne znate citati???\n");
         break;
   }
   
   
   return 0;
}

veza inverzna_lista(veza pocetni){

   veza y, t, inverzna;

   inverzna=NULL;
   y=pocetni;

   while(y!=NULL){

      t=y->iduci;
      y->iduci=inverzna;
      inverzna=y;
      y=t;
    }
   return inverzna;
   
}

int zbrajanje( veza pocetak1, veza pocetak2){
   
   veza trenutni;
   veza pocetak3, x, rez1;
   int tmp;
   x=(veza) malloc( sizeof(*x));
   if(x==NULL){
      puts("Pogreska pri alociranju memorije!!!");
      return 0;
   }
   x->a=((pocetak1->a)+(pocetak2->a))%10;
   tmp=((pocetak1->a)+(pocetak2->a))/10;
   pocetak3=x;
      
   while((pocetak1->iduci)!=NULL && (pocetak2->iduci)!=NULL){
      
      pocetak1=pocetak1->iduci; pocetak2=pocetak2->iduci;
      x=(x->iduci=(veza) malloc( sizeof(*x)));
      if(x==NULL){
      puts("Pogreska pri alociranju memorije!!!");
      return 0;
   }
      x->a=((pocetak1->a)+(pocetak2->a)+tmp)%10;
      tmp=((pocetak1->a)+(pocetak2->a)+tmp)/10;
      
   }
   if((pocetak1->iduci)==NULL){

      while((pocetak2->iduci)!=NULL){
         pocetak2=pocetak2->iduci;
         x=(x->iduci=(veza) malloc( sizeof(*x)));
         if(x==NULL){
            puts("Pogreska pri alociranju memorije!!!");
            return 0;
         }
         x->a=((pocetak2->a)+tmp)%10;
         tmp=((pocetak2->a)+tmp)/10;
      }
   }
   if((pocetak2->iduci)==NULL){

      while((pocetak1->iduci)!=NULL){
         pocetak1=pocetak1->iduci;
         x=(x->iduci=(veza) malloc( sizeof(*x)));
         if(x==NULL){
            puts("Pogreska pri alociranju memorije!!!");
            return 0;
         }
         x->a=((pocetak1->a)+tmp)%10;
         tmp=((pocetak1->a)+tmp)/10;
      }
   }

   x=(x->iduci=(veza) malloc( sizeof(*x)));
   if(x==NULL){
      puts("Pogreska pri alociranju memorije!!!");
      return 0;
   }
   x->a=tmp;
   x->iduci=NULL;
   rez1=inverzna_lista(pocetak3);
   trenutni=rez1;
   
   printf("\nZbroj je:\t");
   while(rez1!=NULL){
      printf("%d", rez1->a);
      trenutni=rez1;
      rez1=rez1->iduci;
      free(trenutni);
   }
   printf("\n");
   
   return 1;
}

========
Cool Laughing Cool


[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
bingo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 05. 11. 2002. (18:03:08)
Postovi: (31)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 10:30 sub, 5. 6. 2004    Naslov: Citirajte i odgovorite

Jao Gauss, pa ovo :
[code:1] x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10;
[/code:1]
je grozno sporo! Kod Crnog je bolje:

[code:1]
r[i]=prvaz(p[i]+q[i]+t);
t=mem(p[i]+q[i]+t);

int mem (int a)
{
if (a>=10)
return 1;
else
return 0;
}
[/code:1]

Ali i Crni ima gresku kod ucitavanja "velikih" brojeva:

int a,b; <----- :shock:
scanf("%d",&a);
scanf("%d",&b);
glavna(a,b);

I ako vec uzimate int za znamenku onda je uputno uzeti sto vecu bazu tako da je 2b-1 < maxInt.
Ipak, Gauss je primjetio da se isplati provjeravati duljinu broja, pa nakon sto kracem nestanu znamenke, samo propagirati prijenos. Ali taj prijenos propagiras samo dok su ti u duzem broju znamenke (b-1) a nakon toga samo kopiras znamenke. I da budem sitnicav do kraja, dinamicka alokacije je osjetno sporija od upotrebe polja, pa ako se ima iole kakva predodzba o duzini broja, onda je uputno koristiti fiksno polje.
Jao Gauss, pa ovo :
Kod:
 x->a=((pocetak1->a)+tmp)%10;
         tmp=((pocetak1->a)+tmp)/10;

je grozno sporo! Kod Crnog je bolje:

Kod:

r[i]=prvaz(p[i]+q[i]+t);
  t=mem(p[i]+q[i]+t);

int mem (int a)
{
 if (a>=10)
  return 1;
 else
  return 0;
}


Ali i Crni ima gresku kod ucitavanja "velikih" brojeva:

int a,b; <----- Shocked
scanf("%d",&a);
scanf("%d",&b);
glavna(a,b);

I ako vec uzimate int za znamenku onda je uputno uzeti sto vecu bazu tako da je 2b-1 < maxInt.
Ipak, Gauss je primjetio da se isplati provjeravati duljinu broja, pa nakon sto kracem nestanu znamenke, samo propagirati prijenos. Ali taj prijenos propagiras samo dok su ti u duzem broju znamenke (b-1) a nakon toga samo kopiras znamenke. I da budem sitnicav do kraja, dinamicka alokacije je osjetno sporija od upotrebe polja, pa ako se ima iole kakva predodzba o duzini broja, onda je uputno koristiti fiksno polje.


[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
GauSs_
Moderator
Moderator


Pridružen/a: 28. 01. 2004. (21:01:17)
Postovi: (53C)16
Spol: muško
Sarma = la pohva - posuda
72 = 110 - 38
Lokacija: 231

PostPostano: 13:53 sub, 5. 6. 2004    Naslov: Citirajte i odgovorite

[quote="bingo"]I da budem sitnicav do kraja, dinamicka alokacije je osjetno sporija od upotrebe polja, pa ako se ima iole kakva predodzba o duzini broja, onda je uputno koristiti fiksno polje.[/quote]

zanimljiva sitnicavost! ali kao sto napisah:
[quote="GauSs_"]evo vam i jedna implementacija pomocu vezanih lista radjena na
proslogodisnjim vjezbama( proizvoljno veliki prirodni brojevi) [/quote]

a zadatak je glasio:
[code:1]Napisite program koji realizira zbrajanje i mnozenje proizvoljno velikih pozitivnih cijelih brojeva zapisanih u dekadskom sustavu. Brojeve realizirajte kao vezane liste.[/code:1]

[quote="bingo"]
Jao Gauss, pa ovo :
[code:1] x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10; [/code:1]
je grozno sporo![/quote]
primjedba stoji!
bingo (napisa):
I da budem sitnicav do kraja, dinamicka alokacije je osjetno sporija od upotrebe polja, pa ako se ima iole kakva predodzba o duzini broja, onda je uputno koristiti fiksno polje.


zanimljiva sitnicavost! ali kao sto napisah:
GauSs_ (napisa):
evo vam i jedna implementacija pomocu vezanih lista radjena na
proslogodisnjim vjezbama( proizvoljno veliki prirodni brojevi)


a zadatak je glasio:
Kod:
Napisite program koji realizira zbrajanje i mnozenje proizvoljno velikih pozitivnih cijelih brojeva zapisanih u dekadskom sustavu. Brojeve realizirajte kao vezane liste.


bingo (napisa):

Jao Gauss, pa ovo :
Kod:
 x->a=((pocetak1->a)+tmp)%10;
 tmp=((pocetak1->a)+tmp)/10;

je grozno sporo!

primjedba stoji!



_________________
The purpose of life is to end
Malo sam lose volje...

Prosle su godine kolokviji bili laksi, zar ne?
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Računarski praktikum 1 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You can attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan