Erro na saída do programa

1. Erro na saída do programa

Jose Renan Assis
JoseRenan

(usa Ubuntu)

Enviado em 23/08/2012 - 11:58h


#include <iostream>
#include <fstream>
#include <locale>
#include <cstdlib>
#include <sstream>
using namespace std;
int main ()
{
setlocale(LC_ALL,"portuguese");
string arquivo;
int i=0;
bool aux=false;
char opcao;
cout<<"1- Salvar um jogo"
<<"\n2- Ler um jogo\n";
cin>>opcao;
if (opcao=='1')
{
cout<<"Nome do jogo: ";
cin>>arquivo;
ofstream fout(arquivo.c_str());
ostringstream jogos[6];
int jogo[6];
for (i=0; i<6; i++)
{
cout<<i+1<<"º número: ";
cin>>jogo[i];
jogos[i]<<jogo[i]<<"\t";
if (jogo[i]>60||jogo[i]<1)
{
cout<<"Digite outro número\a!\n"; --i;
}
if (i==5)
{
int temp=jogo[0];
for (int j=1 ; j<6; j++)
{
{
if( jogo[j] == temp ) aux=true;
else temp=jogo[j];
}
}
}
if (aux == true)
{
cout<<"\n\tVocê digitou números repetidos!\n\t Preste mais atenção!\n\a";
delete[] jogo, jogos;
i=-1;
aux=false;
}
if (i==5 && aux==false)
{
for (int k=0; k<6; k++)
{
for (int j=0; j<jogos[k].str().length(); j++)
{
aux=jogos[k].str().at(j);
fout.put(aux);
}
}
}
}
}
return 0;
}


Fiz o programa acima que lê os números digitados pelo usuário e salva esses números da mega-sena em um arquivo .txt, só que o arquivo txt fica sem nada depois da execução do programa. Alguém pode me dar um help ae?

Tem esse outro programa aqui que é usado os mesmos recursos e está funcionando bem, fiz uma comparação com os dois mais não acho nada errado.

/* Uma loja de artesanato possui apenas 1 vendedor e comercializa 10 tipos de objetos.
O vendedor recebe, mensalmente, salário de R$ 400,00, acrescido de 5% do valor total de suas vendas.
O valor unitário dos objetos deve ser informado e armazenado em um vetor;
a quantidade vendida de cada peça deve ficar em outro vetor, mas na mesma posição.
Crie um programa que receba os preços e as quantidades vendidas, armazenando-as em seus respectivos vetores
(ambos com tamanho dez). Depois determine e mostre: um relatório contendo quantidade vendida, valor unitário
e valor total de cada objeto.
*/
#include <iostream>
#include <locale>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int main ()
{
setlocale(LC_ALL,"portuguese"); int opcao;
cout<<"1- Gerar novo relatório\n2- Ler relatório\nOpção: ";
cin>>opcao;
char aux;
system("cls || clear");
if (opcao==1)
{
ofstream fout("relatório.txt"); //cria o arquivo
double vun[11], qtdv[11], salario=0;
ostringstream s[12];
for (int i=1; i<11; i++)
{
cout<<"Digite o preço do produto "<<i<<": ";
cin>>vun[i];
cout<<"Digite a quantidade de unidades vendidas do produto "<<i<<": ";
cin>>qtdv[i];
salario=vun[i]*qtdv[i]+salario;
}
system ("cls || clear");
s[0]<<"\nProduto\t Qtd vendida\t V. Unitário\t V. total"; //salva a saída para a string de saída s
cout<<s[0].str(); //.str() pode ser usada pra obter uma cópia da
//string que está sendo manipulada pelo atual fluxo (stream)
for (int i=1; i<11; i++)
{
s[i]<<"\n "<<i<<"\t\t"<<qtdv[i]<<"\t\t\t"<<vun[i]<<"\t\t\t"<<vun[i]*qtdv[i];
cout<<s[i].str();
}
s[11]<<"\nSalário: R$"<<400+salario*0.5<<"\n";
cout<<s[11].str();
for (int j=0; j<12; j++)
{
for (int i=0; i<s[j].str().length(); i++) //lê o tamanho das strings para ler caractere
{ //por caracter e copiar para o arquivo
aux=s[j].str().at(i);
fout.put(aux);
}
}
} else if (opcao==2) {
string aux1;
ifstream fin("relatório.txt"); //procura pelo arquivo relatório.txt
if (!fin) {cout<<"Arquivo não encontrado!\a\n"; system("pause"); return 0;}
while ( getline(fin,aux1) ) cout<<aux1<<endl;
} else cout<<"Opções 1 e 2, somente!\a\n";
system ("pause");
return 0;
}



  


