Ir ao conteúdo

Posts recomendados

Postado

Estou com problema no meu código. Defini os vetores A e B com o tamanho 3 (e está funcionando assim), mas quando eu mudo o tamanho dos vetores, para 5 por exemplo, o vetor resultante C carrega números aleatórios (conforme abaixo). Agradeço quem puder ajudar.

 

image.png.8c9dd5107bb50bf2b701ca4308ca0923.png

 

Segue o código.

#include<stdio.h>
#include <stdlib.h>


void OrdenaSelecao (int tam, int *vetorC)
{
     int minimo, i, j;
	 int aux;
	 
     for (i=0; i<tam; i++)
	 {
         minimo = i;
         // pega indice do menor
         for (j=i+1; j<tam; j++)
		 {
             if ( vetorC[j] < vetorC[minimo])
			 {
                 minimo = j;
             }
         }
		
         // efetua a troca
		 aux = vetorC[minimo];
         vetorC[minimo] = vetorC[i];
         vetorC[i] = aux;
     }
 }

int main(void)
{
    int i;
    
    int vetorA[3];
        printf("Digite os elementos do vetor A:\n");
    for(i = 0; i < 3; i++)
    {
        printf("Elemento %d:\n",i+1);
        scanf("%d",&vetorA[i]);
    }
    printf("Vetor A:\n[ ");
    for(i = 0; i < 3; i++)
    {
        printf("%d ",vetorA[i]);
    }
    printf("]\n");

    
    int vetorB[3];
    printf("Digite os elementos do vetor B:\n");
    for(i = 0; i < 3; i++)
    {
        printf("Elemento %d:\n",i+1);
        scanf("%d",&vetorB[i]);
    }
    printf("Vetor B:\n[ ");
    for (i= 0; i < 3; i++)
    {
        printf("%d ",vetorB[i]);
    }
    printf("]\n");


    
    int vetorC[6];
   
    for(i = 0; i < 6; i++)
    {
		vetorC[i] = vetorA[i];
		vetorC[i+2] = vetorB[i];
    }	
 

    printf("Vetor C (A+B):\n[ ");
    for(i = 0; i < 6; i++)
    {
        printf("%d ",vetorC[i]);
    }
    printf("]\n");

    printf("Vetor C (ordenado):\n[ ");
    OrdenaSelecao(6, vetorC);
    for(int i=0; i<6; i++)
		printf("%d ", vetorC[i]);
    printf("]\n");
	
	
	return 0;
}

 

 

  • Curtir 1
Postado

@Anderson Pires Fernandes   seu código está funcionando bem ,  e por que você colocou essa palavra  "  void  "  na função main  ? 

