Newsgroup: it.comp.lang.c++
Titolo: Riscrittura di un programma

Salve a tutto il NG,
vi devo richiedere un aiuto riguardante la possibilita´ di riscrivere un
programma
senza ricorrere a cicli for....
il programma e´il seguente
do
for(i=0;i<=n-1;i++)
{
    for(j=i;j<=n-1;j++)
    {
          for ( k=i-1 ; k>=0;k--)
        {
...
        }
    }
}
loop
sapreste aiutarmi a riscrivere queste righe soltanto con l´aiuto di un
do/loop, variabili contatrici e if_then_else??
E´ importante!
Grazie mille
Luigi Lescarini

 E´ importante!
Purtroppo qui non facciamo i compiti degli altri... hai provato a vedere 
su qualunque manuale di C come viene 'sviluppato' un ciclo FOR?
C'è sempre questo esempio...
-- 
Luc.

"Giggio" ha scritto
: Salve a tutto il NG,
: vi devo richiedere un aiuto riguardante la possibilita´ di riscrivere un
: programma
: senza ricorrere a cicli for....
: il programma e´il seguente
: do
: for(i=0;i<=n-1;i++)
: {
:     for(j=i;j<=n-1;j++)
:     {
:           for ( k=i-1 ; k>=0;k--)
:         {
: ...
:
:         }
:     }
: }
: loop
: sapreste aiutarmi a riscrivere queste righe soltanto con l´aiuto di un
: do/loop, variabili contatrici e if_then_else??
:
#include <iostream>
using namespace std;
int main()
{
  int i,j,k, n=4;
  cout << "for solution" << endl;
  for(i=0;i<=n-1;i++)
  {
    for(j=i;j<=n-1;j++)
    {
      for ( k=i-1 ; k>=0;k--)
      {
        cout << "i: " << i << " j:" << j <<" k:" << k << '\n';
      }
    }
  }
  cout << "do solution" << endl;
  i = j = 1;
  k=0;
  do {
    cout << "i: " << i << " j:" << j <<" k:" << k << '\n';
    if ( k > 0 )
      --k;
    else
    {
      if ( j < n-1 )
      {
        ++j;
        k = i - 1;
      }
      else
      {
        k = i++;
        j = i;
      }
    }
  } while (i < n);
   cin.get();
  return 0;
}
ciao
Massimo

 Luc.
Se noti come sono gli indici dei tre cicli for, capirai che non e´ un
compitino che si trova su manuali.
Luigi

 compitino che si trova su manuali.
Certo che no, ma danno un ottimo spunto allo 'studente'.
-- 
Luc.

Grazie moltissime!
Luigi.

Ti assicuro che ci ho speso molto, ma molto, tempo e non ne sono venuto a
capo.
Non credo di essere portato per la programmazione, ma attualmente mi era
necessario sviluppare questo problema.
Tutto qui.
Un´operazione che a Massimo Valentini ha richiesto 5 minuti a me ha
assorbito un numero di ore che preferisco non dire e senza nessun risultato
apprezzabile.
Ciao
Luigi

do/loop, variabili contatrici e if_then_else??
A parte il fatto che do- loop é roba del Visual Basic, questo é un
esercizio inutile e se vogliamo anche sbagliato, in quanto
do - while del c++ trattasi di ciclo con controllo in coda, che vuol
dire che il corpo del ciclo verrà in tutti i casi eseguito almeno una
volta.
Casomai avrebbe avuto un senso sostituire i cicli for con dei cicli
while, ma anche in questo caso non é la cosa più consigliata specie
per quei cicli in cui il contatore é prestabilito, e lo while
costringe ad inizializzarlo prima dell'inizio del ciclo ed
incrementarlo manualmente, aumentando cosi' le probabilità di
commettere errori.
Il Ghenio
---------
These are my parting words to you:
those who give up are doomed!

 volta.
E' pero' possibile trasformare un ciclo for in un while,
facilmente, ponendo anche la condizione di permanenza 
nel ciclo all'entrata.  Il codice:
for (i = 0; i < 10; i++)
{
    //...
}
e' equivalente a:
i = 0;
do
{
  if (i < 10) 
  {
     //...     
     ++i;
  } 
} while (i < 10);
Oppure:
i = 0;
do 
{
  if (i >= 10) break;
  //...
  ++i;
} while (true);
Ammetto che e' un salto mortale inutile, pero'.
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
news:7ec397e7e1374344aef...@mygate.mailgate.org...

Soprattutto, almeno la prima, presume una analisi del codice fattibile
solo da un umano. Non puoi utilizzare questo schema per una
trasformazione automatica. Pensa al caso in cui il test (la seconda
espressione del for) ha dei side effect. O anche semplicemente al caso
in cui non sai se li ha o meno perchè viene chiamata una funzione (o
anche solo un operatore definito dall'utente!). In tal caso si potrebbe
usare il tuo secondo metodo. Ma lo schema
do {
  if ( !cond ) break;
  ...
} while (true);
è talmente uguale a un
while ( cond ) {
 ...
}
che probabilmente un comilatore appena decente internamente lo riscrive
con il while. Siamo veramente ai limiti dell'obfuscated code contest.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

} while (i < 10);
Si, ma questo é un sistema per complicarsi inutilmente la vita e per
aggiungere inutili ridondanze all'interno del programma. Il do-while
se proprio dev'essere usato che lo si usi nei casi in cui realmente
serve( e sono davvero pochi quelli in cui é necessario).


 aggiungere inutili ridondanze all'interno del programma. 
Questo e' fuori dubbio, ma e' cio' che chiedeva Giggio e 
il tuo messaggio lasciava pensare che tradurre un ciclo 
for in un do-while introducesse degli errori.
In realta', a volte puo' essere cosi' (v. i side-effect
di cui parla A. Ferro), a volte, come nel caso specifico
riportato da Giggio, la traduzione puo' essere semplice
ed efficace.
