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

Skripta, Zad. 8.1.45. (zadatak)
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
patakenjac
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 23. 10. 2011. (17:34:05)
Postovi: (2F)16
Sarma = la pohva - posuda
= 3 - 3

PostPostano: 21:55 čet, 26. 6. 2014    Naslov: Skripta, Zad. 8.1.45. Citirajte i odgovorite

Pozdrav, može pomoć oko zadatka 8.1.45. iz Šegine Skripte za Prog2?
U uputi kaže da argument list mora bit tipa team**. Ne razumijem zašto nije team*, to mi se čini logičnije.
Ovo je moj kod za koji mi ne javlja nikakvu grešku ali kad pokrenem i unesem nazive datoteka, ruši se. :(
Unaprijed hvala!

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

typedef struct{
char name[51];
int score;
}team;
int teamInd (char name[],team *list,int *n)
{
int i;
for(i=0;i<(*n);i++) if(strcmp(name, list[i].name)==0)return i;

list=(team*)realloc(list,((*n)+1)*sizeof(team));

strcpy(list[i].name,name);
list[(*n)].score=0;
(*n)++;
return i;
}
void football(char iname[],char oname[])
{
FILE *in,*out;
int n=0,s1,s2,i1,i2;
team *list;
list=(team*)malloc(sizeof(team));

char t1[51],t2[51];

in=fopen(iname,"rt");
if(in==NULL){printf("GReska!");exit(-1);}
out=fopen(oname,"wt");
if(out==NULL){printf("GReska!"); fclose(in); exit(-2);}
int k=fscanf(in,"%[^:]:%[^=]=%d:%d ",t1,t2,&s1,&s2);
if(k!=4){printf("Greska!");exit(-3);}
while(k==4)
{
i1=teamInd(t1,list,&n);
i2=teamInd(t2,list,&n);
if(s1<s2) list[i2].score+=3;
else if(s1>s2) list[i1].score+=3;
else{ list[i1].score++;
list[i2].score++;}

}

fclose(in);
for(i1=0;i1<n;i1++)
for(i2=i1+1;i2<n;i2++)
if(list[i1].score<list[i2].score){
team tmp=list[i1];
list[i1]=list[i2];
list[i2]=tmp;
}

for(i1=0;i1<n;i1++)
fprintf(out, "%d. %s (%d)\n",i1+1, list[i1].name,list[i1].score);
free(list);
fclose(out);
}
int main (void)
{
char ime1[20],ime2[20];
printf("Upisi ime ulazne datoteke:");
scanf("%s",ime1);
printf("Upisi ime izlazne datoteke:");
scanf("%s",ime2);
football(ime1,ime2);
return 0;
}
[/code:1][/b]
Pozdrav, može pomoć oko zadatka 8.1.45. iz Šegine Skripte za Prog2?
U uputi kaže da argument list mora bit tipa team**. Ne razumijem zašto nije team*, to mi se čini logičnije.
Ovo je moj kod za koji mi ne javlja nikakvu grešku ali kad pokrenem i unesem nazive datoteka, ruši se. Sad
Unaprijed hvala!

Kod:

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

typedef struct{
   char name[51];
   int score;
  }team;
int teamInd (char name[],team *list,int *n)
   {
      int i;
      for(i=0;i<(*n);i++) if(strcmp(name, list[i].name)==0)return i;
      
      list=(team*)realloc(list,((*n)+1)*sizeof(team));
      
      strcpy(list[i].name,name);
      list[(*n)].score=0;
      (*n)++;
      return i;
      }
void football(char iname[],char oname[])
 {
   FILE *in,*out;
   int n=0,s1,s2,i1,i2;
   team *list;
   list=(team*)malloc(sizeof(team));
   
   char t1[51],t2[51];
   
   in=fopen(iname,"rt");
   if(in==NULL){printf("GReska!");exit(-1);}
   out=fopen(oname,"wt");
   if(out==NULL){printf("GReska!"); fclose(in); exit(-2);}
   int k=fscanf(in,"%[^:]:%[^=]=%d:%d ",t1,t2,&s1,&s2);
   if(k!=4){printf("Greska!");exit(-3);}
   while(k==4)
      {
         i1=teamInd(t1,list,&n);
         i2=teamInd(t2,list,&n);
         if(s1<s2) list[i2].score+=3;
         else if(s1>s2) list[i1].score+=3;
         else{ list[i1].score++;
               list[i2].score++;}
      
      }
      
   fclose(in);
   for(i1=0;i1<n;i1++)
      for(i2=i1+1;i2<n;i2++)
         if(list[i1].score<list[i2].score){
            team tmp=list[i1];
            list[i1]=list[i2];
            list[i2]=tmp;
         }
   
   for(i1=0;i1<n;i1++)
            fprintf(out, "%d. %s (%d)\n",i1+1, list[i1].name,list[i1].score);
   free(list);         
   fclose(out);
}      
int main (void)
{
   char ime1[20],ime2[20];
   printf("Upisi ime ulazne datoteke:");
   scanf("%s",ime1);
   printf("Upisi ime izlazne datoteke:");
   scanf("%s",ime2);
   football(ime1,ime2);
   return 0;
}
[/b]


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (353C)16
Spol: zombi
Sarma = la pohva - posuda
849 = 1063 - 214
Lokacija: /sbin/init

PostPostano: 22:15 čet, 26. 6. 2014    Naslov: Citirajte i odgovorite

Ako napravis [tt]team *list[/tt], onda je [tt]list[/tt] lokalna varijabla. Kad napravis [tt]list = ...[/tt], promijenio si lokalnu varijablu, pa [tt]list[/tt] u [tt]football()[/tt] ne promijeni vrijednost.

Kad napravis [tt]team **list[/tt], onda je [tt]list[/tt] opet lokalna varijabla, no pridruzivanje koje ces raditi je [tt]*list = ...[/tt], a poziv ce biti [tt]i1 = teamInd(t1, [color=red]&[/color]list, &n);[/tt], sto znaci da mijenjas ono na sto pokazuje [tt]list[/tt], a to je [tt]list[/tt] iz [tt]football()[/tt] (tj. ta dva [tt]list[/tt] nisu istog tipa, nego ovaj iz [tt]teamInd()[/tt] pokazuje na ovoga u [tt]football()[/tt]!).

Postavi stvar ovako:
[tt]typedef *team listType;[/tt]
Tada u [tt]football()[/tt] imas varijablu
[tt]listType list;[/tt]
Kako ces ju poslati u funkciju koja ju (bas tu varijablu, ne ono na sto ona pokazuje) treba promijeniti? Jednako kako bi poslao i [tt]int[/tt], ne? Princip za [tt]listType[/tt] je isti. A onda uvrstis da je [tt]listType[/tt] zapravo [tt]*team[/tt].

Nadam se da je sada jasnije.
Ako napravis team *list, onda je list lokalna varijabla. Kad napravis list = ..., promijenio si lokalnu varijablu, pa list u football() ne promijeni vrijednost.

Kad napravis team **list, onda je list opet lokalna varijabla, no pridruzivanje koje ces raditi je *list = ..., a poziv ce biti i1 = teamInd(t1, &list, &n);, sto znaci da mijenjas ono na sto pokazuje list, a to je list iz football() (tj. ta dva list nisu istog tipa, nego ovaj iz teamInd() pokazuje na ovoga u football()!).

Postavi stvar ovako:
typedef *team listType;
Tada u football() imas varijablu
listType list;
Kako ces ju poslati u funkciju koja ju (bas tu varijablu, ne ono na sto ona pokazuje) treba promijeniti? Jednako kako bi poslao i int, ne? Princip za listType je isti. A onda uvrstis da je listType zapravo *team.

Nadam se da je sada jasnije.



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne 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 cannot 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