[C] Esercizi: sequenza di numeri interi

Andretti60

Utente Èlite
6,440
5,091
... quello che intendevo dire è che attualmente l'espressione 2<3>0 non credo affatto che possa essere definita imprevedibile in quanto dovrebbe risultare sempre vera.
Certamente, ma se cambiasse il compilatore cosa succederebbe in futuro con quel codice?
E purtroppo i dettagli interni possono cambiare sempre quando vogliono loro, noi "operatori" non dovremmo mai attenerci a quelli. Per questo motivo si consiglia sempre di usare i file include di sistema invece di definire le costanti noi stessi.

Ad ogni modo l'espressioe 2<3>0 e' orribile, e come ho detto in precedenza non passerebbe compilatori moderni, ecco che errore da' con C# per esempio:

Operator '>' cannot be applied to operands of type 'bool' and 'int'
 
  • Mi piace
Reazioni: M1n021

M1n021

Nuovo Utente
143
68
Per questo motivo si consiglia sempre di usare i file include di sistema invece di definire le costanti noi stessi.
Hai ragione, nel caso specifico però le macro FALSE=0 e TRUE=1 sono di sistema e derivano direttamente dallo standard. Il mio scopo era quello di dimostrare che qualsiasi espressione (o sottoespressione) logica vera ritorna sempre 1, e per farlo avevo due strade:
- riportare estratti dello standard riguardanti operatori relazionali, operatori logici, operatore not, casting impliciti, ... ;
- riportare semplicemente la macro TRUE=1 definita dallo standard. Infatti nel momento in cui scriviamo per esempio
C:
if(espressione_logica == TRUE)
{
    ...
}
si deduce ovviamente che per funzionare, l'espressione logica, nel caso in cui sia vera, deve restituire per forza 1 e non un generico valore diverso da 0.

Ad ogni modo l'espressioe 2<3>0 e' orribile, e come ho detto in precedenza non passerebbe compilatori moderni
In effetti definendola orribile sei stato anche fin troppo buono!
Come hai scritto in un precedente post, con il C puoi fare TUTTO... questo è sia il bello che il brutto di questo linguaggio. Una volta però che le cose stanno in questo modo, a noi "operatori" non resta altro che tenere ben presente quello che dice lo standard e ricordare che da grandi poteri derivano grandi responsabilità! :D
 

Mursey

Super Moderatore
Staff Forum
Utente Èlite
8,237
5,668
Una volta però che le cose stanno in questo modo, a noi "operatori" non resta altro che tenere ben presente quello che dice lo standard e ricordare che da grandi poteri derivano grandi responsabilità! :D
Già... e debuggare poi è un macello.
 
U

Utente 125751

Ospite
Poiche' i processori moderni si sono evoluti, lo sono anche i vari assemblatori (sinceramente non lavoro in Assembly da una vita, non che mi manchi), ma il concetto rimane lo stesso. In un processore tutto cio' che esiste e' una valore numerico in una locazione di memoria, spetta a noi cosa metterci e come interpetrarlo. Incluso i numeri di una codifica ASCII.

L' esempio in asm (del Motorola 68000) che hai scritto è chiarissimo considerando che sono un principiante in assembly 8086 sintassi Intel. :)
Ho un sacco da imparare anche su queste cose.


Bella domanda.
Studiare il linguaggio C piu' in dettaglio non guasta, o passare a un linguaggio piu' evoluto dove esista un vario insieme di tipi di dati il cui uso venga rinforzato dal compilatore. Se usi il C, controlla il settaggio e metti i livelli di warning a manetta (e' quello che pretendevo dai miei studenti)

Allora imposterò i livelli di warnings a manetta :)

Ho fatto degli screen in modo tale che mi possiate consigliare le altre impostazioni su Pelles C:


Quali sono le cattivi abitudini che non bisogna fare o addirittura imparare in C (no C++)?
 
U

Utente 125751

Ospite
Esercizio 3) :

C:
#include <stdio.h>

int main()

{
  int num[10]={0,1,2,3,4,5,6,7,8,9};
 
  int i;
 
  num[1] = num[0] +1;
  num[2] = num[1] +1;
  num[3] = num[2] +1;
  num[4] = num[3] +1;
  num[5] = num[4] +1;
  num[6] = num[5] +1;
  num[7] = num[6] +1;
  num[8] = num[7] +1;
  num[9] = num[8] +1;

  printf("\n");
 
  for (i=0;i<10;i++)

  {
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[8]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[7]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[6]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[5]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[4]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[3]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[2]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[1]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[0]);
    printf("\n");

    /*printf("%d %d %d %d %d %d %d %d %d %d\n",numnum[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",numnum[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",numnum[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
    printf("%d %d %d %d %d %d %d %d %d %d\n",numnum[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);   */

    
    
  }

  return 0;
}

Ho calcolato le combinazioni possibili e senza ripetizioni sono: 3.628800 .
Se mi metto a scrivere tutte le combinazioni di numeri ci metterò una vita.
Non so come andare avanti. Preferirei non utilizzare le funzioni di altre librerie e quindi andare su una soluzione più semplice.
Non riesco a trovare ad es. un modo per generale numeri casuali senza usare una o più funzioni di altre librerie.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,941
11,577
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Definisci quanti numeri (N) vuoi creare, per esempio 10, come hai fatto;
generi 10 numeri casuali (cerca con google come fare per generali interi) e li metti in un array a N posizioni
ordini l'array in modo crescente
stampi l'array dal primo all'ultimo elemento e hai la sequenza di interi in ordine crescente
stampi l'array dall'ultimo elemento al primo e avrai la sequenza in ordine decrescente
l'esercizo 4 è identico, basta che dopo aver generato un intero gli cambi il segno
 
  • Mi piace
Reazioni: Utente 125751

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili