Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-12-2005, 18:25   #1
Gino+89+
Member
 
L'Avatar di Gino+89+
 
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
Problema con C

Ciao a tutti...
Dovrei fare un programma che legga da tastiera un carattere, e se questultimo corrisponde a back space (praticamente quello di cancellatura in poche parole) "torna indietro", per capirci meglio ecco il sorgente cannato:

Codice:
	
#include <stdio.h> 

int main() 
char car; 
int num; 
         printf(">>inserire un carattere:"); 
         scanf("%c",&car); 
      
         num=car-'0'; 

         if(num==10) 
               return 6; 
         else{ 
              printf("\n>>Carattere accettato"); 
              while(getchar()!='\n'); 
               } 

         getchar(); 
         return 0; 
}
Praticamente in questo programma se si preme backspace (che in codice ASCII vale 10) il programma torna dietro e ti richiede il carattere..su num ho messo "car-'0' " in modo che mi trasforma il carattere in numero e si possa fare il confronto con 10...sicuramente il pgm sarà pieno di errori...mi potete ridare la forma corretta del codice??..grazie mille!!!
Gino+89+ è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 20:51   #2
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
guarda forse non ho capito bene io cmq il controllo che dovresti fare è

if (car==10)...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 21:11   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Gino+89+
Praticamente in questo programma se si preme backspace (che in codice ASCII vale 10) il programma torna dietro e ti richiede il carattere..su num ho messo "car-'0' " in modo che mi trasforma il carattere in numero e si possa fare il confronto con 10...sicuramente il pgm sarà pieno di errori...mi potete ridare la forma corretta del codice??..grazie mille!!!
Ma il backspace è il codice ASCII 8 (0x08)!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 22:23   #4
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da andbin
Ma il backspace è il codice ASCII 8 (0x08)!
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 08:34   #5
Netskate
Senior Member
 
L'Avatar di Netskate
 
Iscritto dal: Oct 2004
Messaggi: 1661
detto...fatto!

Premesso che non ho guardato il suo sorgente, per fare quello che serve a te bastano queste poche righe di codice:
Codice:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int  insCharASCII;
  do{
       printf("\nInserisci un carattere: ");
       insCharASCII=getchar();
  }
  while(insCharASCII==8);
  system("PAUSE");	
  return 0;
}
Non ho messo i commenti perchè è banalissimo. Teoricamente dovrebbe funzionare ma in pratica non funziona a causa del dos, mi spiego meglio.

Se al posto di voler fare ripetere il programma quando premi backspace (ASCII=8) lo vuoi fare ripetere con un qualunque altro tasto, ad esempio lo spazio (ASCII=20), funziona benissimo. Qual'è allora il problema? Il dos non riconosce backspace come un carattere inserito (o meglio lo riconosce, ma in qualche modo lo bypassa identificandolo come un "cancella il carattere precedente al cursore"). Spero di essere stato abbastanza chiaro...in ogni caso il programma che devi fare tu, si può fare benissimo in assembler:

Codice:
cseg       segment para public 'code'
           assume      cs:cseg, ds:dati,es:dati,ss:stack
init       proc        far
           mov         ax,dati
           mov         ds,ax      
           mov         es,ax      
;***************************************
inizioPr:  mov         bx,offset stringa
printText: mov         dl,[bx]
	   cmp         dl,00h
	   je          insCaract
	   call        stampaVideo
	   inc         bx
	   jmp         printText
insCaract: call        insChar
           call        insRiga
	   cmp         al,8h
	   je          inizioPr
;*****************************************
fine_programma:
ret_cd     equ         0
ret_fn     equ         4ch
           mov         ax,ret_fn*256+ret_cd
           int         21h
init       endp
;*****************************************
;* PROCEDURA "insRiga"
;* Questa procedura stampa una riga vuota
;* in modo da poter andare a capo.
;*****************************************
insRiga proc near
	   push        ax
	   push        dx
	   mov         ah,2
	   mov         dl,0dh
	   int         21h
	   mov         dl,0ah
	   int         21h
	   pop         dx
	   pop         ax
	   ret
insRiga endp
;*****************************************
;* FINE PROCEDURA "insRiga"
;*****************************************
;*****************************************
;* PROCEDURA "stampaVideo"
;* Questa procedura stampa a video il 
;* simbolo del codice ascii contenuto in DL
;*****************************************
stampaVideo proc near
	   push        ax
	   mov         ah,2
	   int         21h
	   pop         ax
	   ret
stampaVideo endp
;*****************************************
;* FINE PROCEDURA "stampaVideo"
;*****************************************
;*****************************************
;* PROCEDURA "insChar"
;* Questa procedura legge un carattere da
;* tastiera e lo memorizza nel registro AL
;*****************************************
insChar proc near
	   mov         ah,1
	   int         21h
	   ret
insChar endp
;*****************************************
;* FINE PROCEDURA "insChar"
;*****************************************
cseg       ends
;*****************************************
dati       segment para public 'dati'
stringa    db 1 dup ("Inserisci un carattere: ")
dati       ends
;*****************************************
stack      segment para stack  'stack'
           db 64 dup ("stack  ")
stack      ends

;*****************************************
           end init

;*****************************************
Questo fa esattamente quello che chiedevi
Netskate è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 09:18   #6
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
è possibile inserire quel programma come blocco asm in un programma C? purtroppo sono totalmente ignorante in materia per cui se ho detto una minchiata non subissatemi di lattuga, pomodori e uova marce...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 09:52   #7
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da Gino+89+
Dovrei fare un programma che legga da tastiera un carattere, e se questultimo corrisponde a back space (praticamente quello di cancellatura in poche parole) "torna indietro"
Se ho capito bene, questo programma richiede input non bufferizzato, ossia l'operazione di lettura deve essere effettuata immediatamente dopo la pressione del tasto.
Invece, le varie scanf, getchar (che ti consiglio di usare: a proposito, getchar deve poter restituire EOF che è un valore diverso da ogni altro carattere, quindi il tipo restituito è int e non char) e famiglia, sono funzioni di input bufferizzato, ossia vengono eseguite quando le operazioni di riempimento di una zona di memoria dedicata allo scopo (il buffer, appunto) sono terminate, evento quest'ultimo normalmente corrispondente (nell'input da tastiera) alla pressione del tasto Invio.
E in effetti, nel tuo listato tu aggiri il problema leggendo solo il primo carattere di ogni sequenza che inserisci.

Ora, la libreria standard del C contiene solo funzioni per l'I-O bufferizzato, per il semplice fatto che questo è portabile e l'altro no.
Perciò, se vuoi fare una cosa pulita, devi ricorrere a librerie apposite per il compilatore e il sistema operativo con cui lavori, ad esempio conio sotto DOS o ncurses sotto Linux.
Quote:
se si preme backspace (che in codice ASCII vale 10)
10 è il codice ASCII del newline.
Per il backspace, devi usare o il codice ASCII 127, oppure la costante '\b'.
Quote:
su num ho messo "car-'0' " in modo che mi trasforma il carattere in numero e si possa fare il confronto con 10
Se dài per scontato che il testo sia ASCII, e vuoi sapere se la variabile car contiene un carattere corrispondente a una cifra decimale puoi semplicemente fare il confronto:
Codice:
if (car>='0' && car<='9')
Attento a non confondere la cifra 0 '0' con il carattere nullo '\0', mi raccomando!

P.S.: comunque è tutto scritto nel K&R.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 11:16   #8
Netskate
Senior Member
 
L'Avatar di Netskate
 
Iscritto dal: Oct 2004
Messaggi: 1661
ecco..ziosilvio ti ha spiegato meglio perchè non funziona con backspace
Netskate è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 12:51   #9
Gino+89+
Member
 
