Ir ao conteúdo
  • Cadastre-se

C++ Verificação de códigos de livros


Mr-86
Ir à solução Resolvido por arfneto,

Posts recomendados

Eu te disse antes o mesmo que vou dizer agora: seu programa não está bom. É um programa C praticamente e não há vantagem em programar assim.

 

E do modo como está escrito (e eu falei sobre isso) vai ter um trabalho do inferno pra terminar.

 

E acho que eu estava certo, porque é um programa simples e depois de todos esses dias não está pronto.

 

Um erro grande é a ideia estabelecida de escrever um programa interativo. E entar escrever o programa todo ao mesmo tempo.

 

Em 02/09/2022 às 01:02, arfneto disse:

não use bibliotecas de C a menos que tenha uma sólida razão para isso; Aqui não tem. Por exemplo use string e não cstring.

 

Te disse isso na sexta. ão mudou nada. e era uma letra só.

 

Sobre o compilador e as mensagens aparentemente não fez nada também. Eis o que você deveria ter lido:

 

(164,18): warning C4101: 'k': unreferenced local variable
(164,15): warning C4101: 'j': unreferenced local variable
(164,12): warning C4101: 'i': unreferenced local variable
(85): error C4700: uninitialized local variable 'resp' used

 

Mais uma vez não inicializou essas variáveis

 

  • não declare mais de uma variável por linha. É grátis.

O pior é que declarou duas vezes i,j e k: então dentro dos loops é uma variável e fora deles é outra em ordenar(). Está muito errado... Para sua sorte aí nem faz diferença. Pode apenas apagar a tal linha.

 

Pra que precisa de ordenar()??? Não pode usar sort()?

 

  • No seu loop principal como sabe o valor de resp que declarou de novo duas vezes????

image.png.6aaad13966888dfe0ce4b5181e660f44.png

Entenda que a variável que declarou em main não é a mesma que declarou no do.

 

Talvez deva voltar ao seu livro.

Você tem um exemplar do livro?

 

Procure algo sobre escopo das variáveis.

 

Entenda que a variável resp que declarou no do só existe entre aquele par de chaves { } e assim aquela que está usando para o teste É OUTRA

 

E o mesmo erro de novo: não inicializou a primeira, que declarou num grupo de 3. Não faça isso. Nunca. A mesnos que goste de perder tempo.

 

De volta ao código

 

Não continue cegamente sem resolver as coisas que eu te disse:

  • precisa saber a versão da linguagem para a qual está compilando o código
  • precisa saber qual compilador está usando
  • precisa saber como fazer o compilador mostrar TODAS as mensagens de erro

É ingênuo achar que pode continuar até resolver esse programa e DEPOIS ver isso. Vai perder mais me mais tempo. 

 

Aproveite a oportunidade de ter acesso a recursos como esse forum.

 

 

Lendo as mensagens do compilador e corrigindo aquilo esse código já compila. Mas não está nada bom.

 

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;
#define max 10

int  Leiaresp();
void incluir(
    int& n, int quant[], string acervo[], string isbn[],
    string autores[]);
void ordenar(
    int n, int quant[], string acervo[], string isbn[],
    string autores[]);
int  procurar(string isbn[], int n);
void excluir(
    int& n, int quant[], string acervo[], string isbn[],
    string autores[], int proc);
void aquizicao(int quant[], int proc);

int main(void)
{
    string acervo[max], isbn[max], autores[max];
    int    n = 0, quant[max];
    
    int resp = 0;

    do {
        resp = Leiaresp();

        switch (resp)
        {
            case 1:
            {
                incluir(n, quant, acervo, isbn, autores);
                ordenar(n, quant, acervo, isbn, autores);
                break;
            }

            case 2:
            {
                int proc = procurar(isbn, n);
                cout << isbn[proc] << endl
                     << acervo[proc] << endl
                     << autores[proc] << endl
                     << quant[proc] << endl;
                if (proc == -1)
                {
                    cout << "Este Livro não esta nos "
                            "registros. "
                         << endl;
                }
                system("pause");
                break;
            }

            case 3:
            {
                int proc = procurar(isbn, n);
                if (proc == -1)
                {
                    cout << "Este Livro não esta nos "
                            "registros. "
                         << endl;
                }
                excluir(
                    n, quant, acervo, isbn, autores, proc);
                system("pause");
                break;
            }

            case 4:
            {
                int proc = procurar(isbn, n);
                if (proc == -1)
                {
                    cout << "Este Livro não esta nos "
                            "registros. "
                         << endl;
                }
                aquizicao(quant, proc);
                system("pause");
                break;
            }
        }

    } while (resp != 0);

    return 0;
}