2. Re: Erro na saída do programa

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/08/2012 - 23:23h

Os dois programas parecem fazer coisas demais desnecessariamente. Por que gravar no arquivo caráter a caráter, usando um array (!) de stringstreams como buffers intermediários, em lugar de jogar diretamente os dados para a saída.

Além disso, a lógica de verificação de números repetidos está muito confusa. Não é uma prática de programação muito elegante ter um bloco for que incrementa uma variável de controle e, ao mesmo tempo, decrementar condicionalmente (e de forma pouco previsível) essa variável de controle ao longo do loop. Mesmo que esteja funcionalmente certo, deixa o program difícil de ler.

Veja se o loop na forma seguinte não fica mais calro (alem de ter mensagens indicativas mais claras para o usuário).

for (i=0; i<6; i++) {
do {
ja_leu=false;
do {
if (ja_leu)
std::cerr << "O número digitado está fora do intervalo. Tente novamente.\n";

std::cout << "Digite o " << i+1 << "º numero (entre 1 e 60): ";
std::cin >> numero;
ja_leu=true;
} while (numero<1 || numero>60);

for (repetido=false, j=0; !repetido && j<i; j++)
repetido=(numero==jogo[j]);

if(repetido)
std::cerr << "O número digitado é igual ao " << j << "º número, digitado anteriormente. Tente outro número.\n";

} while (repetido);
}



3. Re: Erro na saída do programa

Jose Renan Assis
JoseRenan

(usa Ubuntu)

Enviado em 24/08/2012 - 12:15h

Concordo que o programa está meio confuso! Estou dando uma "limpa" nele, resolvi o problema de gravação ontem e incrementarei novas opções assim que esta parte estiver boa.

Sobre gravar caractere por caractere no arquivo, faço isso pois não arranjei um jeito de jogar a strintstream diretamente no arquivo, realmente seria muito mais simples jogar a saída direto no arquivo em vez de converter a stringstream para uma string normal e usar for para ler e gravar caractere por caractere. Obrigado pelo toque! Depois posto o código aqui denovo!





4. Re: Erro na saída do programa

Jose Renan Assis
JoseRenan

(usa Ubuntu)

Enviado em 04/09/2012 - 11:38h

Depois de ter corrigido o programa em alguns lugares e tals o código atualmente é esse:

#include <iostream>
#include <fstream>
#include <locale>
#include <cstdlib>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;
int main ()
{
setlocale(LC_ALL,"portuguese");
char opcao, aux;
bool repetido=false;
ofstream arquivo;
ifstream entrada;
ostringstream nome2[1500];
string nomejogo, aux3, aux4, num, string_jogos[6], arquivo_temp, nome[15000];
int i=0, j=0, k=0, jogos[6], temp, achei=0,sequencia_existe=0, qtd_sequencia, aquantosjogos=0;
cout<<"1- Salvar Novo Jogo"
<<"\n2- Ler Jogo"
<<"\n3- Estatísticas\n";
cin>>opcao;
if (opcao=='1')
{
cout<<"Nome do jogo: ";
cin>>nomejogo;
nomejogo+=".txt";
ofstream fout(nomejogo.c_str());
arquivo.open(nomejogo.c_str());
for (i=0; i<6; i++)
{
cout<<"Digite o "<<i+1<<" número: ";
cin>>jogos[i];
if (i>0)
for (j=0; j<i; j++)
if (jogos[j]==jogos[i]) repetido=true;
if (repetido||jogos[i]>60||jogos[i]<1)
{
cout<<"Número repetido ou inválido!\n";
i--;
repetido=false;
}
}
sort(jogos, jogos + 6);
for (j=0; j<6; j++)
arquivo<<jogos[j]<<endl;
arquivo.close();
}
if (opcao=='2')
{
system ("clear");
cout<<"Qual o nome do jogo? ";
cin>>nomejogo;
nomejogo+=".txt";
entrada.open(nomejogo.c_str());
if (!entrada)
{
cout<<"\aArquivo não encontrado!\n";
return 0;
}
while (entrada >> aux3) cout<<aux3<<endl;
entrada.close();
}
if (opcao=='3')
{
system ("cls || clear");
cout<<"1- Estatícas de números"
<<"\n2- Estatísticas de sequências numéricas\n";
cin>>opcao;
system ("cls || clear");
for (j=0; j<1416; j++)
{
nome2[j]<<j+1<<".txt";
nome[j]=nome2[j].str();
}
if (opcao=='1')
{
{
cout<<"Número: ";
cin>>num;
for (j=0; j<1416; j++)
{
entrada.open(nome[j].c_str());
while (entrada >> aux4)
{
if (aux4==num) i++;
aquantosjogos++;
}
}
entrada.close();
}
cout<<"O número "<<num<<" aparece em "<<i*100/1416<<"% dos jogos.\n"
<<"Esse número apareceu a "<<1416-aquantosjogos<<endl;
}
if (opcao=='2')
{
cout<<"Quantos números tem a sequência? ";
cin>>qtd_sequencia;
for (i=0; i<qtd_sequencia; i++)
{
cout<<i+1<<"° número: ";
cin>>string_jogos[i];
}
for (i=0; i<1416; i++)
{
entrada.open(nome[i].c_str());
while (entrada >> arquivo_temp)
{
for (k=0; k<qtd_sequencia; k++)
if (arquivo_temp==string_jogos[k])
{
achei++;
aquantosjogos++;
}
if (achei==qtd_sequencia)
{
sequencia_existe++;
achei=0;
}
}
entrada.close();
}
cout<<"A sequencia que você digitou existe em "<<sequencia_existe<<" jogos."
<<"\nOu "<<sequencia_existe*100/1416<<"% dos jogos\n"
<<"Esses números não aparecem a "<<1416-aquantosjogos<<" jogos."<<endl;
}
}
if (opcao!='1'&&opcao!='2'&&opcao!='3') cout<<"\a\nSomente opções 1, 2 ou 3!!\n";
return 0;
}


Precisa de melhorias, quando tiver mais tempo mexo nele!


5. Re: Erro na saída do programa

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/09/2012 - 16:01h

Volto a observar que, embora não se possa chamar de errado, uma vez que o resultado final fica correto, alterar a variável de controle de um loop feito com for dentro desse loop não é considerada uma prática de programação muito elegante.

Lembre-se de que, em C, algo do tipo

for(a; b; c){
X;
}


é praticamente a mesma coisa que

a;
while(b){
X;
c;
}


com uma única diferença: se você chamar o comando continue no corpo do loop, o for vai executar a expressão c, ao passo que o while passará por cima de todo o corpo do loop, incluindo a expressão c.

Desse modo, em lugar de ter uma construção que mexe na variável de controle fora da descrição do loop, como a que segue,

for(i=0; i<MAX; i++){
/* Faz alguma coisa. */
if(caso_particular){
/* Toma as providências excepcionais. */
i--; /* "Compensa" o incremnto automático do loop. */
continue; /* Ou qualquer outra forma de pular o resto do corpo do loop. */
}
/* Código que não é executado no caso particular. */
}


você poderia reesrever o loop com while (ou do...while, dependendo do caso) como segue.

i=0;
while(i<MAX){
/* Faz alguma coisa. */
if(caso_particular){
/* Toma as providências excepcionais. */
/* (Note que eu não interfiro com a variável de controle.) */
continue;
}
/* Código que não é executado no caso particular, incluindo a ... */
i++; /* ... mudança sobre a variável de controle. */
}



6. Re: Erro na saída do programa

Jose Renan Assis
JoseRenan

(usa Ubuntu)

Enviado em 06/09/2012 - 09:31h

não tava ligado que o continue do while fazia isso, vlw pela dica :D






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts