Ir ao conteúdo
  • Cadastre-se

C++ Elementos e sequencias crescentes.


Leoveira

Posts recomendados

Boa tarde, estou fazendo um exercício que na qual eu preciso definir o numero de elementos e uma sequencia que deve ser impressa assim:

 

Ex:  N=10(numero de elementos)

1

23

456

78910

 

O exercício pede mais coisas, mas creio que consigo fazer o resto. Meu problema e só essas manipulações de vetores que ainda estão me dando trabalho.

Link para o comentário
Compartilhar em outros sites

Boa tarde, Leo

 

Vetores são realmente complicados de serem manuseados, também tive bastante dificuldade. Bom, para você ordenar sequências em ordens crescentes, será necessário utilizar laços de repetição que percorrerão e verificarão se os números estão nas posições corretas. Existem diversas formas de fazer isso, inclusive existem métodos já criados, os quais aconselho você a dar uma pesquisa na internet.

 

Como estimulo para pensamento, pense na situação em que temos um vetor com os valores que você mesmo disse, porém desordenados:

 

[23, 1, 78910, 456]

 

Como você poderia perguntar se o número 23 é maior ou menor que os outros? Pensando em uma estrutura, onde temos dois laços de repetições, onde um será responsável por percorrer o índice a ser ordenado e o outro o índice a ser comparado, qual seria a lógica necessária para fazer essa comparação?

 

Teríamos algo como: 

for(i=0;i<tamanho;i++ )
{
	for(c=i+1;c<tamanho;c++)
    {
		// Código para comparação
    }
}

 

Como foi feito no código acima, você concorda comigo que o laçi que irá comparar o número, não deve iniciar no mesmo índice do laçi sendo comparado? Por isso usamos como inicializador do laço de repetição o i+1. A estrutura básica que você pode utilizar para ordenação é essa, agora como você pode fazer para comparar os dados e atualizar os dados no array? Uma dica é que será necessário utilizar uma variável auxiliar, para que um dos valores a ser ordenado não seja perdido.

 

Lembrando que essa é apenas uma das diversas formas de resolver esse tipo de problema, que inclusive, é uma maneira bem comum e simples.

 

Continua o desenvolvendo, qualquer dúvida posta aí!

 

Bons estudos!

Link para o comentário
Compartilhar em outros sites

@XenoStory acho que também não expliquei muito claro. Por exemplo se eu colocar para ser 10 elementos e eles vão ter a seguinte sequencia (12, 42, 22, 65, 87, 34, 56, 1, 98 e 23), eu não preciso coloca-los em ordem crescente. Mas preciso que o numero de números exibidos por linha seja crescente.

 

EX.:

12

42, 22

65, 87, 34

56, 1, 98, 23

 

Com dois laços de repetição eu não consegui, e também não consegui pensar em uma maneira que não parece-se desnecessariamente complicada para limitar. Mas ainda to na luta do raciocínio aqui.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Leoveira.

 

Então, o foco para resolução de qualquer coisa é primeiramente entender o que ser quer. O enunciado "oficial" geralmente é o melhor caminho, se possível, poste ele exatamente como foi pedido... pois é ele quem define as regras do negócio. Não adiantaria fazer "certo" algo que não se pediu... :)

 

 

Então, pelo que você postou, acho quer seria algo assim:

12  //primeira linha, um número
42, 22 //segunda linha, dois números
65, 87, 34 //terceira linha, três número
56, 1, 98, 23 //quarta linha, quatro números

Seria isso? caso contrário, além do enunciado, dê uma uma explicação de como mais ou menos seria.

 

Se for isso, ai partimos para entender o funcionamento da lógica aplicada... Veja, a quantidade de números por linha está igual ao "número da linha". A relação é bem direta e simples. Só para frisar: foque no problema... entenda o que ser que ser feito, só depois tente achar uma solução. Acredite: é comum tentarmos focar apenas no resultado, ou seja, em ter que "entrar algo"... focando no problema, a solução vem por osmose.

 

 

 

Daí, você precisa implementa essa característica no seu algoritmo...

 

Para ajudar, pense assim. Como faria para imprimir um número em cada linha? tente fazer isso. Simplesmente imprima um número por linha... só isso. E posta o código aqui.

 

