Ir ao conteúdo
  • Cadastre-se

C++ Programa c++ que informe a quantidade de números positivos e negativos


RamonBerft
Ir à solução Resolvido por arfneto,

Posts recomendados

Bom dia galera, eu tenho uma atividade pra fazer aqui e gostaria de uma ajuda, eu realmente não sei por onde começar e ficaria feliz se alguém pudesse estar me dando um auxilio.

 

1) Dada uma sequência de valores inteiros, faça um programa em C++ que informe a quantidade de números positivos e negativos. A entrada contém vários casos de teste. Os dados de cada caso de teste estão numa única linha, e são inteiros separados por um espaço em branco. Cada linha contém um inteiro N, 2 ≤ N ≤ 10^5 , seguido da sequência de N inteiros. O final da entrada é indicado por uma linha que contém apenas o número zero. Os dados devem ser lidos de um arquivo texto e as respostas armazenadas em outro arquivo texto.

 

As duvidas que eu tenho são essas:

 

1º: Como eu faria para todos os dados estarem em uma unica linha ali como pede no exercicio?

 

2º: Como eu faço para ler de um arquivo texto e armazenar nele?

 

Se puderem me dar uma ajuda ai mostrando o codigo para eu ter uma ideia eu ficaria bem grato, em questão da logica eu consigo fazer mas só to meio empacado nessas duas partes ai, valeu ai quem puder ajudar.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

5 horas atrás, RamonBerft disse:

1º: Como eu faria para todos os dados estarem em uma unica linha ali como pede no exercicio?

 

Isso não faz parte do seu problema. Apenas crie o arquivo, usando o mesmo editor que usa para o programa

 

Algo simples como o descrito lá:
 

2 1 2
5 -1 -2 -3 -4 5
3 1 2 3
0

 

5 horas atrás, RamonBerft disse:

2º: Como eu faço para ler de um arquivo texto e armazenar nele?

 

Não está previsto nesse programa armazenar nada no arquivo

 

Vai escrever em C++ certo? 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto Obrigado pela resposta amigo, então essa atividade é dividida em partes, essa do meu post é a primeira parte e a segunda (que eu já fiz) eu tenho que criar um programa que com base no input do usuario do numero de casos de teste, ele gera aleatoriamente a quantidade de numeros e os valores para salvar no arquivo txt "X", o mesmo que essa primeira parte ai carrega para realizar os testes e o resultado por ex: "5 negativos, 4 positivos" é salvo no arquivo Y.

Essa parte eu já consegui fazer a minha duvida era mais pra carregar os valores do arquivo "X" e fazer os testes nele, como que eu faço para ler uma linha dos casos teste, realizar o teste se é positivo ou negativo salvar(essa parte eu já aprendi) e ler a outra linha, eu uso fscanf?

 

Eu imagino que tenha que alocar a memória, fazer os testes e liberar o espaço depois mas é nessa parte que eu to tendo dificuldade.

 

Desculpa se não ficou muito claro a minha duvida pois essa atividade é dividida em 4 partes e eu não queria que parecesse como se eu tivesse pedindo pra fazer pra mim, o resto eu to tentando fazer era só essa parte mesmo que eu to perdido.

 

Edit: Sim é em C++ que eu estou fazendo o programa.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução
1 hora atrás, RamonBerft disse:

primeira parte e a segunda (que eu já fiz) eu tenho que criar um programa que com base no input do usuario do numero de casos de teste, ele gera aleatoriamente a quantidade de numeros e os valores para salvar no arquivo txt "X", o mesmo que essa primeira parte ai carrega para realizar os testes e o resultado por ex: "5 negativos, 4 positivos" é salvo no arquivo Y.

 

Esse curso deve ser interessante. Então a primeira lê um arquivo que foi criado pela segunda parte? Muito bom.

 

1 hora atrás, RamonBerft disse:

Eu imagino que tenha que alocar a memória, fazer os testes e liberar o espaço depois mas é nessa parte que eu to tendo dificuldade.

 

Talvez esteja complicando as coisas... Mas qualk é objetivamente sua dificuldade? Porque não postou o programa? Ou perguntou algo sobre essa dificuldade?

 

Considere o arquivo x.txt do exemplo acima

 

2 1 2
5 -1 -2 -3 -4 5
3 1 2 3
0

 

E um complicado programa como esse

 

#include <iostream>
#include <fstream>
int main(void)
{
    std::ifstream entrada {"x.txt"};
    if (not entrada)
    {   std::cerr << "Erro ao abrir arquivo\n";
        return -1;
    }
    int valor;
    entrada >> valor;
    while (entrada) {
        std::cout << valor << " ";
        entrada >> valor;
    };
    entrada.close();
    std::cout << "\nFim!\n";
    return 0;
}

 

Ele vai mostrar o esperado

 

2 1 2 5 -1 -2 -3 -4 5 3 1 2 3 0
Fim!

 

Claro que para criar o arquivo é igualzinho, mas ao contrário...

 

Esse complicado programa cria o MESMO arquivo que o outro le:

 

#include <fstream>
#include <iostream>
int main(void)
{
    std::ofstream saida{"y.txt"};
    if (not saida)
    {
        std::cerr << "Erro ao abrir arquivo\n";
        return -1;
    }
    saida << "\
2 1 2\n\
5 -1 -2 -3 -4 5\n\
3 1 2 3\n\
0\n";
    saida.close();
    std::cout << "\nFim!\n";
    return 0;
}

 

 

1 hora atrás, RamonBerft disse:

eu uso fscanf?

 

3 horas atrás, Midori disse:

Para manipular arquivos e os dados deles tem as funções fopen, fprintf, fscanf, etc.

 

Não use essas coisas em C++ a menos que realmente precise de alguma funcionalidade dessas funções. Que funcionalidade? scan. Por isso elas tem esse nome.

 

Só vai perder tempo usando isso. sem necessidade. C++ é mais expressiva e simples para esses casos. Use streams. Muito mais simples.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Midori no sentido de perder tempo de execução e de desenvolvimento mesmo.

 

Vai perder tempo de desenvolvimento em usar essas funções de scan como fscanf ou scanf se não vai usar como scanner. Foi o que eu expliquei.

 

E essas funções são muito muito lentas (executando)  em relação a usar streams em C++. 

 

E se precisa mesmo usar algo assim, para tratar arquivos csv por exemplo, use

 

    std::ios_base::sync_with_stdio(false);

 

como sugerido em todos os guias disponíveis.

 

42 minutos atrás, Midori disse:

mas já vi algumas tags por aqui de C++ e na verdade era para C...

 

Sim. Mas como deve ter visto perguntei ao autor do post e ele reafirmou estar escrevendo algo em C++

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Acho que como resolveu podia postar o código aqui para ajudar outros. É o esperado em foruns como esse.

 

Vou mostrar uma maneira de continuar o programa considerando o arquivo de exemplo x.txt:

 

2 1 2
5 -1 -2 -3 -4 5
3 1 2 3
0

 

Então o próximo passo é entender que é uma lista de sequências até uma ter 0 números e elas tem entre 2 e 100.000 numeros inclusive. É o enunciado.

 

Então se o arquivo estiver certinho vai ler a linha que só tem o zero no final e ok. Claro que se faltar algum número a conta não fecha e vai dar uma confusão só. Então aqui tem 3 sequências, com 2, 5 e 3 elementos. 

 

TANTO FAZ se vem na linha. Isso ajuda na hora de editar apenas.

 

8 horas atrás, arfneto disse:
2 1 2 5 -1 -2 -3 -4 5 3 1 2 3 0

 

Essa era a saída do programa de 10 linhas que eu mostrei e já dá pra ver que está ok.

 

Seguindo um passo a frente:

 

Esse programa lê o arquivo e procura pelas linhas, só que pula os caras porque a gente quer seguir aos poucos. Foram 15 minutos antes, mais 10 agora...

 

#include <fstream>
#include <iostream>
int main(void)
{
    std::ifstream              entrada{"x.txt"};
    std::istream_iterator<int> prox{entrada};
    std::istream_iterator<int> final{};

    while (  (prox != final) && (*prox != 0) )
    {
        auto N = *prox;
        std::cout << "Linha com " << N << " valores\n";
        for (auto i = 0; i < N; i += 1, prox++); // pula os valores
        prox++; // le o proximo TOTAL
    };
    entrada.close();
    std::cout << "\nFim!\n";
    return 0;
}

 

C++ tem iteradores para streams então o meio de campo é trivial. Tratar arquivos em C++ é trivial, como era em C. E nem precisa dessa noção de arquivo e linha e tal.

 

Eis a saída do programa:

 

Linha com 2 valores
Linha com 5 valores
Linha com 3 valores

Fim!

 

E não é que leu certo???

 

Uns minutos a mais e um novo programa: essa linha:

 

        for (auto i = 0; i < N; i += 1, prox++); // le os valores

 

só pula os valores. Mas está certo. Então basta testar o que é positivo ou negativo e contar. E mostrar a série ou não vai ter como testar...

 

Algo  assim no lugar do for

 

        for (auto i = 0; i < N; i += 1, prox++) {
            std::cout << *prox << " ";
            if (*prox < 0)
                neg++;
            else
                pos++;
        }
        std::cout << "\nNessa linha: valores negativos = "
                  << neg << " positivos = " << pos 
                  << "\n";

 

E a saída fica

 

Linha com 2 valores: 2 1
Nessa linha: valores negativos = 0 positivos = 2

Linha com 5 valores: 5 -1 -2 -3 -4
Nessa linha: valores negativos = 4 positivos = 1

Linha com 3 valores: 3 1 2
Nessa linha: valores negativos = 0 positivos = 3

Fim!

 

O programa. copiado claro do anterior com esse novo código no for:

 

#include <fstream>
#include <iostream>
int main(void)
{
    std::ifstream              entrada{"x.txt"};
    std::istream_iterator<int> prox{entrada};
    std::istream_iterator<int> final{};

    while ((prox != final) && (*prox != 0))
    {
        auto N = *prox;
        unsigned pos = 0, neg = 0;
        std::cout << "\nLinha com " << N << " valores: ";
        for (auto i = 0; i < N; i += 1, prox++) {
            std::cout << *prox << " ";
            if (*prox < 0)
                neg++;
            else
                pos++;
        }
        std::cout << "\nNessa linha: valores negativos = "
                  << neg << " positivos = " << pos 
                  << "\n";
        prox++;  // le o proximo TOTAL
    };
    entrada.close();
    std::cout << "\nFim!\n";
    return 0;
}

 

Mas era pra gravar em um arquivo. O resto está certo

 

Então é só copiar o que tinha no primeiro exemplo, o que criava o arquivo

 

#include <fstream>
#include <iostream>
int main(void)
{
    std::ifstream              entrada{"x.txt"};
    std::istream_iterator<int> prox{entrada};
    std::istream_iterator<int> final{};

    std::ofstream              saida{"y.txt"};

    while ((prox != final) && (*prox != 0))
    {
        auto     N   = *prox;
        unsigned pos = 0, neg = 0;
        saida << N << " ";
        for (auto i = 0; i < N; i += 1, prox++)
        {
            saida << *prox << " ";
            if (*prox < 0)
                neg++;
            else
                pos++;
        }
        saida << "\nNegativos = "
                  << neg << " Positivos = " << pos << "\n";
        prox++;  // le o proximo TOTAL
    };
    entrada.close();
    saida.close();
    std::cerr << "\nFim!\n";
    return 0;
}

 

E em y.txt fica

 

2 2 1 
Negativos = 0 Positivos = 2
5 5 -1 -2 -3 -4 
Negativos = 4 Positivos = 1
3 3 1 2 
Negativos = 0 Positivos = 3

 

Que já serve como solução provavelmente. E não levou meia hora, mudando uma coisa por vez e copiando um programa a partir do outro...

 

 

falta tratar o caso de erro no arquivo, de faltar algum valor. Mas se faltar algum dentro do for não vai ler nada e aí prox vai ser = final então é só testar. E se faltar a linha com o 0 vai sair do loop while por causa da primeira condição... Simples também. Um if.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!