[ C ] Matrix inlezen uit file & vermenigvuldigen

Pagina: 1
Acties:

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Ik wil 2 vierkante matrices ( met dezelfde grootte) uitlezen uit een txt file en die dan vermenigvuldigd weergeven op het scherm

De inhoud van zo'n txt file ziet er bijvoorbeeld als volgt uit:
code:
1
2
3
1 2 3
3 4 5
5 6 7

Alle geheugenruimte die nodig is moet dynamisch worden aangemaakt. Ook moet er worden gewerkt met pointers tijdens de daadwerkelijke berekening. (8>

Ik heb echt geen idee hoe ik hiermee moet beginnen. Ik heb de basic tutorials op diverse sites gedaan en dat volg ik ook wel. Hoe ik een file moet inlezen heb ik alleen nog nergens kunnen vinden. ;(

Is er iemand die mij een eindje op weg kan helpen? :*

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Waar heb je precies problemen mee? Dynamisch geheugen alloceren, de getallen uit het bestand inlezen, het vermenigvuldigen van de matrices of het weergeven van de uitvoer? Het zijn vier vrij verschillende onderwerpen en als geen van allen lukt, kan je beter eerst leren programmeren.

Verder ook alle vragen die ook in de FAQ staan; wat heb je geprobeerd, etcetera.

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Op donderdag 21 maart 2002 13:06 schreef Soultaker het volgende:
Waar heb je precies problemen mee? Dynamisch geheugen alloceren
Dat heb ik wel begrepen, denk ik, dat doe ik met malloc.
de getallen uit het bestand inlezen
Hier zit het grootste probleem voor mij. Het bestand openen met fopen lukt prima. Maar hoe ik dan aangeef dat elk getal van de matrix gescheiden is door een matrix en dat ie aan het eind van de regel naar een nieuwe regel moet gaan wil niet lukken.
...het vermenigvuldigen van de matrices of het weergeven van de uitvoer?
Als ik de getallen eenmaal heb ingelezen lukt het me verder wel denk ik.
Verder ook alle vragen die ook in de FAQ staan; wat heb je geprobeerd, etcetera.
Vermenigvuldigen lukt me wel. Nu alleen het juist inlezen en wegschrijven. Ik heb geprobeerd om via fopen en diverse stream dingen de txt file uit te lezen maar geen van allen is gelukt :(

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10-09 19:57
fscanf ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
De vraag is hoe integer je databestanden zijn. Als ze aan een standaardvorm voldoen, bv in BNF:

<invoer> -> <regel> {<regel>}
regel -> {getal} {' ' getal} '\n'
getal -> <nummer> {<nummer>}
nummer -> 0 | 1 | ... | 9

Dan kun je de hele boel wel aardig parsen, door bijvoorbeeld alle getallen in te lezen (met getchar, zodat je ook newlines kan tellen) en in een linked list op te slaan.

Na het inlezen van de eerste regel weet je de breedte van de matrix, als je het eind van het bestand hebt bereikt ook de hoogte. Als je onderweg onverwachte/ongeldige karakters tegenkomt kan je een foutmelding genereren. Ook als blijkt dat het aantal ingelezen getallen niet overeenkomt met het product van hoogte en breedte.

Is dat allemaal in orde, dan kan je een array alloceren met ('hoogte') pointers naar de verschillende rijen van je matrix en je linked list opsplitsen (in 'hoogte' stukken van 'breedte' lang). Daar is dus geen reallocatie van geheugen voor nodig!

Als je extra spaties en newlines wil negeren e.d. wordt 't in principe niet zoveel ingewikkelder.

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Op donderdag 21 maart 2002 15:26 schreef Soultaker het volgende:
De vraag is hoe integer je databestanden zijn. Als ze aan een standaardvorm voldoen, bv in BNF:

<invoer> -> <regel> {<regel>}
regel -> {getal} {' ' getal} '\n'
getal -> <nummer> {<nummer>}
nummer -> 0 | 1 | ... | 9

Dan kun je de hele boel wel aardig parsen, door bijvoorbeeld alle getallen in te lezen (met getchar, zodat je ook newlines kan tellen) en in een linked list op te slaan.

Na het inlezen van de eerste regel weet je de breedte van de matrix, als je het eind van het bestand hebt bereikt ook de hoogte. Als je onderweg onverwachte/ongeldige karakters tegenkomt kan je een foutmelding genereren. Ook als blijkt dat het aantal ingelezen getallen niet overeenkomt met het product van hoogte en breedte.

Is dat allemaal in orde, dan kan je een array alloceren met ('hoogte') pointers naar de verschillende rijen van je matrix en je linked list opsplitsen (in 'hoogte' stukken van 'breedte' lang). Daar is dus geen reallocatie van geheugen voor nodig!

Als je extra spaties en newlines wil negeren e.d. wordt 't in principe niet zoveel ingewikkelder.
Ik mag de vorm van de txt files zelf bepalen dus dat is geen probleem :)

Zou je eventueel een stukje code voor willen doen of mag ik dat niet vragen hier?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op donderdag 21 maart 2002 16:28 schreef Mr.Blonde het volgende:
Ik mag de vorm van de txt files zelf bepalen dus dat is geen probleem :)
Tja, dan zou ik zeggen, zet de breedte en hoogte (of omgekeerd, wat jij leuk vind) op de eerste regel, dan ben je van een heleboel gezeik af. In dat geval kun je namelijk beginnen met het inlezen van de integers, direct de juiste array alloceren en de waardes inlezen zonder rekening te houden met newlines.
Zou je eventueel een stukje code voor willen doen of mag ik dat niet vragen hier?
Neuh, liever niet. Doe zelf maar, daar leer je meer van. Ik heb 't idee dat 't toch een huiswerkopdracht. was =)

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Op donderdag 21 maart 2002 20:26 schreef Soultaker het volgende:

Tja, dan zou ik zeggen, zet de breedte en hoogte (of omgekeerd, wat jij leuk vind) op de eerste regel, dan ben je van een heleboel gezeik af. In dat geval kun je namelijk beginnen met het inlezen van de integers, direct de juiste array alloceren en de waardes inlezen zonder rekening te houden met newlines.
Thx voor alle uitleg & tips! :)
Neuh, liever niet. Doe zelf maar, daar leer je meer van. Ik heb 't idee dat 't toch een huiswerkopdracht was :)
Het is idd een opdracht die op school ontstaan is, maar niet als huiswerk word beoordeeld, iig bedankt!

  • MP83
  • Registratie: Januari 2000
  • Laatst online: 31-01 18:11
Ik heb 'em af! Niet helemaal zoals de opdracht was maar toch een 8 gekregen >:)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>

int main()
{
  int matrixA[9];
  int matrixB[9];
  int matrixC[9];
  int tempA;
  int tempB;
  int f;
  int i;
  FILE * A;
  FILE * B;
  FILE * C;

system("clear");
printf("A.txt:\n\n");
system("cat A.txt");
printf("\n\n");
printf("Begonnen Matrix A inlezen...");
   A = fopen ("A.txt","rt");
   i = 0;
   for (i; i<9;i++)
   {
    fscanf (A, "%d", &f);
    matrixA[i] = f;
   }
   fclose (A);
printf("...Matrix A opgeslagen\n\n");

printf("B.txt:\n\n");
system("cat B.txt");
printf("\n\n");
printf("Begonnen Matrix B inlezen...");
   B = fopen ("B.txt","rt");
   i = 0;
   for (i; i<9;i++)
   {
    fscanf (B, "%d", &f);
    matrixB[i] = f;
   }
   fclose (B);
printf("...Matrix B opgeslagen\n\n");

printf("Begonnen met Matrices A en B optellen...");
   i = 0;
   for (i; i<9;i++)
   {
    tempA = matrixA[i];
    tempB = matrixB[i];
    matrixC[i] = tempA +tempB;
   }
printf("...Matrices A en B opgeteld\n\n");

printf("Begonnen Matrix C wegschrijven...");
 C = fopen ("C.txt","w+");
 i = 0;
 for (i;i<3;i++)
 { 
  fprintf (C," %d",matrixC[i]);
 }
  fprintf (C,"\n");
  fclose (C);

 C = fopen ("C.txt","a+");
 i = 3;
 for (i;i<6;i++)
 { 
  fprintf (C," %d",matrixC[i]);
 }
  fprintf (C,"\n");
  fclose (C);

 C = fopen ("C.txt","a+");
 i = 6;
 for (i;i<9;i++)
 { 
  fprintf (C," %d",matrixC[i]);
 }
  fprintf (C,"\n");
  fclose (C);

printf("...Matrix C weggeschreven\n\n");
printf("C.txt:\n\n");
system("cat C.txt");
printf("\n");
printf("Einde programma");
return 0;
}
Pagina: 1