int Leiaresp()
{
    int resp;

    do {
        cout << "qual acao deseja realizar ??" << endl
             << "1 Cadrastar um livro" << endl
             << "2 Procurar um livro" << endl
             << "3 Excluir um livro " << endl
             << "4 Aquisicao " << endl
             << "5 Relatorio" << endl
             << "0 Encerrar programa" << endl;
        cin >> resp;
        cin.ignore();
    } while (resp < 0 && resp > 5);

    return resp;
}

void incluir(
    int& n, int quant[], string acervo[], string isbn[],
    string autores[])
{
    string codigo, nome, autor;
    int    qtnd;
    bool   valido;

    do {
        cout << "Digite o ISBN do livro, contendo 13 "
                "digitos e '-' "
             << endl;
        getline(cin, codigo);
        for (int j = 0; j <= codigo.size(); j++)
        {
            if (not isdigit(codigo[j]) && codigo[j] != '-')
            {
                cout << "Esse ISBN não e valido " << endl;
                valido = false;
                break;
            }
            else { valido = true; }
        }
    } while (codigo.size() == 0 and valido == false);

    // INSERIR O CODIGO PARA VERIFICAÇAO DE COPIA!!

    isbn[n] = codigo;
    n++;

    do {
        cout << "Digite o nome do livro " << endl;
        getline(cin, nome);
    } while (nome.size() == 0);
    acervo[n] = nome;

    do {
        cout << "Digite o nome completo do autor: " << endl;
        getline(cin, autor);
    } while (autor.size() == 0);
    autores[n] = autor;

    do {
        cout << "Digite a quantidade " << endl;
        cin >> qtnd;
        cin.ignore();
    } while (qtnd <= 0);
    quant[n] = qtnd;
}

void ordenar(
    int n, int quant[], string acervo[], string isbn[],
    string autores[])
{
    string nome, aux;

    for (int p = 0; p <= n; p++)
    {
        nome = acervo[p];
        for (int k = 1; k <= n; k++)
        {
            aux = acervo[k];
            for (int i = 0; i <= nome.size(); i++)
            {
                for (int j = 0; j <= aux.size(); j++)
                {
                    if (nome[i] > aux[j])
                    {
                        acervo[p] = aux;
                        acervo[k] = nome;

                        // ORGANIZAR AS OUTRAS POSIÇOES!!!
                    }
                }
            }
        }
    }
}

int procurar(string isbn[], int n)
{
    string codigo;
    int    proc = 0;

    do {
        cout << "Digite o ISBN  " << endl;
        getline(cin, codigo);
    } while (codigo.size() == 0);

    for (int i = 0; i <= n; i++)
    {
        if (codigo == isbn[i])
            proc = i;
        else
            proc = 1;
    }
    return proc;
}

void excluir(
    int& n, int quant[], string acervo[], string isbn[],
    string autores[], int proc)
{
}

void excluir(
    int& n, int quant[], string acervo, string isbn[],
    string autores[], int proc)
{
    for (int i = proc; i <= n; i++)
    {
        acervo[i]  = acervo[i + 1];
        isbn[i]    = isbn[i + 1];
        autores[i] = autores[i + 1];
        quant[i]   = quant[i + 1];
    }
    n--;
}

void aquizicao(int quant[], int proc)
{
    int qtde;

    cout << "Quantos livros deseja adquirir ??" << endl;
    cin >> qtde;
    quant[proc] = quant[proc] + qtde;
}

 

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

@arfneto 

1 hora atrás, arfneto disse:

 

Te disse isso na sexta. ão mudou nada. e era uma letra só.

eu cheguei a mudar isso, mas não entendo o que  essa mudança fez.

 

1 hora atrás, arfneto disse:

 

Sobre o compilador e as mensagens aparentemente não fez nada também. Eis o que você deveria ter lido:

esses erro apareceram no meu compilador, porém não sei como.

 

1 hora atrás, arfneto disse:
  • precisa saber a versão da linguagem para a qual está compilando o código
  • precisa saber qual compilador está usando
  • precisa saber como fazer o compilador mostrar TODAS as mensagens de erro

Eis uma otimo dilema, como eu faço tudo isso, não foi me ensinado quase nada sobre os compiladores, entendo que você ta me cobrando isso, porém eu não faço ideia de como fazer, de que jeito, e na maioria dos casos e não entendo a metade do que você propõe.

 

estou tentando arrumar esse codigo que nem um louco, você me fiz mt coisas que não aprendi em sala, e por isso não sei como colocar em pratica, entendo que meu codigo esta ruim, porém não tenho tempo para cuidar do mínimos detalhes de tudo, ja estou mt perdido na materia de modularização, e quero pelo menos entregar um trabalho funcional. 

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

17 minutos atrás, Mr-86 disse:

Eis uma otimo dilema, como eu faço tudo isso, não foi me ensinado quase nada sobre os compiladores, entendo que você ta me cobrando isso, porém eu não faço ideia de como fazer, de que jeito, e na maioria dos casos e não entendo a metade do que você propõe

 

Mais uma vez não perguntou nadinha.

 

Entendeu os erros que mostrei? Notou o código que postei? Não mexi em nada. Apenas corrigi os erros a partir das mensagens que aparentemente você nem viu. E vai compilar ok.

 

Entendeu a nota de @JorgeGus sobre o erro no while? Entendeu que tinha um erro MAIOR ainda que esse já que a variável que estava testando errado não era aquela que tinha declarado fora do loop sem inicializar e não a que voltou da chamada `a funçao DENTRO do loop e que você sequer tinha inicializado?

 

Se "na maioria dos casos e não entendo a metade do que você propõe" porque não fez uma única pergunta?

 

21 minutos atrás, Mr-86 disse:

Eis uma otimo dilema, como eu faço tudo isso, não foi me ensinado quase nada sobre os compiladores, entendo que você ta me cobrando isso

 

Não posso cobrar que alguém te ensine algo. Há muito poucos compiladores em uso. No geral estudantes vão usar clang, gcc ou MSVC dentro de algum ambiente integrado, o tal IDE. Ou o compilador C++ da Embarcadero dentro do C++ Builder. Bem Legal.

 

Ao que parece as escolas aqui insistem em péssimas escolhas (opinião apenas) com o Dev C++ ou um tal Code::Blocks e aí vai ter o g++ e o gcc embutidos na instalação para compilar claro C++ e gcc. E outras linguagens na verdade, como FORTRAN.

 

 

23 minutos atrás, Mr-86 disse:

como eu faço tudo isso,

 

Pois é: não tem nenhum suporte da escola? Ninguém que possa responder isso? 

 

E sobre a linguagem você tem ou não tem o tal livro que seu curso adota? 

 

Se usa esse Code::Blocks ou o tal Dev-C++ então deve usar o g++ como compilador.

 

Numa linha do terminal, Windows ou Linux:

 

C>g++ --version
g++ (GCC) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

Pois é: nesse caso a versão é 11.3. Meio antiga. 12.2 é a atual. Mas 11.3 é de abril então será bem suficiente se tiver uma dessas.

 

Para ver as nmensagens de erro todas acrescente no mínimo -Wall e será um bom começo e vai ver muitas mensagens. Leia TODAS. Pode ter em português.

 

Para escolher a versão da linguagem use algo como o simples -std=c++20 ou -std=c++20

 

Resumo

 

Considere esse programa

 

int main(void)
{
        int x = 12;
        int y;
        x = y + x;
        {
                int x = 33;
        }
}

 

Tem um erro como os seus:  tenta somar y em x mas y não está inicializado e assim vai dar m.

 

Se compilar sem ver as mensagens de erro todas vai ter

 

teste>g++ x.cpp
teste>

 

sem erros. Mas se usar

 

teste>g++ -Wall x.cpp
x.cpp: In function ‘int main()’:
x.cpp:8:21: warning: unused variable ‘x’ [-Wunused-variable]
    8 |                 int x = 33;
      |                     ^
x.cpp:5:11: warning: ‘y’ is used uninitialized [-Wuninitialized]
    5 |         x = y + x;
      |         ~~^~~~~~~
teste>

 

o compilador avisa de 2 problemas e ainda mostra a linha e a coluna do problema

 

Mas e a versão do compilador e da linguagem???

 

Teste>g++ -Wall -std=c++20 x.cpp
x.cpp: In function ‘int main()’:
x.cpp:8:21: warning: unused variable ‘x’ [-Wunused-variable]
    8 |                 int x = 33;
      |                     ^
x.cpp:5:11: warning: ‘y’ is used uninitialized [-Wuninitialized]
    5 |         x = y + x;
      |         ~~^~~~~~~

 

Assim vai usar c++20

 

Mas e a p... da  versão do compilador?

 

teste>g++ --version -Wall -std=c++20 x.cpp
g++ (GCC) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
teste>

 

Nesse caso nem compilu o programa. Apenas disse a versão e parou.

 

E na p. do IDE?

 

Então... o IDE tem uma janelinha onde você insere as opções do compilador.... Só isso.

 

Code::Blocks tem uma janelinha assim onde você faz o óbvio: insere as opções ou escolhe na lisa e marca om X.

 

image.png.ad0fda69964ce5659bc6d2015c4b1895.png

 

 

 

 

Nesse caso nem tem C++20 na lista

 

😄 

 

mas acho que dá pra entender. E pode estar em poruguês. 

 

É só um formulário. Basta você ir lá e acrescentar o que eu expliquei: -Wall e -std=c++17 por exemplo

 

 

 

 

Dev-C++

 

image.png.29b875dff676fd9ae95fa59f60020ca0.pngComo deve imaginar é igualzinho e antigo.

 

Você só clica na opção e faz o simples.

Tem em português também.

1 hora atrás, Mr-86 disse:

estou tentando arrumar esse codigo que nem um louco, você me fiz mt coisas que não aprendi em sala

 

Entenda que é mais esperto parar e resolver essas coisas antes ao invés se seguir cegamente pelo mesmo caminho até terminar e "depois ver isso que o cara falou". Está perdendo um tempo do inferno por causa de de 2 clicks e 3 palavras na configuração.

 

Pode ter coisas que não aprendeu em sala mas deveria. Sua aula pode não ser assim muito boa, bem como seu livro texto. Mas há muita oportunidade hoje em dia. Use-as.

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

@arfneto

agr entendi!!

você poderia me ajudar num pequeno problema estou tendo, eu preciso ordenar um nome em formado bibliografico tipo transformar Gabriel souza monteiro, em Monteiro G. S.

 

você saberia como fazer??

atualmente estou pensando como ser organiza o vertor de strings acervo em ordem alfabetica, e ja estou quase lá... eu acho.

 

    string nome, aux;

    for(int i=0; i<=n-1; i++){
        nome = acervo[i];
        for(int j=1; j<=n-1; j++){
            aux = acervo[j];
             for(int p=0; p<=nome.size(); p++){
                for(int k=0; k<=aux.size(); k++){
                    if(nome[p] > aux[k]){
                        acervo[i] = aux;
                        acervo[j] = nome;

                    }
                }
             }
        }
    }

tinha esquecido de colocar o codigo, da ordem alfabética, ele ta quase dando certo, quase.

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

3 horas atrás, Mr-86 disse:

agr entendi!!

 

Então já que entendeu

  • qual a versão do compilador afinal?
  • qual o IDE que usa?
  • tem ou não tem o livro?
  • sobre a "metade das coias que não entendeu" agora entende? O que eram?

Como fica o seu programa depois dessa fase de compreensão?

 

3 horas atrás, Mr-86 disse:

você poderia me ajudar num pequeno problema estou tendo, eu preciso ordenar um nome em formado bibliografico tipo transformar Gabriel souza monteiro, em Monteiro G. S.

 

 

Abra outro tópico. É outro problema.

 

3 horas atrás, Mr-86 disse:

você saberia como fazer??

atualmente estou pensando como ser organiza o vertor de strings acervo em ordem alfabetica, e ja estou quase lá... eu acho

 

Sei algumas maneiras de fazer isso. 

 

Mas entenda que colocar coisas em ordem não depende do que são as coisas. Tanto faz. Podem ser os nomes desse jeito aí. Podem ser os livros por ordem de ISBN. Tanto faz.

 

Para por em ordem basta que as coisas sejam comparáveis. Basta ter uma maneira de saber, olhando para duas delas, qual a menor.

 

C++ tem a função sort. C tem qsort(). As duas aceitam uma função que compara duas coisas. É o que basta. Coloue isso na função que está usando e vai funcionar igualzinho com os nomes ou as caixas ou o CPF ou os livros 😉 

 

Veja no manual. Veja exemplo em https://cplusplus.com/reference/algorithm/sort/

 

 

 

 

 

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

@arfneto @arfneto

35 minutos atrás, arfneto disse:

tem ou não tem o livro?

Algoritmos e Programação com Exemplos em Pascal e C [Série Livros didáticos informática UFRGS]

Edelweiss, Nina, Livi, Maria A. C.

 

35 minutos atrás, arfneto disse:

qual o IDE que usa?

A IDE é o codeblocks

 

36 minutos atrás, arfneto disse:

sobre a "metade das coias que não entendeu" agora entende?

Agr eu entendo 70%

 

36 minutos atrás, arfneto disse:

qual a versão do compilador afinal?

O compilador eu fui onde você pediu e deu isso 

imagem_2022-09-05_001306974.png.2e8ff1acd7fc45d4b39dc358741a3162.png

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

27 minutos atrás, Mr-86 disse:

Algoritmos e Programação com Exemplos em Pascal e C [Série Livros didáticos informática UFRGS]

Edelweiss, Nina, Livi, Maria A. C.

 

 

Isso quer dizer que você tem ou não o livro?

 

Mundo estranho: então seu livro texto é um livro sobre estruturas de dados, com exemplos em Pascal e C, mas está programando em C++, algo totalmente distinto?

 

28 minutos atrás, Mr-86 disse:

A IDE é o codeblocks

 

Isso é algo objetivo afinal

 

29 minutos atrás, Mr-86 disse:

O compilador eu fui onde você pediu e deu isso 

 

E marcou C++11 e não 17 ou 20 por alguma razão? 

 

E o lance das mensagens, de que já falei um certo número de vezes nesse tópico? O tal -Wall ??

 

30 minutos atrás, Mr-86 disse:

Agr eu entendo 70%

 

 

E não tem de novo nenhuma pergunta sobre os 30%? 😄 

 

E ainda não sabe o compilador nem a versão que está usando, e tem um livro texto com exemplos e em C e Pascal sobre estruturas de dados e não sobre a linguagem C++ que está usando? Não me surpreende que tenha dificuldades.

Uma pena que use isso porque esse IDE é ruim e antigo.

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

@Mr-86    com essa função  que você postou , não vai organizar como você disse , e nem em ordem alfabética ,  pois você está comparando todos os caracteres de um nome com todos os do outro nome , 

 

string nome, aux;
for(int i=0; i<n; i++)                 /// percorre apenas as posições validas do vetor
{
  nome = acervo[i];                    
  for(int j=1; j<n; j++)
  {
    aux = acervo[j];                   
    for(int p=0; p<nome.size(); p++)   /// percorre apenas as posições validas do nome
    {
      for(int k=0; k<aux.size(); k++)  /// percorre apenas as posições validas do outo nome
      {
        if(nome[p] > aux[k])           /// compara todos os caracteres de um com todos os do outro nome
        {
          acervo[i] = aux;             /// troca os nomes de lugar
          acervo[j] = nome;            /// se o caractere for maior que o outro
        }
      }
    }
  }
}

e você pode organizar facilmente pela primeira Letra do nome ,  ou se quiser organizar por todas as letras vai precisar mais algumas linhas para compara as outras letras também 

string aux = "";
for(int i=0; i<n; i++)           /// percorre apenas as posições validas do vetor
{
  for(int j=i+1; j<n; j++)
  {
    if(acervo[i] > acervo[j])    /// compara todos os caracteres de um com todos os do outro nome
    {
      aux       = acervo[i];
      acervo[i] = acervo]j];     /// troca os nomes de lugar
      acervo[j] =       aux;     /// se o caractere for maior que o outro
    }
  }
  cout << acervo[i] << endl;
}

 

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!