L'Avatar di Gino+89+
 
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
Grazie a tutti..allora..
1)Quello stronzo del mio prof mi ha detto che backspace corrispondea 10 ..bè la sciamo stare
2)Mi ha anche spiegato che :
Codice:
int num=carattere(char)-'0';
..ti restituisce il valore numerico del carattere...
3)Poi non ho capito:
Codice:
if (car>='0' && car<='9')
..come faccio a fare questo confronto se in codice ASCII backspace vale 127???
4)Quindi se uso la conio.h e uso getchar() e putchar() potrebbe funzionare??..(infatti il programma partiva ma prima di andare avanti dovevo premere invio ..il mio prof mi ha spiegato che dopo ogni scanf(); ci va while(getchar()!='\n'); in modo da blocca senò il pgm va avanti, allora io ho dedotto che se non metto quel codice il programma sarebbe andato avanti come volevo io senza interruzioni..bè fa lo stesso..)..
Gino+89+ è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 13:46   #10
Gino+89+
Member
 
L'Avatar di Gino+89+
 
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
Ok avevi ragione ...con getch (della conio.h appunto) mi fa tutto diretto...ora il problema è solo come tornare indietro nel programma...con return mi parte tutto e quindi non và..
Gino+89+ è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 13:47   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Gino+89+
1)Quello stronzo del mio prof mi ha detto che backspace corrispondea 10 ..bè la sciamo stare


Quote:
Originariamente inviato da Gino+89+
2)Mi ha anche spiegato che :
Codice:
int num=carattere(char)-'0';
..ti restituisce il valore numerico del carattere...
int num = carattere - '0';
ti fornisce il valore numerico, a patto che il carattere sia compreso tra '0' (0x30) e '9' (0x39), altrimenti non ha senso.

Quote:
Originariamente inviato da Gino+89+
3)Poi non ho capito:
Codice:
if (car>='0' && car<='9')
..come faccio a fare questo confronto se in codice ASCII backspace vale 127???
Attenzione, lo standard ASCII definisce che il codice 8 è il backspace e il codice 127 è il "delete" (a volte chiamato anche "rubout").
Sono due cose leggermente diverse: il backspace (8) porta indietro solo il cursore (quindi non cancella il carattere precedente) mentre il delete (127) cancella a tutti gli effetti il carattere precedente (proprio come se tu premessi il tasto di cancella che c'è nelle tastiere sopra l'enter).
Tiene presente anche che, da quello che ho potuto sempre constatare io, su linux il 127 si comporta effettivamente come delete mentre sulla console di Windows, il 127 stampa un carattere grafico.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 13:57   #12
Gino+89+
Member
 
L'Avatar di Gino+89+
 
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
Ora mi è tutto chiaro....manca solo una cosa per completare quel maledetto codice:COME SI FA A TORNARE INDIETRO NEL PROGRAMMA??...con return non và..nessuna sa come si fa??...
Gino+89+ è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 14:22   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Gino+89+
Ora mi è tutto chiaro....manca solo una cosa per completare quel maledetto codice:COME SI FA A TORNARE INDIETRO NEL PROGRAMMA??...con return non và..nessuna sa come si fa??...
"Tornare indietro nel programma" in che senso??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 14:30   #14
Gino+89+
Member
 
L'Avatar di Gino+89+
 
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
Nel senso che se si digita backspace il programma "torna alla riga 6" dove viene chiesto di nuovo di iserire il carattere...non so se sia possibile ma però mi sembra di aver letto in un codice una cosa simile..
Gino+89+ è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 19:16   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Gino+89+
Nel senso che se si digita backspace il programma "torna alla riga 6" dove viene chiesto di nuovo di iserire il carattere...non so se sia possibile ma però mi sembra di aver letto in un codice una cosa simile..
Ho visto solo adesso (non ci avevo fatto caso prima) che nel codice del tuo post iniziale c'è un "return 6;", che sinceramente non so a cosa ti serva o se ha qualche attinenza con quello che hai appena detto.
Comunque se vuoi che ci sia un ciclo, cioè che una parte del codice venga rieseguita in base ad una determinata condizione, devi usare il costrutto while o il do-while (nel tuo caso penso sia meglio quest'ultimo).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 03-12-2005 alle 19:44.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 20:17   #16
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da Gino+89+
Nel senso che se si digita backspace il programma "torna alla riga 6" dove viene chiesto di nuovo di iserire il carattere...non so se sia possibile ma però mi sembra di aver letto in un codice una cosa simile..
Quote:
Originariamente inviato da andbin
Ho visto solo adesso (non ci avevo fatto caso prima) che nel codice del tuo post iniziale c'è un "return 6;", che sinceramente non so a cosa ti serva o se ha qualche attinenza con quello che hai appena detto.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 22:45   #17
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da VegetaSSJ5
Ho detto forse qualcosa di strano o sbagliato?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 08:46   #18
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da andbin
Attenzione, lo standard ASCII definisce che il codice 8 è il backspace e il codice 127 è il "delete" (a volte chiamato anche "rubout").
Acc... è vero!
Chiedo scusa per l'imprecisione.

A proposito: backspace ha il codice ASCII decimale 8, quindi il suo valore numerico ottale è 010: per cui, è possibile che il prof di Gino+89+ abbia letto la colonna sbagliata...
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 08:54   #19
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da Gino+89+
Nel senso che se si digita backspace il programma "torna alla riga 6" dove viene chiesto di nuovo di iserire il carattere...non so se sia possibile ma però mi sembra di aver letto in un codice una cosa simile..
Non return, che provoca la terminazione della funzione con la restituzione di un valore; ma goto, che porta il flusso dell'esecuzione al punto contrassegnato da un'etichetta.
Per cui, nel tuo caso doversti sostituire:
Codice:
         printf(">>inserire un carattere:"); 
         scanf("%c",&car); 

         if(car=='\b') 
               return 6;
con:
Codice:
insert_char:
         printf(">>inserire un carattere:"); 
         scanf("%c",&car);  

         if(car=='\b') 
               goto insert_char;
In realtà, l'uso del goto è considerato indice di programmazione non elegante; inoltre, il Teorema di Bohm-Jacopini ti assicura che puoi sostituire ogni istanza di goto con una combinazione di istruzioni condizionali, cicli, e chiamate a procedura o a funzione.
Studia bene, sul tuo libro, la parte relativa ai cicli (while, do-while, e for), incluse le istruzioni break e continue.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 11:10   #20
Gino+89+
Member
 
L'Avatar di Gino+89+
 
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
Mitico Ziosilvio!!..proprio goto..ora ricordo...infatti mi sembrava di averla gia vista sta cosa...mi serve questo perchè devo fare un programma che funge come una specie di prompt dei comandi e inserire ogni volta cicli non finisco più..ok..grazie a tutti!!!!
Gino+89+ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
Nuovo test di accensione dei motori per ...
Novità dalle analisi dell'asteroi...
La PS6 sarà più potente del previsto: ec...
Sony svela Xperia 10 VII: è il nu...
Amazon Weekend da urlo: iPhone 16 a prez...
Spotify diffida ReVanced: chiesta la rim...
Spazzolini elettrici Oral-B iO in super ...
Samsung Galaxy Watch8 Classic e Watch7 a...
Blue Origin prosegue lo sviluppo di Blue...
Roborock Saros 10 e 10R dominano il merc...
Apple scatenata su Amazon: tutti gli sco...
Canon EOS C50 è la nuova videocam...
ASUS ProArt P16 arriva in Italia: la wor...
Fujifilm presenta l'obiettivo FUJINON GF...
Il grafene ha appena 'infranto' una legg...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:37.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v