sortowanie liczb - pliki

0

Mam taki problem, otóż mam w pliku pary liczb

np:

 -2 5
31 3
43 23
513 1
34 3
2 4

i mam je posortować. Jeżeli dwie lub więcej par mają taką samą pierwszą liczbę to sprawdzam drugą liczbę w parze.

Jak to zapisać do tablicy dwuwymiarowej? Bo chyba tak będzie najlepiej t[i][j]
w i będą pierwsze liczby z pary a w j drugie liczby z pary
Jestem początkujący. Z góry dziękuję za pomoc.

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

int main(int argc, void *argv[])
{

int tab[10][10];
int i,j;
    FILE *fin=fopen(argv[1], "r");
    FILE *fout=fopen(argv[2], "w");
    if(!fin)
    {
        printf("Blad odczytu pliku do odczytu");
        exit (2);
    }

for(j=0; j<=10; j++)
    for(i=0; i<=10; i++)
	fscanf(fin, "%i", &tab[i][j]);


for(j=0; j<=10; j++)
    for(i=0; i<=10; i++)
	printf("%i\n",tab[i][j], " ");

return 0;
}

Mam jak na razie coś takiego, ale coś mam nie tak bo nie działa :(

3

Na co Ci 10 kolumn? Przecież masz pary liczb, czyli w każdym wierszu są tylko 2 liczby.

A w ogóle to lepiej pary liczb zapisać do struktury, potem będzie łatwiej na nich operować.

for(j=0; j<=10

Tablica 10-elementowa nie ma indeksu nr 10.

Skoro i jest wierszem a j kolumną, to trzeba iterować

for (i = 0; i <
    for (j = 0; j < 
3

A gdzie sortujesz? Tego nie widzę w kodzie


`int tab[10][10];` — Chcesz mieć 10 par razem 20 liczb (tak rozumiem z Twojego opisu), czy tablicę 10x10 liczb razem 100? Tak by wynikało z kodu, z deklaracji tablicy i ze sposobu w jaki leci pętla
`for(j=0; j<=10; j++)` — Zdajesz sobie sprawę, że ta pętla przeleci 11 razy, a nie dziesięć? Zdajesz sobie sprawę, że używasz 10. indeksu tablicy, który jest niepoprawny? (Twoja tablica ma poprawne indeksy od 0. do 9.)
0

I jeszcze:
FILE *fout=fopen(argv[2], "w");
printf("%i\n",tab[i][j], " ");
Na pewno zamierzone? Otwierasz plik do zapisu, by potem pisać na standardowe wyjście?


Masz `fopen`, a gdzie `fclose`?
4

Człowieku, ty się nie uczysz niczego!
Powtarzam raz jeszcze:

  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Nie nadużywaj inkrementacji przyrostkowej: http://4programmers.net/Forum/1101404 for(int i=0;i<n;++i) - zadziała tak samo jak for(int i=0;i<n;i++) ale uchroni przed ewentualnymi problemami
  3. Co ma się stać jak w pliku będzie mniej niż 10 par?
  4. Lepiej stwórz strukturę bo inaczej użycie qsort będzie nieco bardziej skomplikowane.

Powinno być coś w stylu:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
typedef struct { int a,b; } Pair;
typedef int CMP(const void *a,const void *b);

int cmp(const Pair *p,const Pair *q)
  {
   int ret=((p->a)>(q->a))-((p->a)<(q->a));
   return ret?ret:(((p->b)>(q->b))-((p->b)<(q->b)));
  }

void fatal(int bad,const char *err)
  {
   if(!bad) return;
   fprintf(stderr,"%s\n",err);
   exit(bad);
  }

int main(int argc, void *argv[])
  {
   Pair tab[100];
   const size_t size=sizeof(tab)/sizeof(*tab);
   size_t count,i;
   FILE *fin;
   fatal(argc<2,"Nie podano pliku do odczytu");
   fin=fopen(argv[1],"r");
   fatal(!fin,"Blad otwarcia pliku do odczytu");   
   for(count=0;(count<size)&&(fscanf(fin,"%d%d",&tab[count].a,&tab[count].b)==2);++count) {}
   fclose(fin);
   qsort(tab,count,sizeof(Pair),(CMP*)cmp);
   for(i=0;i<count;++i) printf("%d %d\n",tab[i].a,tab[i].b);
   return 0;
  }
0
#include <stdlib.h>
#include <stdio.h>

int main(int argc, void *argv[])
{

int tab[10][2];
int i,j;
    FILE *fin=fopen(argv[1], "r");
    FILE *fout=fopen(argv[2], "w");
    if(!fin)
    {
        printf("Blad odczytu pliku do odczytu");
        exit (2);
    }

for(i=0; i<10; i++)
    for(j=0; j<2; j++)
	fscanf(fin, "%i", &tab[i][j]);


for(i=0; i<10; i++)
    for(j=0; j<2; j++)
{
	printf("%i",tab[i][j], " ");
	printf("\n");
}

return 0;
}

plik z liczbami:

 
-2 5
31 3
43 23
513 1
34 3
2 4
1 5
23 3
234 12
56576 43
567 55
8 -23
99 0
8 -2
1 3

Aktualnie mam coś takiego, tylko, że nie zapisuje do tablicy wszystkich liczb z pliku

0
marnit napisał(a):

... tylko, że nie zapisuje do tablicy wszystkich liczb z pliku
... ponieważ masz ograniczenie do 10 wierszy.

0

@marnit

Jeszcze jedno:
printf("%i",tab[i][j], " ");Wydaje mi się, że niepoprawne Poprawne, ale bezsensowne; za dużo argumentów; jak masz "%i" to masz mieć potem tylko jeden argument, liczbę do wydrukowania, to " " jest nadmiarowe

Twój kod wyrzuca mi warninga:

warning: too many arguments for format [-Wformat-extra-args]
     printf("%i",tab[i][j], " ");

1 użytkowników online, w tym zalogowanych: 0, gości: 1