Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
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


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...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Tutte le tappe verso l'euro digitale sec...
Nikon Comedy Wildlife 2025: le immagini ...
Il telescopio spaziale James Webb ha cat...
Tesla Roadster? Il re di ChatGPT chiede ...
Pier Giorgio Furcas raddoppia: Vice Dire...
Novità PagoPA: con Klarna:pagamen...
Per il 2026 la Cina eseguirà una ...
AMD mette in naftalina RDNA 1 ed RDNA 2?...
Blue Origin New Glenn: completato lo sta...
SpaceX risponde alla NASA sul lander lun...
Bitcoin compie 17 anni: il Whitepaper ch...
Attenzione agli HDD Western Digital Blue...
MacBook Air M4 a un super prezzo su Amaz...
Dal 12 novembre stretta sui siti porno: ...
Recensione Synology DS725+: tornano i di...
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:44.


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