Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Abbiamo provato il nuovo HUAWEI Pura 80 Pro. Parliamo di uno smartphone che è un vero capolavoro di fotografia mobile, grazie ad un comparto completo in tutto e per tutto, In questa colorazione ci è piaciuto molto, ma i limiti hardware e software, seppur in netto miglioramento, ci sono ancora. Ma HUAWEI ha fatto davvero passi da gigante per questa nuova serie Pura 80. Buona anche l'autonomia e soprattutto la ricarica rapida sia cablata che wireless, velocissima.
Opera Neon: il browser AI agentico di nuova generazione
Opera Neon: il browser AI agentico di nuova generazione
Abbiamo provato il nuovo web browser con intelligenza artificiale della serie Opera accessibile tramite abbonamento. Ecco le nostre prime impressioni sulle funzionalità di Opera Neon basate su AI e come funzionano
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-02-2013, 14:55   #1
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
Aiutino in C per il codice fiscale

Buongiorno esperti,

Sto apprendendo il linguaggio C a scuola e ci hanno assegnato un esercizio: calcolare le prime 6 cifre del codice fiscale.
Le lettere sono maiuscole; trovate le istruzioni nel codice:

Codice:
/*
 *  Esercizio CODICE FISCALE:
 *  Cognome:
 *          -le prime 3 conosonanti
 *          -se non hai cononanti metti le vocali
 *          -se non hai vocali la terza lettera e' una X (Es. YEX)
 *
 *
 *  Nome:
 *       -1°,2°,4° consonanti se ne ha 3
 *       -1°,2°,3° cononanti se non ha la quarta
 *
 *  Created by Pietro on 02/02/2013.
 *  Copyright 2013. All rights reserved.
 *
 */

#include <stdio.h>
#include<string.h>

//riceve un caratere e dice Vero se e' vocale
int isvocali(carattere){
    int i;
    if(carattere=='A' ||carattere=='E'|| carattere=='I' || carattere=='O' || carattere=='U'||carattere=='a'|| carattere=='e'|| carattere=='i' ||carattere=='o' || carattere=='u'){
        //True: sono vocali
        return 1;
    }
    else{
        //False: sono consonanti
        return 0;
    }
}

//Trasforma il carattere minuscolo in minuscolo
int maiuscolo(carattere){
    int i;
    if(97<carattere<122){
        carattere=carattere+32;
    }
}

int main(){
    
    //Introduzioni delle variabili
    char nome[20],cognome[30],nomec[20],cognomec[30];
    char codfiscale[6];
    int i,j,risn,risc;
    int contatore=0;
    char x='X';
    
    //Input
    printf("Inserisci il tuo nome: ");
    gets(nome);
    
    printf("Inserisci il tuo cognome: ");
    gets(cognome);
    
    //Inserimento cognome
    for(i=0;i<strlen(cognome);i++){
        risn=isvocali(nome[i]);
        if(risn==0 && contatore<4){
            codfiscale[contatore]=cognome[i];
            contatore=contatore+1;
        }
        if(contatore>=3){
            break;
        }
        if(i==strlen(cognome)-1 && contatore<4){
            for(j=0;j<strlen(cognome);j++){
                if(risn==1 && contatore<4){
                    codfiscale[contatore]=cognome[j];
                    contatore=contatore+1;
                }
                if(contatore<3){
                    contatore=contatore+1;
                    strcat(&x,codfiscale);
                }
                }
                }
        }
        strcat(nomec,nome);
            
 /*   //Inserimento nome
    for(i=0;strlen(nome);i++){
        risn=isvocali(nome[i]);
    }
   */     
        
    //Stampa della lista
    for(i=0;i<strlen(codfiscale);i++){
        printf("%c",codfiscale[i]);
    
    }
    //printf("%s",nomec);
    getchar();
    return 0;
    
}
Nel codice fiscale le prime 3 lettere sono del cognome, le altre 3 del nome. Lo so, gets fa schifo ma ci hanno detto di usare solo quello.

Il problema? Il cognome lo dà sbagliato… (il nome lo farò più tardi). Any help?

Grazie in anticipo :-)
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2013, 19:59   #2
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Mmm, non l'ho provato, però occhio qua:
Codice:
for(i=0;i<strlen(cognome);i++){
        risn=isvocali(nome[i]);
        if(risn==0 && contatore<4){
            codfiscale[contatore]=cognome[i];
            contatore=contatore+1;
Non dovrebbe essere cognome[i]?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2013, 15:37   #3
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
che scemo è vero… ma come si spiega il punto interrogativo che arriva sempre in fondo?

Quote:
/*
* Esercizio CODICE FISCALE:
* Cognome:
* -le prime 3 conosonanti
* -se non hai cononanti metti le vocali
* -se non hai vocali la terza lettera e' una X Es(YEX)
*
*
* Nome:
* -1∞,2∞,4∞ consonanti se ne ha 3
* -1∞,2∞,3∞ cononanti se non ha la quarta
*
* Created by Pietro on 02/02/2013.
* Copyright 2013. All rights reserved.
*
*/

#include <stdio.h>
#include<string.h>

//riceve un caratere e dice Vero se Ë vocale
int isvocali(carattere){
if(carattere=='A' ||carattere=='E'|| carattere=='I' || carattere=='O' || carattere=='U'||carattere=='a'|| carattere=='e'|| carattere=='i' ||carattere=='o' || carattere=='u'){
//True: sono vocali
return 1;
}
else{
//False: sono consonanti
return 0;
}
}

//Trasforma il carattere minuscolo in minuscolo
int maiuscolo(carattere){
if(97<carattere<122){
carattere=carattere+32;
}
}

int main(){

//Introduzioni delle variabili
char nome[20],cognome[30],nomec[20],cognomec[30];
char codfiscale[6];
int i,j,risn,risc;
int contatore=0;
char x='X';

//Input
printf("Inserisci il tuo nome: ");
gets(nome);

printf("Inserisci il tuo cognome: ");
gets(cognome);

//Inserimento cognome
for(i=0;i<strlen(cognome);i++){
risc=isvocali(cognome[i]);
//Funzionamento normale
if(risc==0 && contatore<4){
codfiscale[contatore]=cognome[i];
contatore=contatore+1;
}
if(contatore>=3){
break;
}
//Funzionamento ausiliario
if(i==strlen(cognome)-1 && contatore<4){
for(j=0;j<strlen(cognome);j++){
if(risc==1 && contatore<4){
codfiscale[contatore]=cognome[j];
contatore=contatore+1;
}
if(contatore<3){
contatore=contatore+1;
strcat(&x,codfiscale);
}
}
}
}
strcat(nomec,nome);

//Inserimento nome
for(i=0;i<strlen(nome);i++){
risn=isvocali(nome[i]);
//Funzionamento normale
if(risn==0 && contatore<6){
codfiscale[contatore]=nome[i];
contatore=contatore+1;
}
if (5<=contatore<7) {
i++;
if (5<=contatore<7 && risn==0) {
codfiscale[contatore]=nome[i];
contatore=contatore+1;
}
}
if(contatore>=6){
break;
}
//Funzionamento ausiliario
if(i==strlen(nome)-1 && contatore<7){
for(j=0;j<strlen(nome);j++){
if(risn==1 && contatore<7){
codfiscale[contatore]=nome[j];
contatore=contatore+1;
}
if(contatore<6){
contatore=contatore+1;
strcat(&x,codfiscale);
}
}
}
}
strcat(cognomec,cognome);


//Stampa della lista
for(i=0;i<strlen(codfiscale);i++){
printf("%c",codfiscale[i]);

}

//The End
getchar();
return 0;
}
Ho aggiornato il codice… ancora più casini di prima D:
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 

Ultima modifica di <B>Pietro<B> : 04-02-2013 alle 18:48.
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2013, 17:37   #4
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Indenta bene sto codice, non si capisce una mazza
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2013, 18:56   #5
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
/*
* Esercizio CODICE FISCALE:
* Cognome:
* -le prime 3 conosonanti
* -se non hai cononanti metti le vocali
* -se non hai vocali la terza lettera e' una X Es(YEX)
*
*
* Nome:
* -1∞,2∞,4∞ consonanti se ne ha 3
* -1∞,2∞,3∞ cononanti se non ha la quarta
*
* Created by Pietro on 02/02/2013.
* Copyright 2013. All rights reserved.
*
*/

#include <stdio.h>
#include<string.h>

//riceve un caratere e dice Vero se Ë vocale
int isvocali(carattere){
if(carattere=='A' ||carattere=='E'|| carattere=='I' || carattere=='O' || carattere=='U'||carattere=='a'|| carattere=='e'|| carattere=='i' ||carattere=='o' || carattere=='u'){
//True: sono vocali
return 1;
}
else{
//False: sono consonanti
return 0;
}
}

//Trasforma il carattere minuscolo in minuscolo
int maiuscolo(carattere){
if(97<carattere<122){
carattere=carattere+32;
}
}

int main(){

//Introduzioni delle variabili
char nome[20],cognome[30],nomec[20],cognomec[30];
char codfiscale[6];
int i,j,risn,risc;
int contatore=0;
char x='X';

//Input
printf("Inserisci il tuo nome: ");
gets(nome);

printf("Inserisci il tuo cognome: ");
gets(cognome);
//Inserimento cognome
for(i=0;i<strlen(cognome);i++){
risc=isvocali(cognome[i]);
//Funzionamento normale
if(risc==0 && contatore<4){
codfiscale[contatore]=cognome[i];
contatore=contatore+1;
}
if(contatore>=3){
break;
}
//Funzionamento ausiliario
if(i==strlen(cognome)-1 && contatore<4){
for(j=0;j<strlen(cognome);j++){
if(risc==1 && contatore<4){
codfiscale[contatore]=cognome[j];
contatore=contatore+1;
}
if(contatore<3){
contatore=contatore+1;
strcat(&x,codfiscale);
}
}
}
}
strcat(nomec,nome);
//Inserimento nome
for(i=0;i<strlen(nome);i++){
risn=isvocali(nome[i]);
//Funzionamento normale
if(risn==0 && contatore<6){
codfiscale[contatore]=nome[i];
contatore=contatore+1;
}
if (5<=contatore<7) {
i++;
if (5<=contatore<7 && risn==0) {
codfiscale[contatore]=nome[i];
contatore=contatore+1;
}
}
if(contatore>=6){
break;
}
//Funzionamento ausiliario
if(i==strlen(nome)-1 && contatore<7){
for(j=0;j<strlen(nome);j++){
if(risn==1 && contatore<7){
codfiscale[contatore]=nome[j];
contatore=contatore+1;
}
if(contatore<6){
contatore=contatore+1;
strcat(&x,codfiscale);
}
}
}
}
strcat(cognomec,cognome);
//Stampa della lista
for(i=0;i<strlen(codfiscale);i++){
printf("%c",codfiscale[i]);

}

//The End
getchar();
return 0;
}

Ho indentato solo una parte perché l'indentamento non lo dà in automatico
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2013, 21:15   #6
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Codice:
if(risn==0 && contatore<6){
			
			codfiscale[contatore]=nome[i];
			contatore=contatore+1;
			
		}
		
		if (5<=contatore<7) {
			
			i++;
			if (5<=contatore<7 && risn==0) {
				
				codfiscale[contatore]=nome[i];
				contatore=contatore+1;
				
			}
			
		}
Qui dentro, se il contatore rimane nel range, prendi la lettera che c'è subito dopo senza controllare che sia una vocale.
Tra l'altro, perchè non usi una funzione unica per generare le prime 6 lettere del codice?
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2013, 17:27   #7
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
Codice aggiornato:

Codice:
/*
 *  Esercizio CODICE FISCALE:
 *  Cognome:
 *          -le prime 3 conosonanti
 *          -se non hai cononanti metti le vocali
 *          -se non hai vocali la terza lettera e' una X Es(YEX)
 *
 *
 *  Nome:
 *       -1∞,2∞,4∞ consonanti se ne ha 3
 *       -1∞,2∞,3∞ cononanti se non ha la quarta
 *
 *  Created by Pietro on 02/02/2013.
 *  Copyright 2013. All rights reserved.
 *
 */

#include <stdio.h>
#include<string.h>

//riceve un caratere e dice Vero se Ë vocale
int isvocali(carattere){
    if(carattere=='A' ||carattere=='E'|| carattere=='I' || carattere=='O' || carattere=='U'||carattere=='a'|| carattere=='e'|| carattere=='i' ||carattere=='o' || carattere=='u'){
        //True 1: sono vocali
        return 1;
    }
    else{
        //False 0: sono consonanti
        return 0;
    }
}

//Trasforma la stringa da minuscola in minuscola
int maiuscolo(stringa){
    int i;
    for(i=0;i<strlen(stringa);i++){
        if(97<stringa[i]<122){
            stringa[i]=stringa[i+32]
        }
    }
    return stringa;
}

int main(){
    
    //Introduzioni delle variabili
    char nome[20],cognome[30],nomec[20],cognomec[30];
    char codfiscale[6];
    int i,j;           //Variabili for
    int risn,risc; //Verifica vocali/consonanti
    int contatore=0;
    char nomen[20],cognomen[30]; //Input iniziale
    char x='X';
    
    //Input
    printf("Inserisci il tuo nome: ");
    gets(nomen);
    nome=maiuscolo(nomen);
    
    printf("Inserisci il tuo cognome: ");
    gets(cognomen);
    cognome=maiuscolo(cognomen);
    
    //Inserimento cognome
    for(i=0;i<strlen(cognome);i++){
        risc=isvocali(cognome[i]);
        //Funzionamento normale
        if(risc==0 && contatore<4){
            codfiscale[contatore]=cognome[i];
            contatore=contatore+1;
        }
        if(contatore>=3){
            break;                                   //BREAK
        }
        //Funzionamento ausiliario: se finiscono le consonanti
        if(i==strlen(cognome)-1 && contatore<4){
            for(j=0;j<strlen(cognome);j++){
                if(risc==1 && contatore<4){
                    codfiscale[contatore]=cognome[j];
                    contatore=contatore+1;
                }
                if(contatore<3){
                    contatore=contatore+1;
                    strcat(&x,codfiscale);
                }
            }
        }
    }
    strcat(nomec,nome);
    
    //Inserimento nome
    if(contatore>2 && contatore<7){
        for(i=0;i<strlen(nome);i++){
            risn=isvocali(nome[i]);
            //Funzionamento normale
            if(risn==0 && contatore<7){ //Se consonanti
                codfiscale[contatore]=nome[i];
                contatore=contatore+1;
            }
            if (contatore>=5 && contatore<7 && risn==0) { //Se consonanti
                i++;
                if (contatore>4 && contatore<7 && risn==0) {
                    codfiscale[contatore]=nome[i];
                    contatore=contatore+1;
                }
            }
            if(contatore>=6){
                break;                                   //BREAK
            }
            //Funzionamento ausiliario: se finiscono le consonanti
            if(i==strlen(nome)-1 && contatore<7){
                for(j=0;j<strlen(nome);j++){
                    if(risn==1 && contatore<7){  //Se vocali
                        codfiscale[contatore]=nome[j];
                        contatore=contatore+1;
                    }
                    if(contatore<6){
                        contatore=contatore+1;
                        strcat(&x,codfiscale);
                    }
                }
            }
        }
        strcat(cognomec,cognome);
    }
    
    
    //Stampa della lista
    codfiscale=maiuscolo(codfiscale); //Funzione che non va D:
    for(i=0;i<strlen(codfiscale);i++){
        printf("%c",codfiscale[i]);
    }
    
    //The End
    getchar();
    return 0;
}
Ok in teoria adesso funziona… però su Mac mi dà rogne… Adesso il problema è che devo metterle in maiuscolo… quindi ho richiamato la funzione apposita per trasformare… ma dà errore!
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2013, 18:07   #8
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Allora, vedo che non hai molto chiaro come funzionano le stringhe in C. E pare nemmeno le funzioni
Partiamo dalle funzioni:
Una funzione deve essere definita così:
Codice:
<tipo variabile di ritorno> nomefunzione(<tipo argomento1> argomento1,..,<tipo argomentoN> argomentoN)
Stringhe/vettori: per come vengono gestiti i vettori e le stringhe ( che non sono altro che vettori di tipo char ), il passaggio da una funzione all'altra tramite argomento di una funzione viene sempre effettuato per riferimento, ad esempio:
Codice:
void funzione(char* stringa )
{
//fai qualcosa
}

int main(void){
char stringa[20]

funzione(stringa)
return 0
}
Quello che ho fatto è passare l'indirizzo del primo elemento di stringa a funzione. L'argomento di funzione è un puntatore a char, quindi quando faccio nel main:
Codice:
funzione(stringa)
sto passando per riferimento ( ovvero invio alla funzione un indirizzo -nel nostro caso l'indirizzo di dove si trova stringa in memoria ) una variabile.

Il passaggio per riferimento implica che ogni modifica apporta alla variabile, si ripercuote anche sulla variabile nel main.
Di conseguenza, cambiando stringa dentro funzione, le modifiche si troveranno automaticamente anche nel main.

Nota che una scrittura alternativa per chiamare la funzione passandogli una stringa è:
Codice:
funzione(&stringa[0])
che vuol dire:"Prendi l'indirizzo del primo elemento di stringa e mandalo a funzione".

Il codice che hai scritto ha parecchi errori in questo senso. Prova a riguardarlo dopo aver compreso quello che ti ho spiegato.

Un'ultima nota, spesso si pensa che facendo una cosa del genere:
Codice:
stringa2=stringa1
si copi il contenuto di stringa1 dentro stringa2. FALSO
Per copiare il contenuto di stringa1 dentro stringa2 devi fare così ( se stringa1 e stringa2 hanno 20 elementi ):
Codice:
for(i=0; i<20; i++)
stringa2[i]=stringa1[i];
Oppure usare l'apposita funzione che trovi nella libreria string.h

Spero di essere stato chiaro.
Se hai dubbi, fatti sentire.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2013, 18:31   #9
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
ok ci sono grazie per queste dritte… però quando trasformo mi dà il codice ASCII…

Codice:
//Trasforma la stringa da minuscola in minuscola
int maiuscolo(carattere){
    if(97<carattere<122){
        carattere+=32;
    }
    return carattere;
}
C'è un modo per farmi dare il carattere char?
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2013, 18:50   #10
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da <B>Pietro<B> Guarda i messaggi
ok ci sono grazie per queste dritte… però quando trasformo mi dà il codice ASCII…

Codice:
//Trasforma la stringa da minuscola in minuscola
int maiuscolo(carattere){
    if(97<carattere<122){
        carattere+=32;
    }
    return carattere;
}
C'è un modo per farmi dare il carattere char?
Ci sono le funzione atoi e itoa

Cmq, se passi un carattere alla volta, fai prima a mettere char come tipo di valore di ritorno e passare un char come argomento.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2013, 18:53   #11
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
Quote:
Originariamente inviato da kwb Guarda i messaggi
Ci sono le funzione atoi e itoa

Cmq, se passi un carattere alla volta, fai prima a mettere char come tipo di valore di ritorno e passare un char come argomento.
Ehm… che? intendi

return char carattere; ?

Ma quindi alla funzione spedisco il valore ASCII e non il char?
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2013, 19:19   #12
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da <B>Pietro<B> Guarda i messaggi
Ehm… che? intendi

return char carattere; ?

Ma quindi alla funzione spedisco il valore ASCII e non il char?
atoi: http://www.cplusplus.com/reference/cstdlib/atoi/
itoa: http://www.cplusplus.com/reference/cstdlib/itoa/

Devi sapere che in C, se prendi un carattere e lo salvi in una variabile int, questo corrisponderà al numero ASCII.
Quello che ti dicevo di fare è:
Codice:
char maiuscolo(char carattere){
int n=0;
n=atoi(carattere);
if(n > 97 && n < 122)
n+=32;

return itoa(n);
}
In buona sostanza, tu passi negli argomenti di maiuscolo un carattere non un intero.
La funzione di ritorna un carattere, non un intero.
Non hai bisogno di convertire fuori dalla funzione. Il tutto, visto dal main è trasparente: entra un carattere minuscolo, esce il corrispondente maiuscolo.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 05-02-2013, 22:24   #13
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
Codice:
//Trasforma la stringa da minuscola in minuscola
char maiuscolo(char carattere){
    int n=0;
    n=atoi(&carattere);
    if(n > 97 && n < 122)
        n+=32;
    
    return itoa(n);
}
Mancava una '&' nel carattere (me lo segnava XCode… è normale?).

Mi segna tuttavia un altro errore: "Implicit declaration of function 'itoa' is invalid in C99". Why?

P.S.
Conosci per caso un buon sito dove spiega il concetto delle stringhe/funzioni/ASCII(nella gestione delle stringhe) in modo che possa riguardare tutti questi concetti?
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2013, 00:15   #14
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da <B>Pietro<B> Guarda i messaggi
Codice:
//Trasforma la stringa da minuscola in minuscola
char maiuscolo(char carattere){
    int n=0;
    n=atoi(&carattere);
    if(n > 97 && n < 122)
        n+=32;
    
    return itoa(n);
}
Mancava una '&' nel carattere (me lo segnava XCode… è normale?).
Se vai a rivedere i link che ti ho dato, noterai che il prototipo di atoi prende come argomento un puntatore a carattere.
È quindi ovvio che sia necessario passare l'indirizzo del carattere ad atoi e non il valore.
Codice:
int atoi ( const char * str );
Quote:
Originariamente inviato da <B>Pietro<B> Guarda i messaggi
Mi segna tuttavia un altro errore: "Implicit declaration of function 'itoa' is invalid in C99". Why?
Credo debba includere anche la libreria stdlib.h
Queste due funzioni si trovano in quella libreria.

Quote:
Originariamente inviato da <B>Pietro<B> Guarda i messaggi
P.S.
Conosci per caso un buon sito dove spiega il concetto delle stringhe/funzioni/ASCII(nella gestione delle stringhe) in modo che possa riguardare tutti questi concetti?
Un sito non saprei...
Posso consigliarti, per studiare C, questo libro: Al Kelley, Ira Pohl - C: Didattica e Programmazione
Io ho studiato su questo e l'ho trovato veramente ben fatto, spiega le cose in maniera banale per chi non ha mai fatto C.

Invece, per quando sei un po' più esperto, questo è il libro che ogni programmatore di C che si rispetti deve avere in casa: The C Programming Language
C'è anche la versione italiana.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2013, 18:11   #15
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
stdlib.h l'avevo già messo, ma la funzione itoa() non è più nello standard (c'è solo atomi stranamente)… Ci sono altre soluzioni fuorché scrivere milioni di if?
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2013, 18:53   #16
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da <B>Pietro<B> Guarda i messaggi
stdlib.h l'avevo già messo, ma la funzione itoa() non è più nello standard (c'è solo atomi stranamente)… Ci sono altre soluzioni fuorché scrivere milioni di if?
Allora, se itoa non c'è più, il problema si risolve in fretta:
Codice:
int main (int argc, const char * argv[])
{
	char a;
	int conv;
	
	printf("Inserisci un numero:\n");
   scanf("%d",&conv);
	a=conv;
	printf("carattere: %c\n",a);
	return 0;
}
Se inserisci il numero decimale corrispondente alla lettera ASCII allora quando stamperai il carattere ( a ) ti restituirà il carattere ascii.
Prova questo piccolo codice per capire!
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2013, 19:12   #17
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
ah ok ho capito se si può fare anche così…

CODICE FUNZIONE
Codice:
//Trasforma la stringa da minuscola in minuscola
char maiuscolo(char carattere){
    int n=0;
    char a;
    n=atoi(&carattere);
    if(n > 97 && n < 122){
        n+=32;
        a=n;
        return a;
    }
}
CODICE NOME INPUT
Codice:
//Input
    printf("Inserisci il tuo nome: ");
    gets(nomen);
    for (i=0; i<strlen(nomen); i++) {
        nome[i]=nomen[i];
        nome[i]=maiuscolo(nome[i]);
        printf("%d\n",nome[i]);
    }
Questo è ciò che ho scritto… Tuttavia nel printf dà solo zeri, non capisco…

Quote:
Un sito non saprei...
Posso consigliarti, per studiare C, questo libro: Al Kelley, Ira Pohl - C: Didattica e Programmazione
Io ho studiato su questo e l'ho trovato veramente ben fatto, spiega le cose in maniera banale per chi non ha mai fatto C.

Invece, per quando sei un po' più esperto, questo è il libro che ogni programmatore di C che si rispetti deve avere in casa: The C Programming Language
C'è anche la versione italiana.
Grazie ho guardato, ci farò un pensierino :-)
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2013, 20:20   #18
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
per caso mi hai riposto? Perché mi è arrivata la mail dicendomi che avevi scritto qualcosa ma non mi appare nulla sul forum…
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2013, 21:37   #19
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Allora, anzitutto mi devi scusare perchè ti ho detto una maestra asinata: atoi converte una stringa ascii da tipo char a intero. Questo funziona a patto che la stringa inserita sia un numero ( quindi i caratteri devono corrispondere al numero decimale ASCII, nello specifico nell'intervallo [48;57] ).
Ecco perchè non funziona.
Cmq qui ti propongo l'alternativa:
Codice:
char maiuscolo(char carattere){
	int n=0;
	char a;
	n=carattere;
	if(n >= 97 && n <= 122){
		n-=32;
		return n;
	}
}
Hai fatto un errore: non devi aggiungere 32, perchè tu vuoi tornare indietro ( i caratteri maiuscoli vengono prima dei minuscoli in ASCII ), quindi devi sottrarre 32.
Inoltre, gli intervalli che hai messo devi metterli compresi. [97;122] e non (97;122)
Inoltre, pensa a questa domanda: che succede se il carattere non è compreso nell'intervallo? Cosa ritorna la funzione maiuscolo?

Ti chiedo ancora scusa per il disguido su atoi: era parecchio che non usavo quella funzione ( è parecchio che non uso C, diciamolo ) e non ricordavo bene lo stato delle cose...

Fammi sapere.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 06-02-2013, 22:28   #20
<B>Pietro<B>
Member
 
L'Avatar di <B>Pietro<B>
 
Iscritto dal: Oct 2009
Messaggi: 165
Abbiamo risolto il problema della funzione! Tuttavia… printa anche il cognome uscendo dal limite dell'array! Infatti, stampa il codice fiscale in modo corretto (in maiuscolo ) e attaccato il cognome.

CODICE AGGIORNATO:
Codice:
/*
 *  Esercizio CODICE FISCALE:
 *  Cognome:
 *          -le prime 3 conosonanti
 *          -se non hai cononanti metti le vocali
 *          -se non hai vocali la terza lettera e' una X Es(YEX)
 *
 *
 *  Nome:
 *       -1∞,2∞,4∞ consonanti se ne ha 3
 *       -1∞,2∞,3∞ cononanti se non ha la quarta
 *
 *  Created by Pietro on 02/02/2013.
 *  Copyright 2013. All rights reserved.
 *
 */

#include <stdio.h>
#include <string.h>
#define DIM 6

//Riceve un caratere e dice Vero se e' vocale
int isvocali(carattere){
    if(carattere=='A' ||carattere=='E'|| carattere=='I' || carattere=='O' || carattere=='U'||carattere=='a'|| carattere=='e'|| carattere=='i' ||carattere=='o' || carattere=='u'){
        //True 1: sono vocali
        return 1;
    }
    else{
        //False 0: sono consonanti
        return 0;
    }
}

//Trasforma la stringa da minuscola in minuscola
char maiuscolo(char carattere){
    int n=0;
    n=carattere;
    if(n>=97 && n<=122){
        n-=32;
        return n;
    }
}

int main(){
    
    //Introduzioni delle variabili
    char nome[20],cognome[30];
    char codfiscale[DIM]; //Output
    int i,j;           //Variabili for
    int risn,risc; //Verifica vocali/consonanti
    int contatore=0;    //Contatore
    char x='X';
    
    //Input
    printf("Inserisci il tuo nome: ");
    gets(nome);
    for (i=0; i<strlen(nome); i++) {
        nome[i]=maiuscolo(nome[i]);
    }
    
    printf("Inserisci il tuo cognome: ");
    gets(cognome);
    for (i=0; i<strlen(cognome); i++) {
        cognome[i]=maiuscolo(cognome[i]);
    }
    
    //Inserimento cognome
    for(i=0;i<strlen(cognome);i++){
        risc=isvocali(cognome[i]);
        //Funzionamento normale
        if(risc==0 && contatore<4){
            codfiscale[contatore]=cognome[i];
            contatore=contatore+1;
        }
        if(contatore>=3){
            break;                                   //BREAK
        }
        //Funzionamento ausiliario: se finiscono le consonanti
        if(i==strlen(cognome)-1 && contatore<4){
            for(j=0;j<strlen(cognome);j++){
                if(risc==1 && contatore<4){
                    codfiscale[contatore]=cognome[j];
                    contatore=contatore+1;
                }
                while(j==strlen(cognome)-1 && contatore<3){
                    contatore=contatore+1;
                    strcat(codfiscale,&x); //Inserisco X
                }
            }
        }
    }

    //Inserimento nome
    if(contatore>2 && contatore<7){
        for(i=0;i<strlen(nome);i++){
            risn=isvocali(nome[i]);
            //Funzionamento normale
            if(risn==0 && contatore<7){ //Se consonanti
                codfiscale[contatore]=nome[i];
                contatore=contatore+1;
            }
            if (contatore>=5 && contatore<7 && risn==0) { //Se consonanti
                i++;
                if (contatore>4 && contatore<7 && risn==0) {
                    codfiscale[contatore]=nome[i];
                    contatore=contatore+1;
                }
            }
            if(contatore>=6){
                break;                                   //BREAK
            }
            //Funzionamento ausiliario: se finiscono le consonanti
            if(i==strlen(nome)-1 && contatore<7){
                for(j=0;j<strlen(nome);j++){
                    if(risn==1 && contatore<7){  //Se vocali
                        codfiscale[contatore]=nome[j];
                        contatore=contatore+1;
                    }
                    while(j==strlen(nome)-1 && contatore<6){
                        contatore=contatore+1;
                        strcat(codfiscale,&x); //Inserisco X
                    }
                }
            }
        }
    }
    
    
    //Stampa della lista
    for(i=0;i<strlen(codfiscale);i++){
        printf("%c",codfiscale[i]);
    }
    
    //The End
    getchar();
    return 0;
}
Ora è tardi, controllerò domani… In ogni caso ti ringrazio veramente tanto per il supporto che mi stai fornendo
Diciamo che è ora di comprare il libro, in modo da avere delle basi solide e soprattutto un riferimento…
__________________
 Mac Mini 2006  Mac Mini 2009  iPod Touch 4G  iPod Nano 6°  Magic Mouse  Apple Keyboard  Apple Remote Control (white)  Macbook Pro 15" (2012) 

Ultima modifica di <B>Pietro<B> : 07-02-2013 alle 16:25.
<B>Pietro<B> è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
Qualcomm guarda oltre gli smartphone: ri...
539€, 629€ o 679€: 3 portatili HP o Acer...
Anche OnePlus attinge ai nomi scelti da ...
Apple non si arrende: altre due generazi...
Sky Mobile diventerà un vero e pr...
LG UltraGear OLED 27GX700A: debutta il p...
TIM e Poste lavorano a una joint venture...
1.200 CV e drift a 213 km/h: la supercar...
Shenzhou-21: esperimenti sui topi in orb...
Cloudera punta su cloud privato e intell...
Il mistero del Ryzen 7 9700X3D: prezzo p...
Posticipato il rientro dell'equipaggio c...
Propaganda russa e hactivism fra le prin...
Superluna del Castoro: stasera il satell...
NVIDIA regala una GeForce RTX 5090 Found...
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: 08:30.


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