[Risolto][C++]File maiuscole e minuscole

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

[Risolto][C++]File maiuscole e minuscole

Messaggio da JhW »

Salve a tutti,
ho scritto un programma in C++ che dovrebbe, partendo da un file parole.txt, riconoscere le parole minuscole, maiuscole e miste e scriverle rispettivamente su Minuscole.txt, Maiuscole.txt e ignorare le parole miste. Esempio:

parole.txt
tastiera MOUSE StEreo.
TeLecomando SVEGLIA bottiglia.
......

Maiuscole.txt
MOUSE
SVEGLIA
...

Minuscole.txt
tastiera
bottiglia
...

questo è il codice:

Codice: Seleziona tutto

#include <iostream>
#include <fstream>

using namespace std;

enum tipo_stringa {UPPER, LOWER, MIXED};

void costruisci_file();
tipo_stringa check_array_of_char(char []);

int main()
{

	costruisci_file();

	return 0;
}

void costruisci_file()
{
	char parola[30];
	fstream file_parole, file_minuscole, file_maiuscole;
	tipo_stringa tipo;

	file_parole.open("parole.txt", ios::in);
	file_minuscole.open("Minuscole.txt", ios::out);
	file_maiuscole.open("Maiuscole.txt", ios::out);
	if((!file_parole) || (!file_minuscole) || (!file_maiuscole))
	{
		cerr << "File non esistente" << endl;
		return;
	}

	while(file_parole >> parola)
	{
		cout << parola;
		tipo = check_array_of_char(parola);
		if(tipo == LOWER)
			file_minuscole << parola << endl;
		else if(tipo == UPPER)
			file_maiuscole << parola << endl;

	}

	file_parole.close();
	file_maiuscole.close();
	file_minuscole.close();

	return;

}

tipo_stringa check_array_of_char(char parola[])
{
	tipo_stringa tipo;
	int i;

	if(islower(parola[0]))
		tipo = LOWER;
	else
		tipo = UPPER;

	i = 1;
	while((parola[i] != '\0') && (parola[i] != '.'))
	{
		if(( (islower(parola[i])) && (tipo == LOWER) ) || ( (!islower(parola[i])) && (tipo == UPPER)))
			continue;
		else
			tipo = MIXED;

		i++;
	}

	if((parola[i] == '.') && (i > 0))
		parola[i-1] = '\0';

	return tipo;
}
ho controllato molte volte il codice è mi sembra apposto.. solo che quando provo ad eseguire il programma è come se andasse in loop..
non fa' perfettamente niente. Spero che qualcuno possa aiutarmi.
Ultima modifica di JhW il giovedì 10 luglio 2014, 14:47, modificato 1 volta in totale.
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++]File maiuscole e minuscole

Messaggio da 1001001 »

Ed ecco perché tutti dicono di non usare break, continue e goto :)

Nel ciclo:

Codice: Seleziona tutto

while((parola[i] != '\0') && (parola[i] != '.'))
{
  if(( (islower(parola[i])) && (tipo == LOWER) ) || ( (!islower(parola[i])) && (tipo == UPPER)))
     continue;
  else
     tipo = MIXED;

  i++;
}
se la condizione dell'if è falsa, il continue salta tutte le istruzioni successive, e i non viene mai incrementato
"I find your lack of faith disturbing."
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

Re: [C++]File maiuscole e minuscole

Messaggio da JhW »

1001001 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4613813#p4613813][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Ed ecco perché tutti dicono di non usare break, continue e goto :)

Nel ciclo:

Codice: Seleziona tutto

while((parola[i] != '\0') && (parola[i] != '.'))
{
  if(( (islower(parola[i])) && (tipo == LOWER) ) || ( (!islower(parola[i])) && (tipo == UPPER)))
     continue;
  else
     tipo = MIXED;

  i++;
}
se la condizione dell'if è falsa, il continue salta tutte le istruzioni successive, e i non viene mai incrementato
Mi aspettavo una tua risposta! :D
Pardon, lezione imparata. Ho provato a negare tutta la condizione dell'if, così:

Codice: Seleziona tutto

while((parola[i] != '\0') && (parola[i] != '.'))
{
  if(!(((islower(parola[i])) && (tipo == LOWER) ) || ( (!islower(parola[i])) && (tipo == UPPER))))
     tipo = MIXED;

  i++;
}
ma non va'. Stesso problema :cry:
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++]File maiuscole e minuscole

Messaggio da 1001001 »

Amoroso2687 ha scritto:Mi aspettavo una tua risposta! :D
:D
Amoroso2687 ha scritto:Ho provato a negare tutta la condizione dell'if, così:
Codice: Seleziona tutto
while((parola != '\0') && (parola != '.'))
{
  if(!(((islower(parola)) && (tipo == LOWER) ) || ( (!islower(parola)) && (tipo == UPPER))))
     tipo = MIXED;

  i++;
}


ma non va'. Stesso problema

Strano. A me il codice:

Codice: Seleziona tutto

#include <iostream>
#include <fstream>

using namespace std;

enum tipo_stringa {UPPER, LOWER, MIXED};

void costruisci_file();
tipo_stringa check_array_of_char(char []);

int main()
{

   costruisci_file();

   return 0;
}

void costruisci_file()
{
   char parola[30];
   fstream file_parole, file_minuscole, file_maiuscole;
   tipo_stringa tipo;

   file_parole.open("parole.txt", ios::in);
   file_minuscole.open("Minuscole.txt", ios::out);
   file_maiuscole.open("Maiuscole.txt", ios::out);
   if((!file_parole) || (!file_minuscole) || (!file_maiuscole))
   {
      cerr << "File non esistente" << endl;
      return;
   }

   while(file_parole >> parola)
   {
      cout << parola;
      tipo = check_array_of_char(parola);
      if(tipo == LOWER)
         file_minuscole << parola << endl;
      else if(tipo == UPPER)
         file_maiuscole << parola << endl;

   }

   file_parole.close();
   file_maiuscole.close();
   file_minuscole.close();

   return;

}

tipo_stringa check_array_of_char(char parola[])
{
   tipo_stringa tipo;
   int i;

   if(islower(parola[0]))
      tipo = LOWER;
   else
      tipo = UPPER;

   i = 1;
//   while((parola[i] != '\0') && (parola[i] != '.'))
//   {
//      if(( (islower(parola[i])) && (tipo == LOWER) ) || ( (!islower(parola[i])) && (tipo == UPPER)))
//         continue;
//      else
//         tipo = MIXED;
//
//      i++;
//   }
   while((parola[i] != '\0') && (parola[i] != '.'))
   {
       if(!(((islower(parola[i])) && (tipo == LOWER) ) || ( (!islower(parola[i])) && (tipo == UPPER))))
           tipo = MIXED;

       i++;
   }   

   if((parola[i] == '.') && (i > 0))
       parola[i-1] = '\0';

   return tipo;
}
(in cui ho sostituito il vecchio ciclo while con la nuova versione che hai postato nel messaggio sopra) funziona.
Potresti postare l'ultima versione del codice che stai usando?
"I find your lack of faith disturbing."
JhW
Prode Principiante
Messaggi: 53
Iscrizione: martedì 8 maggio 2012, 18:39

Re: [C++]File maiuscole e minuscole

Messaggio da JhW »

Errore mio, avevo dimenticato di compilare :D
grazie mille dell'aiuto!!!!
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [Risolto][C++]File maiuscole e minuscole

Messaggio da 1001001 »

Ok, perfetto :)

Di nulla! Ciao! :ciao:
"I find your lack of faith disturbing."
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Google [Bot] e 7 ospiti