Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Da Pascal a C] Tradurre esercizio da Pascal a C

    (* file determin.pas *)
    (* scopo: calcolo determinante di una matrice quadrata di dimensione
    massima fissata *)


    program CalcolaDeterminante;

    const NMAX = 10; (* massima dimensione della matrice *)
    type Matrice = array [1..NMAX,1..NMAX] of integer;
    RecMatrice = record
    mat: Matrice;
    dim: 1..NMAX;
    end;

    procedure LeggiMatrice (var matrice: RecMatrice);
    { Legge una matrice da file. }
    var
    nome : string; { nome del file dal quale leggere la matrice }
    f : text; { file logico }
    i, j : integer;
    begin { LeggiMatrice }
    write('Nome del file dal quale leggere la matrice ? ');
    readln(nome);
    assign(f, nome);
    reset(f);
    read(f,matrice.dim);
    for i := 1 to matrice.dim do
    for j := 1 to matrice.dim do
    read(f, matrice.mat[i,j]);
    close(f)
    end; { LeggiMatrice }

    procedure StampaMatrice (matrice: RecMatrice);
    { Stampa una matrice su video. }
    var i, j : integer;
    begin { StampaMatrice }
    for i := 1 to matrice.dim do
    begin
    for j := 1 to matrice.dim do
    write(matrice.mat[i,j]:7);
    writeln
    end;
    writeln
    end; { StampaMatrice }

    function Determinante(matrice: RecMatrice): integer;

    procedure Minore(j:integer; matrice_in: RecMatrice;
    var matrice_out: RecMatrice);
    (* restituisce in matrice_out il j-esimo minore di matrice_in =
    il minore relativo all'elemento di riga 1, colonna j *)
    var riga, colonna_in, colonna_out: integer; (* necessari per i cicli *)
    begin (* Minore *)
    matrice_out.dim := matrice_in.dim - 1;
    (* il minore ha dimensione inferiore di 1 rispetto alla matrice
    di input *)
    // sintassi C per il for che segue alla riga con questi simboli *?*? //
    for ( riga = 2; riga <= matrice_in.dim; ) {
    colonna_out = 1;
    for ( colonna_in = 1; colonna_in <= matrice_in.dim ) {
    if ( colonna_in != j ) {
    matrice_out.mat[riga-1, colonna_out]= matrice_in.mat[riga, colonna_in];
    colonna_out = colonna_out + 1;
    }
    }
    }

    *?*? for riga:= 2 to matrice_in.dim do
    (* il ciclo esterno si occupa delle righe del minore.
    La prima riga della matrice di input va saltata *)
    begin
    colonna_out:= 1;
    for colonna_in := 1 to matrice_in.dim do
    (* il ciclo interno si occupa delle colonne del minore *)
    begin
    if colonna_in <> j then
    (* occorre saltare la colonna j-esima di matrice_in *)
    begin
    matrice_out.mat[riga-1,colonna_out]:=
    matrice_in.mat[riga,colonna_in];
    colonna_out := colonna_out +1;
    end
    end (* for interno *)
    end (* for interno *)
    fine *?*?

    end; (* Minore *)

    function Coefficiente(j: integer): integer;
    (* restituisce 1 se j e' dispari; restituisce -1 se j e' pari *)
    begin (* Coefficiente *)
    if j mod 2 = 0 then
    Coefficiente := -1
    else
    Coefficiente:= 1
    end; (* Coefficiente *)

    var somma, i : integer;
    matrice_aux: RecMatrice;

    begin (* Determinante *)
    if matrice.dim = 1 then
    Determinante := matrice.mat[1,1]
    else if matrice.dim = 2 then
    Determinante:= matrice.mat[1,1]*matrice.mat[2,2] -
    matrice.mat[1,2]*matrice.mat[2,1]
    else begin
    somma:=0;
    for i:= 1 to matrice.dim do
    begin
    Minore(i,matrice,matrice_aux);
    somma:= somma +
    matrice.mat[1,i] * Coefficiente(i) * Determinante(matrice_aux)
    end;
    Determinante := somma;
    end;
    end; (* Determinante *)

    var m: RecMatrice;

    begin { CalcolaDeterminante }
    LeggiMatrice(m); { lettura della matrice }
    writeln('Ho letto la matrice:');
    StampaMatrice(m); { stampa di verifica su video }
    writeln('Il suo determinante vale: ', Determinante(m));
    end. { CalcolaDeterminante }
    mi date una mano per favore? grazie ciao

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Una mano ... o un braccio? ...

    Hai iniziato a fare qualcosa ...?

  3. #3
    ankora no perchè ho molto da studiare, e questo lo devo consegnare lunedì...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Allora è meglio che cominci, altrimenti ti prenderai indietro.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.