int main(void)  // para quê esse void ?
{
    int i;
    int vetorA[3],vetorB[3],vetorC[6];
    printf("Digite os elementos do vetor A:\n");

,  pode ser que tenha atrapalhado o funcionamento do código  :

#include<stdio.h>
#include <stdlib.h>
void OrdenaSelecao (int tam, int *vetorC)
{
    int minimo, i, j;
    int aux;
    for (i=0; i<tam; i++)
    {
        minimo = i;
        // pega indice do menor
        for (j=i+1; j<tam; j++)
        {
            if ( vetorC[j] < vetorC[minimo])
            {
                minimo = j;
            }
        }
        // efetua a troca
        aux = vetorC[minimo];
        vetorC[minimo] = vetorC[i];
        vetorC[i] = aux;
    }
}
int main()
{
    int i;
    int vetorA[3],vetorB[3],vetorC[6];
    printf("Digite os elementos do vetor A:\n");
    for(i = 0; i < 3; i++)
    {
        printf("Elemento %d:\n",i+1);
        scanf("%d",&vetorA[i]);
    }
    printf("Vetor A:\n[ ");
    for(i = 0; i < 3; i++)
    {
        printf("%d ",vetorA[i]);
    }
    printf("]\n");
    printf("Digite os elementos do vetor B:\n");
    for(i = 0; i < 3; i++)
    {
        printf("Elemento %d:\n",i+1);
        scanf("%d",&vetorB[i]);
    }
    printf("Vetor B:\n[ ");
    for (i= 0; i < 3; i++)
    {
        printf("%d ",vetorB[i]);
    }
    printf("]\n");
    for(i = 0; i < 3; i++)
    {
        vetorC[i] = vetorA[i];
        vetorC[i+3] = vetorB[i];
    }
    printf("Vetor C (A+B):\n[ ");
    for(i = 0; i < 6; i++)
    {
        printf("%d ",vetorC[i]);
    }
    printf("]\n");
    printf("Vetor C (ordenado):\n[ ");
    OrdenaSelecao(6, vetorC);
    for(i=0; i<6; i++)
       printf("%d ", vetorC[i]);
    pri ntf("]\n");
    return 0;
}

 

  • Curtir 2
Postado

@Anderson Pires Fernandes Da forma que fez não é prático mudar o tamanho dos vetores já que terá que alterar todas as partes do código com o tamanho anterior. Para evitar isso você poderia ter definido um tamanho para só alterar uma vez, p.ex,

 

#define MAX 3

 

E no código,

int vetorA[MAX];
int vetorB[MAX];
int vetorC[MAX * 2];
...
for(i = 0; i < MAX; i++){
...

 

Assim para alterar para 5 elementos só teria que modificar o valor de MAX. Outra forma, em vez de usar uma constante, seria fazer alocação dinâmica.

 

Sobre o problema nos valores do vetor C, @devair1010 corrigiu a parte dessa atribuição. Seu loop estava com o tamanho do vetor C quando devia ser metade e a atribuição dos elementos de B tem que ser no índice i + tamanho do outro vetor.

  • Curtir 2
Postado
7 horas atrás, devair1010 disse:

seu código está funcionando bem ,  e por que você colocou essa palavra  "  void  "  na função main  ? 

 

main() retorna um int e tem dois parâmetros. Ou 3 em certos casos (isso é aceito e não padrão: algumas implementações passavam um 3o endereço para as variáveis de ambiente do processo, e geralmente era chamado de envp esse 3o argumento). 

 

E main() é uma função, antes de tudo. Uma função que retorna um int e não tem argumentos deve ser declarada
 

    int f(void);


e não 
 

    int f();


A razão é que ao declarar void fica claro que a função não pode receber nenhum argumento, mas ao declarar com a lista vazia a função deve aceitar QUALQUER número de argumentos.

 

Assim o compilador tem que aceitar f(300) ou f(23, 23333, 343434) ou qualquer tamanho. Isso geraria comportamento indefinido, mas seria possível no segundo caso.

 

Assim é recomendado que se declare como (void) a lista de argumentos vazia, e não ( ) que pode e deve aceitar qualquer coisa. E como main() é uma função antes de tudo é recomendado em geral escrever explicitamente main(void) se não vai tratar os argumentos, ao invés do clássico
 

    int main(int argc, char** argv);


Onde argc e argv são nomes clássicos apenas: se pode usar qualquer nome. Também é comum usar
 

    int main( int argc, char* argv[]);


Em geral é considerado positivo eliminar toda e qualquer ambiguidade ou conversão implícita e assim 
 

    int main(void);


é mais adequado. Essa é uma discussão interminável :) e não sou eu que vou dar uma resposta. Mas esse é o raciocínio e muitos (como eu) usam assim: sem argumentos (void). Lista vazia: nunca.

 

O standard diz que é diferente f() de f(void) na declaração, e que deve ser aceito qualquer valor no primeiro caso, apesar de ser comportamento indefinido --- UB. 

 

Um problema é que por exemplo ao usar um header com a função declarada f() o usuário de uma biblioteca pode usar essa possibilidade para passar uma lista especial de argumentos, como talvez uma maneira de corromper o programa ou tentar injetar algum código... E o compilador vai aceitar. Se estiver declarado como (void) não vai compilar de jeito nenhum... Um problema a menos. E qualquer problema a menos já é muito. E como main() é uma função e ter um padrão também é um problema a menos usar SEMPRE void para uma lista vazia de argumentos faz sentido.

 

Um outro ponto seria a possibilidade de chamar main() recursivamente :) o que aconteceria? Seria possível? E se fosse o que fazer com os argumentos? 

 

EXEMPLO

#include <stdio.h>

int f();
int g(void);

int main(void)
{
    f(12);
    f();
    f("Clube do Hardware");
    //g ( 22 ); // esse não compila
    return 0;
};

int f(){ return 0;};
int g(){ return 0;};
// fim

 

No gcc 10 por exemplo esse programa compila, porque é o que diz o padrão.

 

Mas se tirar o comentário na chamada de g() vai dar erro.

 

f() g() e main() são funções...

 

Acho que deu pra entender.

 

  • Curtir 2

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!