Perceba que a lógica (que achei que é) só muda apenas que não será só um número por linha... Posteriormente, quando já tiver conseguindo com uma linha, tente alterar para "imprimir a quantidade de números de acordo com o número da linha".

 

obs.: só tente fazer o programa final (de acordo com enunciado) DEPOIS DE TER CONSEGUIDO COM UMA LINHA... a ideia que você já tenha uma base da estrutura do programa, ou seja, saber como fazer implementar na linguagem de programação escolha, assim tendo que analisar apenas a parte da lógica em relação ao "detalhe" de ir aumentando a quantidade por linha.

 

 

No aguardo.

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

/*Uma sequência de n números inteiros não nulos é dita piramidal m-alternante se é constituída por m segmentos:
o primeiro com um elemento, o segundo com dois elementos e assim por diante até o m-ésimo, com m elementos.
Além disso, os elementos de um mesmo segmento devem ser todos pares ou todos ímpares e para cada segmento,
se seus elementos forem todos pares (ímpares), os elementos do segmento seguinte devem ser todos ímpares (pares).

Por exemplo, a sequência com n = 10 elementos:
12       3  7         2  10  4        5  13  5  11 é piramidal 4-alternante.
    A sequência com n = 3 elementos:
 7         10  2     é   piramidal 2-alternante.
    A sequência com n = 8 elementos:
1     12   4        3  13  5       12  6   não é piramidal alternante pois o último segmento não tem tamanho 4.

(a) Escreva uma função bloco que recebe como parâmetro um inteiro n e lê n inteiros do teclado,
devolvendo um dos seguintes valores:
       0,  se os n números lidos forem pares;
       1,  se os n números lidos forem ímpares;
     -1,  se entre os n números lidos há números com paridades diferentes.
(b) usando a função do item anterior, escreva um programa que, dados um inteiro n > 1 e uma sequência de n números inteiros,
verifica se ela é piramidal m-alternante. O programa deve imprimir o valor de m ou dar a resposta não.*/


#include <iostream>

using namespace std;

