Oppure

Loading
03/01/10 18:39
Astaroth
Ciao a tutti. Sono nuovo del forum.

Ho qualche difficoltà a creare un programma che legga da tastiera una sequenza di caratteri (al più di 50 elementi) terminata da un punto e li stampi a video nell’ordine inverso.

Questo è il codice che ho provato a scrivere (ma ci sono sicuramente degli errori, anche gravi forse). Mi potreste gentilmente dare una mano? (Senza usare funzioni di libreria).

#include<stdio.h>
#include<stdlib.h>

main()
{
    int i=0, j;
    char str[50];
    
    do{
        scanf("%c", str[i]);
        i++;
    }while(i!=50 || str[i]!='.');
    
    j=i;
    
    for(i=0; i<j; i++)
    {
        printf("%c", str[j]);
        j--;   
    }
    
    system("pause");
    return 0;
}


Quello che ho pensato io è creare un vettore di caratteri di 50 elementi. Inizializzo un contatore a 0 e con un ciclo do-while leggo da tastiera la sequenza di caratteri e incremento il contatore. Se il contatore è 50 oppure se il carattere è un punto, il ciclo dovrebbe terminare. A questo punto salvo il valore del contatore in un'altra variabile e con un ciclo for stampo i caratteri contenuti nel vettore partendo dall'ultimo. Ma non funziona... Che cosa sbaglio? Grazie.
Ultima modifica effettuata da Astaroth 03/01/10 19:02
aaa
03/01/10 19:35
L'idea non è sbagliata, ma guarda le correzioni

#include <stdio.h>
#include <stdlib.h>

#define MAX 50

int main()
{
    int i=0, j;
	char str[MAX];

    do
	{
		scanf("%c", &str[i++]);
    } while(i<MAX && str[i-1]!='.');
    
	if(i<MAX) i--;

    for(j=i-1; j>=0; j--)
        printf("%c", str[j]);
  
    system("pause");
    return 0;
}
03/01/10 20:19
Astaroth
Uh, grazie per le correzioni! :k:

Posso chiederti però il perché del str[i++] dentro scanf()? Se nella condizione del while avessi messo i!=50 al posto di i<50 andava ugualmente bene?
aaa
03/01/10 21:16
Postato originariamente da Astaroth:

Uh, grazie per le correzioni! :k:


Prego

Posso chiederti però il perché del str[i++] dentro scanf()?


Parli del ++ o della str[...] ?

Se nella condizione del while avessi messo i!=50 al posto di i<50 andava ugualmente bene?


03/01/10 21:27
Astaroth
Postato originariamente da nessuno:
Parli del ++ o della str[...] ?

Dell'insieme... str[i++]. Perché non solo str[i]? Inserisci il carattere nell'elemento successivo... quindi l'elemento 0 lo salti?
Ultima modifica effettuata da Astaroth 03/01/10 21:40
aaa
03/01/10 23:37
ilmettiu
str[i++] utilizza i e poi lo incrementa. Quello che dici tu sarebbe successo con str[++i] :k:
aaa
04/01/10 1:33
L'operatore di postincremento utilizzato in

array[j++]

equivale a scrivere

array[j]
j++

04/01/10 11:36
Astaroth
Grazie ad entrambi! Quindi quella è la forma contratta del codice che ho scritto.

Avrei un'ultima domanda... di logica... :D

Poiché la stringa deve essere lunga al massimo 50 caratteri OPPURE deve essere terminata da un punto, perché non si usa OR al posto di AND? Cioè, se voglio che solo una delle condizioni basti per terminare il ciclo while non devo usare || al posto di &&? La tabella di verità dell'OR dovrebbe essere questa:

0 0 --> 0
0 1 --> 1
1 0 --> 1
1 1 --> 1
Ultima modifica effettuata da Astaroth 04/01/10 11:40
aaa