Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [PASCAL] Come fare questo ciclo?

    Salve,

    devo fare un programmino, ma non so come realizzarlo... Chi puo' darmi una mano?

    In pratica io gli devo dire un numero:

    se il numero è pari, lo divide per 2, fino ad arrivare ad 1, (scrivendo tutti i vari passaggi!)

    se il numero è dispari, deve essere moltiplicato per 3, ed aggiunto 1. E via dicendo, se il numero ottenuto è pari lo si divide per 2 fino ad arrivare ad 1, altrimenti lo si rimoltiplica per 3 aggiungendo 1...


    Potete aiutarmi? Vi scrivo come avevo impostato il programma, così potete scrivermi le procedure senza scrivere tutto il programma!

    codice:
    program KILIN_RULEZ;
    
    
    uses
      crt;                             
    var
      NUMERO, R :integer;
      procedure procedura_pari;
      begin
         end;
    
    procedure procedura_dispari;
      begin
    
      end;
    
    
    begin
        clrscr;
        writeln('Introduci il numero:');
        readln(NUMERO);
        R:= NUMERO mod 2;               
        
        if(R=0) then                 
          procedura_pari;
        else 
          procedura_dispari;
    
    end.
    Grazie!

    ciao ciao

  2. #2
    Ecco in C come sarebbe(ci vuole poco ad adattarlo x il pascal,è solo una questione di qualche lieve cambiamento di sintassi):
    codice:
    /* ipotizzando,per entrambe, che la variabile intera numero sia dichiarata globale,altrimenti bisogna passarla alla funzione! */
    
    void procedura_pari(){
    int i=0;
    while(numero != 1){
    numero /= 2; //cioè numero=numero/2;
    printf("%d PASSAGGIO : %d \n",i++,numero);
    }
    }
    
    
    void procedura_dispari(){
    numero=(numero*3)+1;
    }
    Se hai detto pero' che il numero inserito,oltre ad essere controllato se pari o dispari,nel secondo caso,se dispari quindi,deve oltre ad essere moltiplicato x3 e aggiunto 1 e poi controllato se pari cambia il corpo di tutto il programma.Le funzioni che ti ho scritto vanno cmq bene ma nel caso dispari devono essere "combinate" tra di loro...ossia se il numero ottenuto da *3+1 è pari richiama la procedura_pari,altrimenti richiama l'altra...

    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  3. #3
    allora, ecco a cosa sn arrivato: con i pari funziona, ma coi dispari sn nei problemi:

    codice:
    program CICLO;
    
    
    uses
      crt;                             {Richiamo la unit CRT}
    
    var
      NUMERO, R, R2: integer;
      RISPOSTA: string;
    procedure procedura_pari;    {questo funziona bene...}
      begin
        while (NUMERO <> 1) do
          begin
            NUMERO := NUMERO div 2;
            writeln (NUMERO);
          end;
          writeln ('------------------------------');
          writeln ('FINITO!!');
      end;
    
    procedure procedura_dispari;
      begin
        while (NUMERO <> 1) do      {finchè il numero è diverso da 1}
          begin
            R2 := NUMERO mod 2;     
            while (R2 <> 0) do       {ficnhè il numero è dispari (resto diverso da 0)}
            begin
              NUMERO := ((NUMERO*3)+1) div 2;
              writeln(NUMERO);
            end;
           procedura_pari;
          end;                        
      end;
    
    
    begin
        clrscr;
        writeln('Questo programma Š stato orgogliosamente realizzato da Kilin');
        writeln('per ovviare alla mancanza di materia grigia di KleRoi.');
        writeln;
        readln;
        writeln('Via su, dammi ir numero... non nell''occhio, o'' duro!');
        read(NUMERO);
        R:= NUMERO mod 2;
    
        if(R=0) then                 {Se il resto Š 0, il numero Š pari....}
          begin
            procedura_pari;
            readln;
          end
        else
          procedura_dispari;
          readln;
    end.
    parte a ruota con un dispari, spara numeri che nn capisco... c'è qualcosa che nn va... ma cosa?

  4. #4
    subentra un nuovo problema: nn avevo considerato nello scrivere il programma che anche i pari, dividendosi, possono divenire dispari! e questo complica le cose, perchè anche nella procedura_pari devo richiamare la procedura_dispari...

    STO AMMATTENDO QUALCUNO MI AIUTIIIIIIII

    (si tratta della celebre congettura di syracuse...)

  5. #5
    up!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    magari è brutto ma prova così

    codice:
    program CICLO;
    
    
    uses
      crt;                             {Richiamo la unit CRT}
    
    var
      NUMERO, R, R2: integer;
      RISPOSTA: string;
    procedure procedura_pari;    {questo funziona bene...}
      begin
        while (NUMERO <> 1) do
          begin
            NUMERO := NUMERO div 2;
            R:= NUMERO mod 2;
            if(R <> 0) THEN
               goto dacapo;
            writeln (NUMERO);
          end;
          writeln ('------------------------------');
          writeln ('FINITO!!');
      end;
    
    procedure procedura_dispari;
      begin
        while (NUMERO <> 1) do      {finchè il numero è diverso da 1}
          begin
            R2 := NUMERO mod 2;     
            while (R2 <> 0) do       {ficnhè il numero è dispari (resto diverso da 0)}
            begin
              NUMERO := ((NUMERO*3)+1) div 2;
              writeln(NUMERO);
            end;
           procedura_pari;
          end;                        
      end;
    
    
    begin
        clrscr;
        writeln('Questo programma Š stato orgogliosamente realizzato da Kilin');
        writeln('per ovviare alla mancanza di materia grigia di KleRoi.');
        writeln;
        readln;
        writeln('Via su, dammi ir numero... non nell''occhio, o'' duro!');
        read(NUMERO);
        R:= NUMERO mod 2;
        dacapo:
        if(R=0) then                 {Se il resto Š 0, il numero Š pari....}
          begin
            procedura_pari;
            readln;
          end
        else
          procedura_dispari;
          readln;
    end.
    ho deciso di usare le label
    anche se cmq non uso pascal da mesi
    te devi fare 2 cose

    o esci dalla procedura (e qui non ricordo se c'è un costrutto x farlo)
    oppure fai un salto condizionato che ti porta dove vuoi che si svogla il lavoro


    ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Solo che ho un dubbio... la procedura modifica le variabili ???

    es:
    codice:
    procedure nome;
    begin
    VAR:=0;
    end;
    
    begin
    VAR:=1;
    nome;
    write(VAR);
    end.
    qua scrive 0 o 1 ???

  8. #8
    Credo che scriva 0... :master:

    Cmq il prog che mi hai postato sopra, mi da errore, dice:

    "Error 3: Unknown identifier"

    riferendosi alla riga "goto dacapo;"



    Ah, e per uscire da un ciclo c'è il costrutto break;

  9. #9
    Allora, sn un demente, l'errore di prima dipendeva dal fatto che nn avevevamo dichiarato il label... prima di var, serve:

    label dacapo;

    Ma ora da un altro errore, perchè il goto ed il label sn in blocchi differenti del programma...

    "Label not within current block"


    :master:

  10. #10

    prova cosi'

    Diciamo che è da anni che non uso pascal quindi la sintassi non credo sia delle migliori... cmq senza creare molte procedure credo che basti un semlice ciclo .... ma magari non ho capito molto bene il problema

    ciao






    program CICLO;


    uses
    crt; {Richiamo la unit CRT}

    var
    NUMERO, R, R2: integer;
    RISPOSTA: string;

    begin
    clrscr;
    writeln;
    readln;
    writeln('Dammi un numero');
    read(NUMERO);
    while (NUMERO > 1) do
    begin
    R:= NUMERO mod 2;
    if(R=0) then
    begin
    NUMERO := (NUMERO/2);
    writeln(NUMERO);
    end
    else
    begin
    NUMERO := ((NUMERO*3)+1);
    writeln(NUMERO);
    end;
    end;
    writeln ('------------------------------');
    writeln ('FINITO!!');
    end.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.