|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 123
|
esercizio C
ciao ragazzi!
ho un problema con il seguente esercizio qualcuno può darmi una mano? grazie! TESTO Si inizializzi la variabie intera 'a' in modo che il ciclo while esegua un numero finito di iterazioni e venga prodotta la stampa a video della stringa "X11" (doppi apici esclusi). Si commenti la soluzione. Alternativamente si sarebbe potuto stampare con lo stessa metodo la stringa "X-11"? int main() { int a=...; char* p=&a; while(*p) { printf("%c",*p); p++; } printf("\nFatto!"); } |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
La stringa "X11" deve essere stampata in virtù di che cosa?? Cioè in che modo deve essere prodotta?? Quote:
E tra l'altro 'p' è un puntatore a char mentre tu assegni a 'p' l'indirizzo di un int ...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 123
|
è un esempio di esercizio d'esame...
lo so.. è quello il problema... p?? qualcuno ha qualche idea? |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Mi spiego: Hai una serie di stringhe e devi scegliere "X11"; Devi scorrere tutti i caratteri dell'alfabeto sino a raggiungere prima 'X', poi '1' e poi '1' (oppure '11') e metterli insieme per formare la stringa; Devi estrapolarla da una stringa già esistente (ed eventualmente aggiungerci il carattere '-' in modo da farla diventare 'X-11'). etc.. Cioè, se ti hanno posto questo problema, te lo hanno posto in un modo tutt'altro che chiaro
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ripeto: dovresti spiegare meglio in che modo deve essere prodotta in output la stringa.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 123
|
questo esercizio era sul file di esercizio proposti per l'esame...
non ci sono altre istruzioni.. bisogna inizializzare la variabile "a" e produrre in output 3 caratteri formando "X11" |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Sì ma ... 'a' di che tipo deve essere?? char? int? E devi basarti solo su questa variabile per il test del while e per mandare in output i caratteri??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Come gia' fatto notare l'esercizio e' tutt'altro che chiaro e merita una risposta "sciocca":
Codice:
#include <stdio.h>
void main(void)
{
int a=10;
while (a--);
printf("X11");
}
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
|
Boh! Esercizio stranissimo
Codice:
int main()
{
int a=88;
char* p= &a;
while(*p) {
printf("%c",*p);
if( *p == 49 ) { printf("%c",*p); *p = 0; }
if( *p == 88 ) *p = 49;
}
printf("\nFatto!");
system("pause");
}
![]() P.S ah, e il gcc ovviamente da buon compilatore mi dice Warning: inizialization from incompatible pointer type @line char* p= &a; Non si possono fare giochetti del genere con puntatori a int e char, questo funziona solo per coincidenza...perchè lavoriamo su interi sempre minori di 255 (quindi rappresentabili su carattere ASCII)
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat Ultima modifica di mfonz85 : 16-03-2007 alle 14:30. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Sorgente meno "banale"???
Questo: Codice:
#include <stdio.h>
int main (void)
{
int a = 88;
while (a) {
printf ("%c", (char) a);
a = a == 88 ? 49 : a == 49 ? 305 : 0;
}
printf ("\n");
return 0;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 189
|
Codice:
int main()
{
int a= 3223896;
char* p=&a;
while(*p)
{
printf("%c",*p);
p++;
}
printf("\nFatto!");
}
EDIT: ho corretto prima stampava W11 ora stampa X11 come avevi chiesto Ultima modifica di pierosa : 16-03-2007 alle 15:05. |
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
|
Quote:
Hai sfruttato gli overflow?? Cos'è sta roba??
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat |
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 189
|
in c un char è composto da un byte dunque 8 bit.
il codice ascii di X è 88 che in binario è 1011000 (01011000 aggiungiamo uno 0 all'inizio per ottenere 8 bit) il codice ascii di 1 è 49 che in binario è 110001 (00110001 come sopra) un intero a 32 bit può dunque contenere 4 caratteri, che sono necessari per contenere la string "X11\0", il carattere \0 è necessario per delimitare la fine della stringa. ora dobbiamo trovare un intero che sia rappresentato in memoria nello stesso modo della stringa "X11\0", siccome i byte degli interi in memoria vengono invertiti l'intero che stiamo cercando è questo 00000000 00110001 00110001 01011000 (in binario, ho separato i byte con uno spazio) 3223896 (in decimale) assegnando l'indirizzo di questo numero ad un puntatore a carattere (p nel nostro esercizio) questo conterrà l'indirizzo del primo byte di a che rappresenta la W. Per l'aritmetica dei puntatori in c, p++ passa al prossimo byte (perchè p è dichiarato come puntatore a char, se fosse stato dichiarato come puntatore ad int non avrebbe funzionato). |
|
|
|
|
|
#14 | |
|
Member
Iscritto dal: Sep 2005
Città: Bus PCI 1, periferica 0, funzione 0 (Torino)
Messaggi: 213
|
Quote:
__________________
Ho concluso affari con: Ippo 2001, Klintf, albert78, Piripikkio, starsky, oldfield e IL0V€INT€R. da EVITARE zarovat |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
E' l'utilizzo degli operatori ternari in C.
per esempio: Codice:
if( a > b)
{
c = a;
}
else
{
c = b;
}
//si può anche scrivere:
c = (a > b) ? a : b;
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
overflow?? No no.
pierosa ha sfruttato il fatto che il numero decimale 3223896 in esadecimale è 313158h e siccome sulle architetture Intel che sono "little-endian" i byte sono memorizzati dal meno significativo al più significativo, in memoria il valore intero è memorizzato come: 58h 31h 31h 00h dove i 3 valori sono appunto i codici ASCII dei caratteri X 1 1 Con 'p' punta ai singoli byte che compongono l'intero. L'ultimo è appunto nullo quindi fa da terminatore Io invece ho usato una strada diversa. ?: è un operatore ternario. La mia espressione è equivalente a: Codice:
if (a == 89)
a = 49;
else if (a == 49)
a = 305;
else
a = 0;
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#17 | |
|
Member
Iscritto dal: Jan 2007
Messaggi: 189
|
Quote:
L'esercizio come è stato proposto è ambiguo perchè non specifica appunto l'architettura che si sta considerando. anche la seconda domanda non è del tutto corretta, infatti se si sta lavorando su un sistema in cui gli int sono a 32 bit, la stringa "X-11" non può essere contenuta in un int, ma se stiamo lavorando su un sistema con int a 64 bit (credo che esistano) allora un intero può contenere stringhe di 7 caratteri più il terminatore. |
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 123
|
grazie!!
grazie 1000 pierosa!!!
..chiaramente non era un esercizio banale!! |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
E a me grazie ... no? Che ho fatto tutto con 1 sola variabile???
Scherzo ... non c'è problema.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#20 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
) vuole che tu definisca un valore di a percui quella printf finisce per stampare "X11". e probabilmente il testo è stato riportato in maniera errata perché non è possibile stampare anche gli apici (un int è da 4 bytes, quindi ci puoi stampare al massimo 4 caratteri di cui uno deve essere il terminatore nullo per uscire dal while, quindi 3; ecco perché la risposta all'ultima domanda è no).EDIT - ehm, scusate, avevo letto solo i primi due post... ![]() comunque vorrei farvi notare che è assolutamente errato definirlo un esercizio di C, in quanto il valore di a è diverso a seconda che la macchina sia big-endian o little-endian
Ultima modifica di 71104 : 16-03-2007 alle 21:16. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:37.













) vuole che tu definisca un valore di a percui quella printf finisce per stampare "X11". e probabilmente il testo è stato riportato in maniera errata perché non è possibile stampare anche gli apici (un int è da 4 bytes, quindi ci puoi stampare al massimo 4 caratteri di cui uno deve essere il terminatore nullo per uscire dal while, quindi 3; ecco perché la risposta all'ultima domanda è no).








