Skripta, Zad. 8.1.45.
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Programiranje 1 i 2

#1: Skripta, Zad. 8.1.45. Autor/ica: patakenjac PostPostano: 21:55 čet, 26. 6. 2014
    —
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]

#2:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 22:15 čet, 26. 6. 2014
    —
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.



Forum@DeGiorgi -> Programiranje 1 i 2


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin