Ir ao conteúdo
  • Cadastre-se

C++ Crie um programa que leia um vetor de qualquer tamanho do tipo float


Posts recomendados

Crie um programa que leia um vetor de qualquer tamanho de elementos do tipo float
e escreva os elementos desse vetor na ordem inversa à que foram lidos, em ordem
crescente e decrescente. Para isso crie uma função para escrever os elementos em
ordem inversa e duas funções para ordenação. 

 

Eu fiz a questão, mas tem alguma coisa errada ai, porque quando ela me dar a inversa, sempre aparece um zero, ai quando vai me dar a ordem decrescente também aparece o zero. Alguém por favor pode me dizer onde está o erro?


 

#include<stdio.h>
#include <cstdlib>
#include <math.h>
#include <iostream>
#define tam1000


using namespace std;

void lervetor (int tam, float v[]);
void inversavetor (int tam, float v[]);
void crescentevetor (int tam, float v[]);
int i, y, j, aux;

int main (){
	int tam;
	float vet[tam];
	cout <<"Digite o tamanho do vetor: ";
	cin >> tam;
	cout <<"Digite os valores do vetor: \n";
	lervetor (tam, vet);
	cout<< endl;
	cout <<"Sua ordem inversa eh: \n";
	inversavetor (tam, vet);
	cout << endl;
	crescentevetor (tam, vet);

	system ("pause");
	return EXIT_SUCCESS;	
}

void lervetor (int tam, float v[]){
	int i;
	for (i=0; i<tam; i++){
	cout <<"V[" << i << "]: ";
	cin >> v[i];
	}
}


void inversavetor (int tam, float v[]){
	int i;
    for (i = tam; i >= 0; i--) {
        cout << v[i] << endl;
    }
     cout <<"\n";
}

void crescentevetor (int tam, float v[]){
	int i;
	for (i = 0; i < tam; i++){
        for(y = 1; j < tam; j++){
            if (v[i] > v[j]){
                aux = v[i];
                v[i] = v[j];
                v[j] = aux;
            }
        }
    }

    cout << "Elementos ordenados (crescente): \n";
    for( i = 0; i < tam; i++){
        cout << v[i] << endl;
        
    }
		cout << endl;
    cout << "Elementos ordenados (decrescente): \n";
    for(i = tam; i > 0; i--){
        cout << v[i] << endl;
        
    }
	cout << endl;
}

 

Link para o comentário
Compartilhar em outros sites

Primeiro, na função main(), você declara um vetor de float com tamanho de uma variável que ainda não foi definida. Para informar um tamanho de um vetor, esse tamanho precisa ser constante. Para que seja dinâmico como exige esse exercício e sem valor máximo de elementos, você vai precisar declarar esse vetor em tempo de execução da seguinte forma:

auto *vet = new float[tam];

Isso vai criar a quantidade de elementos que o usuário pedir.

No final, você precisa chamar o delete para excluir da memória esses elementos:

delete[] vet

O segundo problema, na função inversavetor(), você começa a mostrar os elementos a partir do índice igual ao tamanho do vetor. Isso significa que um vetor de 3 posições, por exemplo, invertido vai mostrar o elemento de posição 3. Porém, o último elemento de um vetor de 3 posições é 2 por que a contagem começa em 0. Veja: vet[0], vet[1] e vet[2]. Então, você vai precisar mudar para que i seja tam - 1.

O terceiro problema é na função crescentevetor(), e aqui tem vários problemas. Você errou o for da linha 52. Você seta a variável y, mas faz operações na variável j. Então troque para j e sete ela para i + 1. Outro problema aqui é o cast implícito do elemento do vetor para int que é o tipo da variável aux. aux deveria ser do tipo float. Aqui também tem o problema do índice dos vetores lá no último for tem que trocar para i = tam - 1 e na condição do for tem que ser i >= 0 por que o índice 0 é o primeiro elemento.

 

Não tive muito tempo para escrever essa resposta então acho que não expliquei muito bem. Observe o código abaixo com as modificações e faça testes para garantir que está funcionando como esperado.

#include<stdio.h>
#include <cstdlib>
#include <math.h>
#include <iostream>
#define tam1000


using namespace std;

void lervetor (int tam, float v[]);
void inversavetor (int tam, float v[]);
void crescentevetor (int tam, float v[]);
int i, y, j;
float aux;

int main (){
	int tam;
	cout <<"Digite o tamanho do vetor: ";
	cin >> tam;
	auto *const vet = new float[tam];
	cout <<"Digite os valores do vetor: \n";
	lervetor (tam, vet);
	cout<< endl;
	cout <<"Sua ordem inversa eh: \n";
	inversavetor (tam, vet);
	cout << endl;
	crescentevetor (tam, vet);
	delete[] vet;

	system ("pause");
	return EXIT_SUCCESS;
}

void lervetor (int tam, float v[]){
	int i;
	for (i=0; i<tam; i++){
	cout <<"V[" << i << "]: ";
	cin >> v[i];
	}
}


void inversavetor (int tam, float v[]){
	int i;
    for (i = tam - 1; i >= 0; i--) {
        cout << v[i] << endl;
    }
     cout <<"\n";
}

