View Full Version : Aiutino in C per il codice fiscale
<B>Pietro<B>
03-02-2013, 13:55
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:
/*
* 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 :-)
Mmm, non l'ho provato, però occhio qua:
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]?
<B>Pietro<B>
04-02-2013, 14:37
che scemo è vero… ma come si spiega il punto interrogativo che arriva sempre in fondo?
/*
* 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:
Indenta bene sto codice, non si capisce una mazza :D
<B>Pietro<B>
04-02-2013, 17:56
/*
* 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
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?
<B>Pietro<B>
05-02-2013, 16:27
Codice aggiornato:
/*
* 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! :help:
Allora, vedo che non hai molto chiaro come funzionano le stringhe in C. E pare nemmeno le funzioni :D
Partiamo dalle funzioni:
Una funzione deve essere definita così:
<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:
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:
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 è:
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:
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 ):
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.
<B>Pietro<B>
05-02-2013, 17:31
ok ci sono grazie per queste dritte… però quando trasformo mi dà il codice ASCII…
//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?
ok ci sono grazie per queste dritte… però quando trasformo mi dà il codice ASCII…
//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.
<B>Pietro<B>
05-02-2013, 17:53
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?
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 è:
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.
<B>Pietro<B>
05-02-2013, 21:24
//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?
//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. :)
int atoi ( const char * str );
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.
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 (http://books.google.it/books/about/C.html?id=8qOzxsoGm5kC&redir_esc=y)
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 (https://en.wikipedia.org/wiki/The_C_Programming_Language)
C'è anche la versione italiana.
<B>Pietro<B>
06-02-2013, 17:11
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?
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:
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!
<B>Pietro<B>
06-02-2013, 18:12
ah ok ho capito se si può fare anche così… :D
CODICE FUNZIONE
//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
//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…
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 :-)
<B>Pietro<B>
06-02-2013, 19:20
per caso mi hai riposto? Perché mi è arrivata la mail dicendomi che avevi scritto qualcosa ma non mi appare nulla sul forum…
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:
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 :asd: ) e non ricordavo bene lo stato delle cose...
Fammi sapere.
<B>Pietro<B>
06-02-2013, 21:28
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 :D) e attaccato il cognome.
CODICE AGGIORNATO:
/*
* 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… :D
<B>Pietro<B>
07-02-2013, 15:21
Mi sembra impossibile… funziona su Windows (Dev-C++) e non su Mac (Xcode)! Sul PC viene visualizzato correttamente, mentre sul Mac c'è il cognome attaccato alla fine.
Inoltre, le X non me le prende (quando mancano lettere)… errore SIGABRT, un errore stranissimo di Xcode… Su Windows, invece, viene, se per esempio metto "y", "Y(quadratino)<Y(faccina)X(cuore)X e altri caratteri (Unicode giusto?).
:stordita: Riusciremo mai a farcela? D:
Regola numero 1: non programmare MAI con Dev C++.
Credo sia uno dei peggiori IDE in circolazione: segna le sintassi in maniera errata e programmi che credi siano giusti, come questo, te li fa funzionare. Poi scopri che in realtà ci sono dei bug enormi nel programma solo quando lo cacci su IDE ortodossi come XCode o Code::Blocks..
Detto ciò: utilizza CodeBlocks se sei su windows/linux. Utilizza XCode se sei su Mac.
Seconda cosa: Comprati un libro o studiati il C perchè veramente ti mancano le basi :D
Terzo, il programma: Devi sapere che i vettori sono una pura astrazione: in realtà si tratta di un blocco contiguo di memoria.
Il C è un linguaggio "stupido", mi spiego: ogni vettore di carattere ( stringa ) è terminato SEMPRE da uno \0, questo perchè al momento della compilazione, il compilatore non è in grado di distinguere dove inizia e dove finisce un vettore ( di caratteri ).
Nel tuo caso specifico, il vettore codfiscale è di 6 blocchi: il che vuol dire che hai a disposizione 5 blocchi per salvare il codice fiscale, l'ultimo blocco deve essere usato per il terminatore ( \0 ). Tu questo non l'hai fatto.
Ora per pura (s)fortuna è successo che la variabile subito dopo codfiscale fosse cognome: anch'essa un vettore, anch'essa di caratteri.
Se la variabile fosse stata un intero o qualcos'altro, probabilmente avrebbe dato errore.
Ora, perchè Dev-C++ non abbia questo problema, questo non te lo so dire, come ti ho detto è veramente il più pessimissimo IDE che potessi scegliere. Invece, come hai ben visto, XCode ha funzionato correttamente e in assenza del terminatore ha continuato a stampare come se nulla fosse. Tu dirai, ma la stampa era dentro un for, e il for si fermava quando i >= alla lunghezza di len, è vero: infatti senza terminatore il programma ha pensato che codfiscale continuasse oltre la sua grandezza.
Quello che devi fare adesso è assicurarti che i vettori di caratteri siano tutti terminati da uno \0.
Poi vedo che non hai seguito ciò che ti ho detto nel post precedente: hai lasciato invariata la funzione maiuscolo. Può creare problemi... Hai cercato risposta alla domanda che ti avevo fatto?
<B>Pietro<B>
07-02-2013, 20:26
Regola numero 1: non programmare MAI con Dev C++.
Credo sia uno dei peggiori IDE in circolazione: segna le sintassi in maniera errata e programmi che credi siano giusti, come questo, te li fa funzionare. Poi scopri che in realtà ci sono dei bug enormi nel programma solo quando lo cacci su IDE ortodossi come XCode o Code::Blocks..
Detto ciò: utilizza CodeBlocks se sei su windows/linux. Utilizza XCode se sei su Mac.
Il bello è che a scuola ci consigliano caldamente di usare Dev-C++ :D
Seconda cosa: Comprati un libro o studiati il C perchè veramente ti mancano le basi :D
Hai ragione… ma nel libro che mi hai detto c'è spiegato tutto anche a chi non sa nulla (come il sottoscritto)?
Terzo, il programma: Devi sapere che i vettori sono una pura astrazione: in realtà si tratta di un blocco contiguo di memoria.
So che ti farei deprimere se te lo chiedessi ma… non ce lo hanno mai spiegato: cos'è un vettore? :D
Quello che devi fare adesso è assicurarti che i vettori di caratteri siano tutti terminati da uno \0.
Poi vedo che non hai seguito ciò che ti ho detto nel post precedente: hai lasciato invariata la funzione maiuscolo. Può creare problemi... Hai cercato risposta alla domanda che ti avevo fatto?
//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;
}
Penso che basti no? Al massimo se un utente mette numeri al posto del nome posso fare un controllo con il "do" all'input. Per il \0 ho messo la stringa lunga un carattere in più (7 invece di 6)
In ogni caso c'è un ultimo punto da correggere… rimetto il codice per chiarezza:
//Ho sostituito gli if con i while per mettere le "X", in modo che se uno si chiama "Y", metto due "X" invece di una. Comunque ho evidenziato i cambiamenti e la funzione per aggiungere la "X".
/*
* 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 7
//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;
}
Non riesco a stampare le X, il programma crasha (non sul Dev ovviamente xD)… Il punto è il strcat. L'ho evidenziato nel codice… XCode dà "(lldb)" e sulla riga della funzione segna "Thread 1: signal SIGABRT"
Il bello è che a scuola ci consigliano caldamente di usare Dev-C++ :D
No no, guarda, usate Code::Blocks piuttosto...
Leggi qua: http://www.ioprogrammo.it/cc/faq_devc_e_una_ciofeca_e_non_va_assolutamente_usato-t19852.0.html
Hai ragione… ma nel libro che mi hai detto c'è spiegato tutto anche a chi non sa nulla (come il sottoscritto)?
Il libro spiega come iniziare a programmare in C, dalle basi alle cose più complesse.
Certo è che se avessi un professore che ti desse un'infarinatura sarebbe meglio.
So che ti farei deprimere se te lo chiedessi ma… non ce lo hanno mai spiegato: cos'è un vettore? :D
Array = vettore
Array di char = vettore di char = stringa
//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;
}
Penso che basti no? Al massimo se un utente mette numeri al posto del nome posso fare un controllo con il "do" all'input. Per il \0 ho messo la stringa lunga un carattere in più (7 invece di 6)
Correto. Poi però sta a te fare dei controlli sui caratteri immessi se lo desideri.
In ogni caso c'è un ultimo punto da correggere… rimetto il codice per chiarezza:
//Ho sostituito gli if con i while per mettere le "X", in modo che se uno si chiama "Y", metto due "X" invece di una. Comunque ho evidenziato i cambiamenti e la funzione per aggiungere la "X".
/*
* 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 7
//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;
}
Non riesco a stampare le X, il programma crasha (non sul Dev ovviamente xD)… Il punto è il strcat. L'ho evidenziato nel codice… XCode dà "(lldb)" e sulla riga della funzione segna "Thread 1: signal SIGABRT"
Normale. strcat acceta come source ( sorgente ) una stringa di caratteri, non un carattere.
Il problema è facilmente risolvibile definendo la variabile x come segue:
char x[2]={'X',0};
<B>Pietro<B>
07-02-2013, 21:50
mi dà ancora lo stesso errore, ma anche se fosse giusto mi aggiungerebbe X0, invece devo mettere solo X. Ho provato a mettere \0, ma non cambia.
Comunque ho ordinato il libro la settimana prossima lo vado a ritirare, grazie per il consiglio ;)
mi dà ancora lo stesso errore, ma anche se fosse giusto mi aggiungerebbe X0, invece devo mettere solo X. Ho provato a mettere \0, ma non cambia.
Comunque ho ordinato il libro la settimana prossima lo vado a ritirare, grazie per il consiglio ;)
Impossibile. Ho provato il codice :D
Cmq fai attenzione:
char x[2]={'X',0};
Nota che il secondo carattere è senza apici, quindi è un numero. In questo specifico caso, lo 0 messo li corrisponde a \0
<B>Pietro<B>
07-02-2013, 22:02
non ne ho idea mi segnala comunque errore… comunque
while(j==strlen(nome)-1 && contatore<6){
codfiscale[contatore]='X';
contatore=contatore+1;
//strcat(codfiscale,x); //Inserisco X
}
funziona, finalmente!! Ripubblico il codice per concludere:
/*
* 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 7
//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';
char x[2]={'X',0};
//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){
codfiscale[contatore]='X';
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){
codfiscale[contatore]='X';
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;
}
Grazie mille, mi hai aiutato veramente tanto :) Ora ho ordinato il libro spero di farmi delle buone basi. Sabato ho la verifica, speriamo in bene :D
Hmm... In bocca al lupo, anche se.. non è un po' tardi per studiare ora?:stordita:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.