int piramidal(int sequencia[]){

    int elementos,cont;
//armazenar valores
    cout << "Digite o numero de elementos: ";
    cin >> elementos;

    cout << "Digite uma sequencia de numeros: ";
    for(cont=0;cont<elementos;cont++){
        cin >> sequencia[cont];
    }


//exibir
    for(cont=0;cont<elementos;cont++){
        cout << sequencia[cont];
        
}

int main(){

    int elementos=0, sequencia[elementos],chama_funcao;

    cout << "\n\t Piramidal\n";

    chama_funcao=piramidal(sequencia);
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Em 28/02/2018 às 12:30, Simon Viegas disse:

Para ajudar, pense assim. Como faria para imprimir um número em cada linha? tente fazer isso. Simplesmente imprima um número por linha... só isso. E posta o código aqui.

 

A minha sugestão seria para "imprimir um número para cada linha". No seu código, está tudo em uma linha só.

 

Pelo menos aqui exibiu assim:

tela.jpg

 

Então, após ler os números, teria que aparecer mais ou menos assim:

tela2.jpg

 

Basta quebra a linha após exibir um número. Algo como:

//exibir
    for(cont=0;cont<elementos;cont++){
        cout << sequencia[cont] << "\n";
    }

 

Pronto, agora, o que você precisa fazer é que imprima assim:

tela3.jpg

 

Entendeu?

 

Usando os dados do seu exemplo:

tela4.jpg

 

Seria isso?

 

Então, a primeira coisa que precisa absorver é o que se quer fazer, entender o problema... a minha ideia seria dividir em subproblemas... 1- separar por linhas (por que é separado por linhas). Já feito!, 2-fazer as linhas terem a quantidade de números que de acordo com o número da linha (que é o "tchan" do programa). Falta implementar.

 

Daí, entra um terceiro ponto: 3-verificar se é piramidal ou não:

1 hora atrás, Leoveira disse:

(b) usando a função do item anterior, escreva um programa que, dados um inteiro n > 1 e uma sequência de n números inteiros, verifica se ela é piramidal m-alternante. O programa deve imprimir o valor de m ou dar a resposta não.*/

Esse terceiro item item pode ser feito antes ou depois... ou seja, OU você para para implementar a verificação se é piramidal ou não; OU para para implementar a exibição da pirâmide como mostrei acima... para este último, você pode supor que sempre vai utilizar uma valor válido, como 1, 3, 6, 10, 15 etc.

 

Tente entender o que se quer e tente implementar.

 

 

No aguardo.

 

 

Link para o comentário
Compartilhar em outros sites

Consegui fazer, porém se deu defino 10 elementos ele está exibindo uns valores estranhos depois dos 10 .

 

#include <iostream>

using namespace std;

int piramidal(int sequencia[]){

    int elementos=0,x,y;
//armazenar valores
    cout << "Digite o numero de elementos: ";
    cin >> elementos;

    cout << "Digite uma sequencia de numeros: ";
    for(x=0;x<elementos;x++){
        cin >> sequencia[x];
    }

    cout<<"\n";

//exibir
int cont=0;

for(x=0;x<elementos;x++){
    for(y=0;y<elementos;y++){

        if(x>=y){
        cout << sequencia[cont] << "  ";
        cont++;}


        else if(x == elementos ||y == elementos ){
            break;
            }
            else;

    }
    cout<<"\n";
}

}

int main(){

    int elementos=0, sequencia[elementos],chama_funcao;

    cout << "\n\t Piramidal\n";

    chama_funcao=piramidal(sequencia);
}

 

Link para o comentário
Compartilhar em outros sites

@Leoveira Boa Noite, Já vi que a palavra elemento é sua favorita, já contou quantas vezes ela aparece:D

 int elementos=0, sequencia[elementos],chama_funcao;

Olha ela  aí, 2 repetições igualmente mal usadas. Primeiro ela aparece inicializada isso bom, depois você entregou tudo quando a usou para declarar o vetor de nome sequencia de uma maneira totalmente perigosa. Por quê? Ora, ora, se a variável elementos têm zero de valor quantos elementos você responderia que tem o vetor sequencia, se eu pergunto tu responde, sei-lha... afinal de contas 0 é os elementos de uma sequência de elementos 0. CORRETO!

 

Se está errado, então por que compilou? Porque é legal, um vetor de tamanho zero nada mais é que um ponteiro constante: Eles não podem ser atualizados, tão pouco receber informações de outros ponteiros , e só apontam para um luga, o luga que apontará quando fora criado. Sendo assim, sequencia aponta para lugar desconhecido, segundo a implementação que será acessado na memória ou não, fatalmente ou não. Vai de sorte.

14 horas atrás, Leoveira disse:

porém se deu defino 10 elementos ele está exibindo uns valores estranhos depois dos 10 .

Porque não existe lugar para eles, tais elementos estão sendo arbitrariamente gravados. Linguagens de Baixo Nível permitem controle de tudo. Mesmo quando estamos fazendo de maneira errada.

 

Observe este exemplo, que eu mesmo agora criei, sobre uso de VLA (sigla para Variable-Length Array). 

Com base nos exemplos que poderá ver melhor também clicando:atirador: no atalho acima.

/*  Uso Declaração de Inicialização de Vetores...
*/
#include<stdio.h>

int main(void) {

    int elementos = 0;
    puts ("Entre com numero de elementos:");
    while (1 != scanf (" %d", &elementos) || elementos == 0) {
        while (putchar(getchar ()) != '\n'){/* Vázio */}
        printf ("Argumento invalido, entre com numero [1...999...[$: ");
        }

    /// Vetor criado com largura igual a elementos
    /// que se encontram na  memória de programa (pilha)
    puts ("Vetor Sendo criado...");
    int sequencia[ elementos ]; /// Garantidamente não é somente um ponteiro e sim VLA.
    puts ("Vetor criado com sucesso!");
    printf ("Tamanho: %u\n", sizeof sequencia / sizeof (int));
    //! Atenção: sizeof só poder ser usando deste modo dentro do escopo em que é variável
    //! analisada foi criada.
    return 0;
    }

 Observou: Que existe ai ainda uma tentativa de forçar tamanho numérico para sequencia.

Link para o comentário
Compartilhar em outros sites

17 horas atrás, Mauro Britivaldo disse:

Boa Noite, Já vi que a palavra elemento é sua favorita, já contou quantas vezes ela aparece

E por que eu dou nome conforme se pede no exercício, a ideia e que ficasse fácil de entender o que cada variável, vetor ou função faz.

 

Como você escreveu em C eu fiquei meio perdido mas acho que entendi mais ou menos, mas o que seria o comando puts?

 

Eu coloquei uma ponteiro para alocar o tamanho do vetor para ver se resolve o problema, mas não resolveu.

 


#include <iostream>
#include <stdlib.h>

using namespace std;

int*alocavetor (int tamanho){

int *aux;

//alocação dinamica de memoria 
aux= (int*) malloc(tamanho *sizeof(int));

//retorna o valor alocado
return aux;

}

int piramidal(int sequencia[]){

    int tamanho=0,x,y;
//armazenar valores
    cout << "Digite o numero de elementos: ";
    cin >> tamanho;

    cout << "Digite uma sequencia de numeros: ";
    for(x=0;x<tamanho;x++){
        cin >> sequencia[x];
    }

    cout<<"\n";

//exibir
int cont=0;

for(x=0;x<tamanho;x++){
    for(y=0;y<tamanho;y++){

        if(x>=y){
        cout << sequencia[cont] << "  ";
        cont++;}


        else if(x == tamanho ||y == tamanho ){
            break;
            }
            else;

    }
    cout<<"\n";
}

}

int main(){

    int tamanho=0, *sequencia,chama_funcao;

    cout << "\n\t Piramidal\n";

    sequencia=alocavetor(tamanho);
    chama_funcao=piramidal(sequencia);
}

 

Link para o comentário
Compartilhar em outros sites

7 horas atrás, Leoveira disse:

Como você escreveu em C eu fiquei meio perdido mas acho que entendi mais ou menos

Desculpa, agora que você mencionou seu código é para C++, porém passa a impressão de ser em C, pelo menos foi essa a impressão que me deu.

 

7 horas atrás, Leoveira disse:

mas o que seria o comando puts?

Comando em C para imprimir strings no prompt. Em C++ teria equivalência a

cout << "Vetor criado com sucesso!" << endl;

 

7 horas atrás, Leoveira disse:

Eu coloquei uma ponteiro para alocar o tamanho do vetor para ver se resolve o problema, mas não resolveu.

Pelo que vejo, ainda encontra com mesmo problema de tamanho igual a zero. 

int main(){

    int tamanho=0, *sequencia,chama_funcao;

    cout << "\n\t Piramidal\n";

    sequencia=alocavetor(tamanho);
    chama_funcao=piramidal(sequencia);
}

Vamos acompanhar a execução da tarefa:

1- As variáveis são criadas, destaque para tamanho que tem valor: 0

2- Mensagem: Piramidal

3- chama a função alocarvetor com o valor zero como parâmetro, observou que valor foi inicializada com 0??

sequencia = alocavetor (tamanho) e mesma coisa que sequencia = alocavetor(0);

int*alocavetor (int tamanho){

int *aux;

//alocação dinamica de memoria 
aux= (int*) malloc(tamanho *sizeof(int));

//retorna o valor alocado
return aux;

}

4- Declara uma variável para receber o ponteiro da memória, lembra que chamamos a função no ponto 3-  assim:

sequencia = alocavetor (tamanho) e mesma coisa que sequencia = alocavetor(0);

então neste momento temos agora: aux = (int*) malloc (0 * sizeof (int))

 

Me corrija se eu estiver errado, mais não percebi mudança e você continuo com mesmo erro.

adicionado 7 minutos depois

Pare essa caso em particular do problema resolva atribuído o valor máximo da lista, por exemplo se o programa só vai manipular 1000 inteiros então defina assim:

sequencia = alocavetor(1000);

Ou então antes de chamar sequencia = alocavetor (tamanho) , chame uma função para definir o tamanho máximo;

int main(){

    int tamanho=0, *sequencia,chama_funcao;

    cout << "\n\t Piramidal\n";
	cout << "Entre com tamanho maximo: ";
  	cin >> tamanho; // Pegar o tamanho.
  
    sequencia=alocavetor(tamanho);
    chama_funcao=piramidal(sequencia);
}

 

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