void crescentevetor (int tam, float v[]){
	int i;
	for (i = 0; i < tam; i++){
        for(j = i + 1; j < tam; j++){
            if (v[i] > v[j]){
                aux = v[i];
                v[i] = v[j];
                v[j] = aux;
            }
        }
    }

    cout << "Elementos ordenados (crescente): \n";
    for( i = 0; i < tam; i++){
        cout << v[i] << endl;

    }
		cout << endl;
    cout << "Elementos ordenados (decrescente): \n";
    for(i = tam - 1; i >= 0; i--){
        cout << v[i] << endl;

    }
	cout << endl;
}

 

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

@Joice Mendes    isso mesmo que o @Jhonas Boeno   disse ,  na hora de escrever invertido ,  na sua função   " inversavetor " você está escrevendo os elementos começando de uma posição que não existe no vetor , pois a última é igual o tamanho do vetor menos um , já que na leitura do vetor você começou em zero ,  e também você não está seguindo o que o enuciado pede , que foi um vetor de qualquer tamanho e não um vetor com tamanho definido pelo usuário ,     e  se você está fazendo em c++ então melhor não misturar   c   com c++ ,  e seria melhor usar o comando 

push_back();

que adiciona o número no vetor e incrementa a posição do vetor, e para escrever de traz para frente , use o comando

 .size(); 

que determina o tamanho do vetor e menos um por causa de que começa em zero também , e essa parte de inserir os números no vetor poderia ser assim :

// vector::push_back
#include <iostream>
#include <vector>
#include <windows.h>
#include <iomanip>
using namespace std;
int main()
{
    vector < int >    meu_vetor;
    int meu_int;
    cout<<"insira numeros decimais (  0 para finalizar  ):"<<endl;
    do
    {
        cin >> meu_int;
        meu_vetor.push_back( meu_int );
    }while( meu_int );
    cout<<"meu_vetor Armazena " << int( meu_vetor.size() ) << " numeros.\n" << endl;
    
    // escrever inverso
    for(int i=int(meu_vetor.size())-2; i>-1; i--)  // menos dois por que inseriu o zero do finaL e incrementou
        cout << meu_vetor[i] << " ";

    return 0;
}

 

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

Para futuras consultas, segue uma forma alternativa usando ponteiros:

Spoiler

#include <iostream>


using namespace std;


float *lerVetor(int tamanho);

void imprimirNormal(int tamanho, float *vetor);

void imprimirInverso(int tamanho, float *vetor);

void imprimirCrescente(int tamanho, float *vetor);

void imprimirDecrescente(int tamanho, float *vetor);

void ordenarVetor(int tamanho, float *vetor, bool crescente);


int main() {
    int   tamanho = 0;
    float *vetor  = nullptr;

    cout << "Informe o tamanho: ";
    cin >> tamanho;
    cin.ignore();

    vetor = lerVetor(tamanho);

    imprimirNormal(tamanho, vetor);
    imprimirInverso(tamanho, vetor);
    imprimirCrescente(tamanho, vetor);
    imprimirDecrescente(tamanho, vetor);

    free(vetor);
    
    return EXIT_SUCCESS;
}


float *lerVetor(int tamanho) {
    auto *vetor = (float *) malloc(tamanho * sizeof(float));

    for (int i = 0; i < tamanho; ++i) {
        cout << "Digite o valor [ "
             << (i + 1)
             << " de "
             << tamanho
             << " ]: ";
        cin >> vetor[i];
        cin.ignore();
    }

    return vetor;
}

void imprimirNormal(int tamanho, float *vetor) {
    cout << ">> Vetor normal:"
         << "\n";

    for (int i = 0; i < tamanho; ++i) {
        cout << vetor[i]
             << "\n";
    }

    cout << "-----------------------------------------------"
         << "\n";
}

void imprimirInverso(int tamanho, float *vetor) {
    cout << ">> Vetor inverso:"
         << "\n";

    for (int i = tamanho - 1; i >= 0; --i) {
        cout << vetor[i]
             << "\n";
    }

    cout << "-----------------------------------------------"
         << "\n";
}

void imprimirCrescente(int tamanho, float *vetor) {
    ordenarVetor(tamanho, vetor, true);

    cout << ">> Vetor crescente:"
         << "\n";

    for (int i = 0; i < tamanho; ++i) {
        cout << vetor[i]
             << "\n";
    }

    cout << "-----------------------------------------------"
         << "\n";
}

void imprimirDecrescente(int tamanho, float *vetor) {
    ordenarVetor(tamanho, vetor, false);

    cout << ">> Vetor decrescente:"
         << "\n";

    for (int i = 0; i < tamanho; ++i) {
        cout << vetor[i]
             << "\n";
    }

    cout << "-----------------------------------------------"
         << "\n";
}

void ordenarVetor(int tamanho, float *vetor, bool crescente) {
    float temp = 0.0;

    for (int i = 0; i < tamanho; ++i) {
        for (int j = 0; j < tamanho - i - 1; ++j) {
            if (crescente) {
                if (vetor[j] > vetor[j + 1]) {
                    temp = vetor[j];
                    vetor[j]     = vetor[j + 1];
                    vetor[j + 1] = temp;
                }
            } else {
                if (vetor[j] < vetor[j + 1]) {
                    temp = vetor[j];
                    vetor[j]     = vetor[j + 1];
                    vetor[j + 1] = temp;
                }
            }
        }
    }
}

 

 

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

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!