Ir ao conteúdo
  • Cadastre-se

MUrisCuri

Membro Pleno
  • Posts

    98
  • Cadastrado em

  • Última visita

Tudo que MUrisCuri postou

  1. Tento implementar um exercício muito simples do livro Princípios e Práticas de Programação com C++, o enunciado é o seguinte: 1. Escreva um programa que consista em um laço while que leia (a cada iteração do laço) dois ints e depois os imprima. Termine o programa quando for lido um '|'. Meu programa abaixo não faz o que diz no enunciado. #include <iostream> #include <vector> using namespace std; int main() { vector<int>num; int temp=0; int ind=0; while ( temp!=124 ) { cout << "Digite abaixo 2 numeros inteiros: \n"; cout << "Numero da posicao " << ind << ": "; cin >> temp; num.push_back(temp); cout << "teste - numero = " << num[ind] << endl; if ( ind>=1 ) { cout << endl; cout << "Os numeros sao: " << num[ind] << " e " << num[ind+1]; cout << endl; num[ind]=0; num[ind+1]=0; ind=0; } else { ++ind; } } } Isso faz o seguinte: No capítulo I do livro foi abordado vector, e usei método push_back() porque o autor abordou o seu uso e gostaria de seguir a ordem do conteúdo abordado no livro. Não consegui fazer a consistencia para interromper o loop (digitar "|" para sair do laço e terminar o programa). Outro problema é que o segundo int mostrado é negativo.
  2. Na 2ª edição também aparece esse programa, na pág. 182.
  3. Tento executar um exemplo de código do livro, na páginas 121 e 122, e não mostra as palavras digitadas, tal como refere o autor. Segue o programa abaixo. Incluí um comando break no while para não ter de interromper com ctrl+z. Deveria classificá-las e mostrar na tela. #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; int main() { vector<string>palavras; string temp; while (cin>>temp) { if (temp == "sair") break; else palavras.push_back(temp); } cout << "Numero de palavras: " << palavras.size() << endl; sort(palavras.begin(), palavras.end()); for (unsigned int i; i<palavras.size(); ++i) if (i==0 ||palavras[i-1]!=palavras[i]) cout << palavras[i] << "\n"; return 0; }
  4. arfneto, já iniciei a estudar C++ pelo livro de Bjarne Stroustrup, "Princípios e Práticas de Programação com C++". Muito bom! Obrigado! Esse foi o único livro desse autor traduzido ao português que achei. Até 1º de abril, https://br1lib.org/ estão disponibilizando acesso a livros gratuitamente, bastando efetuar doação.
  5. arfneto, a forma mais eficiente de implementar outros mecanismos de classificação dos números armazenados nos vetores, inclusive em ordem decrescente, seria criando métodos para cada forma de classificação? ou seria possível organizar esses métodos private dentro de um único método public, e de alguma forma chamar cada um no main.cpp?
  6. Pois é, na verdade o fluxograma (método "Knuth" - assim descrito pelo Prof. de lógica) foi desenvolvido em sala de aula. Num post aqui, não lembro o núm., anexei a imagem contendo o fluxograma. Tentei implementar o algoritmo pelo fluxograma e teste de mesa, e percebi que while dentro do for solucionou o algoritmo. Foram vistos em aula: 1) Knuth (Bubble sort) ou método da bolha; 2) método da bolha modificado (Prof. Cabral); e 3) método Shell (Donald Shell - 1965) - troca intercalada. Foram vistos também 5 métodos sort: Shell - Metzner; combsort - Lacey (1997); contagem comparativa; shake sort; e split sort. Pretendo implementar todos em C++. Fiquei curioso com uma obs que anotei no meu caderno: para um núm. grande de registros, o método de Knuth é o mais adequado devido ao tempo de execução que é bem menor. Quero testar isso, e comparar os métodos. "poder trocar sem mexer nos programas que usam a classe." Você se refere à possibilidade de trocar o próprio método bubble? Isso ocorre em novo.array[i] = array[i]; bubble(novo.array, novo.size); return novo; ? Compreendi o passo-a-passo nos arquivos. Mas ainda não está tão claro pra mim, porque definir um método como private/public. Poderia explicar novamente, talvez com algum outro exemplo? Swap é private?
  7. Sobre isso, você afirmou que não seria uma boa ideia escrever um while dentro de outro. Então, reescrevi o código e adaptei ao seu programa, que, aliás, ficou bem didático e fácil de compreender. void Array::knuth(short cel[], unsigned short n){ bool swap; short temp; for ( unsigned short ind=0; ind<=n-1; ind+=1 ){ while ( ind >= n-1 ) { if ( swap == 1 ){ n-=1; swap = 0; ind=0; } else{ break; } } if ( cel[ind] > cel[ind+1] ){ temp = cel[ind]; cel[ind] = cel[ind+1]; cel[ind+1] = temp; swap = 1; } } return; }
  8. @arfneto não visualizo o < >code no menu conforme abaixo. Por isso, copio e colo trechos de código sem formatação. Tenho que habilitar esse recurso na minha conta? Não sei se está correta a forma que respondo aos comentários. Eu clico no botão "Responder". Que critério leva a definir métodos private/public? Você afirmou que "bubble_sort() é private e assim pode usar nos dois casos..." bubble_sort() foi definido private com intuito de ficar protegido, já que o acesso a ele ocorreria através dos 2 métodos sort_array, ambos public? Tenho dúvida sobre definição de critérios para visibilidade(public/private) aos métodos e propriedades da classe.
  9. Obrigado arfneto, consegui executá-lo pelo prompt como você explicou. O que faz o parâmetro -o tst? GCC gera arquivos-fonte .o?
  10. Sim. Em: 1) obj.show_array("Vetor como digitado"); //"obj", instância da classe, chama o método show_array, mostrando os valores digitados. Msg é diferente de vazio, pois o parâmetro é passado ao método. 2) Array outro = obj.sort_array(); \\aqui, "outro" que é outra instância da classe assume o que há no "obj" que chama o método sort_array. outro.show_array("Vetor novo classificado, criado a partir do original"); \\ O parâmetro que é String passa através do método show_array, e, como é diferente de vazio, mostra o que há no "outro", ou seja, os valores ordenados. 3) obj.show_array("o original (inalterado)"); // aqui, obj chama o método e mostra os valores que não foram ordenados Quanto aos arquivos, os mesmos erros persistem nos arquivos main.cpp e Array.cpp, mesmo após acrescentar ";" ao final da declaração da classe. Seguem o código e os erros. Array.h #pragma once #include <iostream> using namespace std; class Array { public: Array(); // cria com 20 zerados Array(unsigned short N); // cria o array com N public: void build_array(unsigned short); // le do teclado void show_array(string); [[nodiscard]] Array sort_array(); void sort_array(unsigned short); private: unsigned short size; short array[20]; void bubble(short[], unsigned short); }; Array.cpp #include "Array.h" Array::Array() { size = 20; for (short i = 0; i < 20; i += 1) array[i] = 0; }; Array::Array(unsigned short valor) : size(valor) { build_array(valor); // le os valores }; void Array::bubble(short V[], unsigned short n) { for (int i = 0; i < n - 1; i++) for (int j = 0; j < n - i - 1; j++) if (V[j] > V[j + 1]) std::swap(V[j], V[j + 1]); return; } void Array::build_array(unsigned short bound) { size = bound; for (unsigned ind = 0; ind < bound; ind += 1) { cout << "Entre valor " << 1 + ind << " de " << bound << " : "; cin >> array[ind]; } return; } void Array::show_array(string msg) { if (msg != "") cout << "\n" << msg << "\n"; cout << "Os " << size << " numeros: " << endl; for (unsigned ind = 0; ind < size; ind += 1) cout << array[ind] << " "; cout << endl; return; } void Array::sort_array(unsigned short n) { if (n > size) n = size; // melhor garantir bubble(array, n); return; } Array Array::sort_array() { Array novo; novo.size = size; for (unsigned short i = 0; i < size; i += 1) novo.array[i] = array[i]; bubble(novo.array, novo.size); return novo; } main.cpp #include "Array.h" int main(void) { // (1) Array um; // cria com 20, zerados um.show_array("com o construtor sem parametros, zerado"); // (2) unsigned short bound = 0; cout << "\nDigite a quantidade (limite) de numeros no novo vetor: "; cin >> bound; cout << endl; if (bound > 20) bound = 20; Array obj(bound); obj.show_array("Vetor como digitado"); // (3) Array outro = obj.sort_array(); outro.show_array("Vetor novo classificado, criado a partir do original"); obj.show_array("o original (inalterado)"); // (4) cout << "\n\nAgora classifica os primeiros 4 elementos do original\n\n"; obj.sort_array(4); obj.show_array("Vetor resultante"); // (5) cout << "\n\nAgora classifica o vetor todo\n\n"; obj.sort_array(4000); obj.show_array("Vetor resultante"); return 0; };
  11. Lista estruturada não faz parte do tratamento nesse tópico.
  12. Foi exatamente o que fiz. Desses, tentei o VS Code, mas o que limita de mais é o ínfimo conhecimento que tenho tanto de inglês quanto das funcionalidades. Deu pra notar que não trabalho no ramo,. Cursei SI na Escola Técnica da UFRGS, mas não tive nenhum contato com essas ferramentas, por falta de tempo talvez.. Trabalhei pouco tempo com Netbeans (JAVA), PASCAL, C, PHP muito pouco, POO e banco de dados(não evoluí, fiquei apenas no comandos básicos de acesso a registros e updates), e meu estágio foi numa empresa que trabalhava com CACHE da intersystems por 4 meses. Meu objetivo é tentar implementar o conteúdo visto na disciplina de lógica de programação e aprender a programar em C++ e POO. Voltando aos IDEs acima, tentei configurar o VS Code mas não fui feliz. Irei tentar usar o Eclipse ou CLion.
  13. Agora está compilando, porém há 8 erros:
  14. Instalei a IDE codeblocks-20.03-setup.exe e o compilador tdm64-gcc-9.2.0, e ao compilar e executar ainda ocorrem erros nos arquivos. O main e o Array.cpp: Ao compilar e executar o .h, Tenho que configurar a IDE?
  15. Onde faço download do gcc 10.2? Array.h #pragma once #include <iostream> using namespace std; class Array { public: Array(); // cria com 20 zerados Array(unsigned short N); // cria o array com N public: void build_array(unsigned short); // le do teclado void show_array(string); [[nodiscard]] Array sort_array(); void sort_array(unsigned short); private: unsigned short size; short array[20]; void bubble(short[], unsigned short); }; Array.cpp: #include "Array.h" Array::Array() { size = 20; for (short i = 0; i < 20; i += 1) array[i] = 0; }; Array::Array(unsigned short valor) : size(valor) { build_array(valor); // le os valores }; void Array::bubble(short V[], unsigned short n) { for (int i = 0; i < n - 1; i++) for (int j = 0; j < n - i - 1; j++) if (V[j] > V[j + 1]) std::swap(V[j], V[j + 1]); return; } void Array::build_array(unsigned short bound) { size = bound; for (unsigned ind = 0; ind < bound; ind += 1) { cout << "Entre valor " << 1 + ind << " de " << bound << " : "; cin >> array[ind]; } return; } void Array::show_array(string msg) { if (msg != "") cout << "\n" << msg << "\n"; cout << "Os " << size << " numeros: " << endl; for (unsigned ind = 0; ind < size; ind += 1) cout << array[ind] << " "; cout << endl; return; } void Array::sort_array(unsigned short n) { if (n > size) n = size; // melhor garantir bubble(array, n); return; } Array Array::sort_array() { Array novo; novo.size = size; for (unsigned short i = 0; i < size; i += 1) novo.array[i] = array[i]; bubble(novo.array, novo.size); return novo; } main.cpp: #include "Array.h" int main(void) { // (1) Array um; // cria com 20, zerados um.show_array("com o construtor sem parametros, zerado"); // (2) unsigned short bound = 0; cout << "\nDigite a quantidade (limite) de numeros no novo vetor: "; cin >> bound; cout << endl; if (bound > 20) bound = 20; Array obj(bound); obj.show_array("Vetor como digitado"); // (3) Array outro = obj.sort_array(); outro.show_array("Vetor novo classificado, criado a partir do original"); obj.show_array("o original (inalterado)"); // (4) cout << "\n\nAgora classifica os primeiros 4 elementos do original\n\n"; obj.sort_array(4); obj.show_array("Vetor resultante"); // (5) cout << "\n\nAgora classifica o vetor todo\n\n"; obj.sort_array(4000); obj.show_array("Vetor resultante"); return 0; }; Será problema do compilador?
  16. Cometi uma redundância? Reescrevi o Array.cpp, e ficou assim: #include "Array.h" #include <iostream> #include <iostream> #include <string> void Array::knuth(short cel[], unsigned short n){ bool swap; short temp; for ( unsigned short ind=0; ind<=n-1; ind+=1 ){ while ( ind >= n-1 ) { if ( swap == 1 ){ n-=1; swap = 0; ind=0; } else{ break; } } if ( cel[ind] > cel[ind+1] ){ temp = cel[ind]; cel[ind] = cel[ind+1]; cel[ind+1] = temp; swap = 1; } } return; } Array::Array(){ size=20; for( unsigned short ind=0; ind < 20; ind+=1) { array[ind] = 0; } } Array::Array( unsigned short valor ) : size(valor){ build_array(valor); } void Array::build_array(unsigned short bound){ size = bound; for (unsigned ind=0; ind < bound; ind+=1){ cout << "Write array[" << ind << "] - size = " << bound << ": "; cin >> array[ind]; } return; } void Array::show_array(string msg){ if (msg != "") cout << "\n" << msg << "\n"; cout << "The numbers entered are: " << endl; for ( unsigned ind=0; ind<size; ind+=1 ) cout << "Tabela[" << ind << "] = " << array[ind] << endl; return; } void Array::sort_array(unsigned short n){ if (n > size) n = size; knuth(array, n); return; } [[nodiscard]] Array Array::sort_array(){ Array novo; novo.size = size; for (unsigned short ind=0; ind < size; ind+=1){ novo.array[ind] = array[ind]; } knuth(novo.array, novo.size); return novo; } main.cpp : #include "Array.h" #include <iostream> #include <string> using namespace std; int main ( void ){ Array um; um.show_array("With the constructor without parameters, with zeros."); unsigned short bound = 0; cout << "Enter the amount of new vector numbers: \n\n"; cin >> bound; if (bound > 20) bound = 20; Array obj(bound); obj.show_array("Vector in the same way as typed.\n\n"); Array outro = obj.sort_array(); outro.show_array("New classified vector, created from the original.\n\n"); obj.show_array("Original vector.\n\n"); cout << "Now, classifies the first four elements of the original vector:\n"; obj.sort_array(4); obj.show_array("Resultant vector.\n\n"); cout << "Now, classifies the entire vector:\n\n"; obj.sort_array(4000); obj.show_array("Resultant vector."); return 0; }; Pode me ajudar ?
  17. Array.h (arquivo 1) -Esse compilou! #ifndef ARRAY_H_INCLUDED #define ARRAY_H_INCLUDED #include <string> using namespace std; class Array { // Private section unsigned short size; short array[20]; void knuth(short[], unsigned short); public: // Public Declarations Array(); Array(unsigned short N); void build_array(unsigned short); void show_array(string); Array sort_array(); void sort_array(unsigned short); }; #endif Array.cpp (arquivo 2) #include "Array.h" class Array { private: void knuth(short cel[], unsigned short n){ bool swap; short temp; for ( unsigned short ind=0; ind<=n-1; ind+=1 ){ while ( ind >= n-1 ) { if ( swap == 1 ){ n-=1; swap = 0; ind=0; } else{ break; } } if ( cel[ind] > cel[ind+1] ){ temp = cel[ind]; cel[ind] = cel[ind+1]; cel[ind+1] = temp; swap = 1; } } return; } public: Array::Array(){ size=20; for( unsigned short ind=0; ind < 20; ind+=1) { array[ind] = 0; } } Array::Array( unsigned short valor ) : size(valor){ build_array(valor); } void Array::build_array(unsigned short bound){ size = bound; for (unsigned ind=0; ind < bound; ind+=1){ cout << "Write array[" << ind << "] - size = " << bound << ": "; cin >> array[ind]; } return; } void Array::show_array(string msg){ if (msn != "") cout << "\n" << msg << "\n"; cout << "The numbers entered are: " << endl; for ( unsigned ind=0; ind<size; ind+=1 ) cout << "Tabela[" << ind << "] = " << array[ind] << endl; return; } void Array::sort_array(unsigned short n){ if (n > size) n = size; knuth(array, n); return; } [[nodiscard]] Array Array::sort_array(){ Array novo; novo.size = size; for (unsigned short ind=0; ind < size; ind+=1){ novo.array[ind] = array[ind]; } knuth(novo.array, novo.size); return novo; } }; ERROS: 1) [Error] redefinition of 'class Array' class Array { 2) [Error] previous definition of 'class Array' main.cpp (ARQUIVO 3) #include <iostream> #include "Array.h" using namespace std; int main ( void ){ Array um; um.show_array("With the constructor without parameters, with zeros."); unsigned short bound = 0; cout << "Enter the amount of new vector numbers: \n\n"; cin >> bound; if (bound > 20) bound = 20; Array obj(bound); obj.show_array("Vector in the same way as typed.\n\n"); Array outro = obj.sort_array(); outro.show_array("New classified vector, created from the original.\n\n"); obj.show_array("Original vector.\n\n"); cout << "Now, classifies the first four elements of the original vector:\n"; obj.sort_array(4); obj.show_array("Resultant vector.\n\n"); cout << "Now, classifies the entire vector:\n\n"; obj.sort_array(4000); obj.show_array("Resultant vector."); return 0; } Erros: Não rejeitou!
  18. Olá, Entendi o tópico! Compilou e executou. Uso o Dev C++. Mas: [Warning] 'nodiscard' attribute directive ignored [-Wattributes] Dúvidas: Se só preciso do cabeçalho e da biblioteca, onde será escrito o que faz a classe e métodos? e o main, onde será escrito? Serão 2 arquivos com extensão .h e .dll?
  19. Estou tentando executar em arquivos separados .h e .cpp, como você recomendou, mas ocorrem erros.
  20. arfneto, não entendi porque " Array(unsigned short valor) : size(valor) "? size não é o atributo público! Porque escrever size(valor)? Pode explicar/traduzir esse método?
  21. arfneto: Quanto à: [[nodiscard]] Array Array::sort_array() { Array novo; novo.size = size; for (unsigned short i = 0; i < size; i += 1) novo.array[i] = array[i]; bubble(novo.array, novo.size); return novo; } 1) Porque criaste o método sort_array() que retorna a instância da classe? E o que faz [[nodiscard]] e isso está relacionado ao método Array::sort_array() ? Usar [[nodiscard]] impede que a instância seja destruída? 2) Qual a diferença entre esses dois métodos - Array sort_array(); e void sort_array(unsigned short) ? Porque instanciaste a classe no 1º método e no 2º não?
  22. arfneto, obrigado, por ora, por lançar as explicações junto ao código, assim o torna mais inteligível! Irei estudar toda essa dinâmica com calma, pois meu aprendizado durante o curso de S.I. há 14 anos abordou superficialmente orientação a objeto. Tudo isso é novo para mim.
  23. Ola Arfneto. Pode me ajudar, corrigindo os erros? Já vi que é errado chamar método de uma classe derivada dentro do método especial Array(). Criei uma classe derivada. Está certo isso? Assim, poderá reutilizar o método para ordenar. In constructor 'Array::Array()': [Error] cannot call member function 'void SortedArray::build_array_sort_number(unsigned int)' without object #include <iostream> using namespace std; class Array //Definição da classe Array { private: unsigned size; short array[20]; public: Array(); //Array() é um construtor void build_array(unsigned); void show_array(); }; class SortedArray : public Array{ public: void build_array_sort_number(unsigned); }; int main(void) { Array obj; obj.show_array(); SortedArray obj2; obj.show_array(); return 0; }; //Array::Array() é um construtor de classe. É um método muito especial, já que retorna uma instância da classe, por definição. //Como não tem parâmetros é o construtor padrão. Array::Array() { unsigned bound = 20; cout << "\n [1] Digite a quantidade (limite) de numeros que serao ordenados: "; cin >> bound; cout << endl; if ( bound < 20 ) size = bound; Array::build_array(bound); SortedArray::build_array_sort_number(bound); }; //Definição do método build_array void Array::build_array(unsigned bound){ size = bound; //lê tabela for ( unsigned ind=0; ind < bound; ind+=1 ){ cout << "Write array[" << ind << "] - size = " << bound << ": "; cin >> array[ind]; } size=bound; return; } void Array::show_array(){ cout << "The numbers entered are: " << endl; for ( unsigned ind=0; ind<size; ind+=1 ) cout << "Tabela[" << ind << "] = " << array[ind] << endl; return; } void SortedArray::build_array_sort_number(unsigned bound){ short temp; bool swap=0; unsigned ind=0; size=bound; //lê tabela for (ind; ind < bound; ind+=1){ cout << "Write array[" << ind << "] - size = " << bound << ": "; cin >> array[ind]; } //Ordena números de forma crescente for ( ind=0; ind<=bound-1; ind+=1 ){ while ( ind >= bound-1 ) { if ( swap == 1 ){ bound-=1; swap = 0; ind=0; } else{ break; } } if ( array[ind] > array[ind+1] ){ temp = array[ind]; array[ind] = array[ind+1]; array[ind+1] = temp; swap = 1; } } return; }
  24. Olá arfneto. O objetivo do código abaixo seria fazer como você recomendou, ou seja criar um método para ordenar os números da tabela. Instanciei a classe Array como obj, mas ao compilar emite a seguinte mensagem de erro: In function 'int main()': [Error] expected primary-expression before 'unsigned'. #include <iostream> #include<stdlib.h> using namespace std; class Array { private: unsigned size; short array[20]; public: Array(); void build_array(unsigned); void build_array_sort_number(unsigned); void show_array(); }; int main(void){ unsigned choice; while (choice!=3){ system("cls"); cout << "\t\t\t Ascending order of numbers - Knuth method" << endl; cout << endl; cout << "\t 1 - Natural Order" << endl; cout << "\t 2 - Ascending Order" << endl; cout << "\t 3 - Sair"; cout << endl; cout << endl; cout << endl; cout << "Choice: "; cin >> choice; switch(choice){ case 1 : system("cls"); cout << endl; cout << "\t 1 - Natural Order" << endl; cout << endl; Array obj; obj.build_array(unsigned bound); cout << "Press any key to continue!"; break; case 2 : system ("cls"); cout << endl; cout << "\t 2 - Ascending Order" << endl; cout << endl; obj.build_array_sort_number(unsigned bound); cout << "Press any key to continue!"; break; case 3 : exit(1); } } obj.show_array(); return 0; } Array::Array(){ unsigned bound = 20; cout << " Write the amount of the numbers to sort: "; cin >> bound; cout << endl; if ( bound < 20 ) size = bound; build_array(bound); build_array_sort_number(bound); }; void Array::build_array(unsigned bound){ size = bound; //lê tabela for ( unsigned ind=0; ind < bound; ind+=1 ){ cout << "Write array[" << ind << "] - size = " << bound << ": "; cin >> array[ind]; } size=bound; return; } void Array::build_array_sort_number(unsigned bound){ short temp; bool swap=0; unsigned ind=0; //Ordena números de forma crescente ind=0; for (ind; ind <= bound; ind+=1){ if ( ind>=bound-1 ){ if ( swap == 1 ){ size-=1; swap = 0; ind=0; } else{ break; } } else{ if ( array[ind] > array[ind+1] ){ temp = array[ind]; array[ind] = array[ind+1]; array[ind+1] = temp; swap = 1; } } } size=bound; return; } void Array::show_array(){ cout << "The numbers entered are: " << endl; for ( unsigned ind=0; ind<size; ind+=1 ) cout << "Tabela[" << ind << "] = " << array[ind] << endl; return; }
  25. Respondendo ao seu questionamento acima , afirmo que entendi todos os conceitos q explicasses aqui. Ao terminar um procedimento da classe, a tabela é destruída porquê?. Entao, para preservar a entrada e de dados, o metodo bubblesort deve passar os dados para um metodo fora da classe?

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!