Ir ao conteúdo

Posts recomendados

Postado

Desenvolva um programa em C que contenha dois vetores para armazenar valores inteiros,
sendo o primeiro com 5 elementos e o segundo com 8 elementos. Os vetores devem ser
preenchidos com valores aleatórios. O programa ainda deve conter um terceiro vetor com 13
posições para armazenar a junção dos dois primeiros vetores. Os valores dos 3 vetores devem ser
apresentados na tela.
Exemplo:
Vetor 1: 2 5 0 9 3
Vetor 2: 7 0 9 9 1 8 2 3
Vetor 3: 2 5 0 9 3 7 0 9 9 1 8 2 3

 

#include <stdio.h>
#include <locale.h>

int main(void) {
	setlocale (LC_ALL, "Portuguese");

    int i, j;
    int vetorX[5], vetorY[8], vetorZ[13];

    srand(time(NULL));

	printf("\n\n VETOR 1: ");
    for(i = 0; i < 5; i++){
    	vetorX[i] = rand()%30;
    	printf("%d ", vetorX[i]);
	}
	
	printf("\n\n VETOR 2: ");
	for(i = 0; i < 8; i++){
    	vetorY[i] = rand()%30;
    	printf("%d ", vetorY[i]);
	}
	
	for(i=0; i<5; i++){
        vetorZ[i] = vetorX[i];
    }
    for (j=0; j<8; j++){
        vetorZ[j+5] = vetorY[j];
    }
        
    printf("\n\n VETOR 3: ");
    for(i = 0; i < 13; i++){
    	printf("%d ", vetorZ[i]);
	}
        
    printf("\n\n\n 			FIM!!!");
		
    return 0;
}

 

  • Amei 1
Postado

@alexandrecasa Vai precisar incluir a time.h se quiser usar time(), e também a stdlib.h para usar srand() e rand().

 

1 hora atrás, alexandrecasa disse:

gere 15 números inteiros aleatórios

Então podemos dizer que o intervalo é de INT_MIN até INT_MAX, já que não foi especificado. Se você fizer:

// rand() % ((maior - menor) + 1) + menor
rand() % ((INT_MAX - INT_MIN) + 1) + INT_MIN;

vai receber uma mensagem de erro: INT_MAX - INT_MIN obviamente causa overflow, o resultado é UINT_MAX.

Em vez disso, poderia usar o seguinte:

int randint(void)
{
    // Assumindo que srand() ja foi chamada
    return ((rand() % 2) ? (rand()) : ((-rand()) - 1));
}

Se rand() % 2 for 0 e rand() retornar por exemplo RAND_MAX, randint() retorna INT_MIN, ou quem sabe SHRT_MIN, vai depender já que RAND_MAX ≤ INT_MAX.

De qualquer forma, isso tende a te dar valores grandes, e baseado no exemplo do enunciado:

1 hora atrás, alexandrecasa disse:

Exemplo:
Vetor 1: 2 5 0 9 3
Vetor 2: 7 0 9 9 1 8 2 3
Vetor 3: 2 5 0 9 3 7 0 9 9 1 8 2 3

Acho que você poderia gerar valores de 0 a 9 mesmo :D

Como eu havia dito:

rand() % ((maior - menor) + 1) + menor

Então seria:

rand() % 10;

Veja:

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

int main(void)
{
    int i, j;
    int vetorX[5], vetorY[8], vetorZ[13];

    srand(time(NULL));

    printf("Vetor 1:");
    for(i = 0; i < 5; i++)
    {
        vetorX[i] = rand() % 10;
        printf(" %d", vetorX[i]);
    }

    printf("\nVetor 2:");
    for(i = 0; i < 8; i++)
    {
        vetorY[i] = rand() % 10;
        printf(" %d", vetorY[i]);
    }

    for(i = 0; i < 5; i++)
        vetorZ[i] = vetorX[i];
    for(j = 0; j < 8; j++)
        vetorZ[j+5] = vetorY[j];

    printf("\nVetor 3:");
    for(i = 0; i < 13; i++)
        printf(" %d", vetorZ[i]);

    return 0;
}

E na saída:

image.png.b567c02e1cc9ccb4e334c91bd309c3a2.png

É interessante sempre formatar como no exemplo do enunciado :D

  • Curtir 2
Postado
8 horas atrás, Lucca Rodrigues disse:

Vai precisar incluir a time.h se quiser usar time(), e também a stdlib.h para usar srand() e rand().

 

Há (ou não há) uma razão objetiva para usar srand(). Uma é reiniciar o gerador para um determinado número aleatório. Outra é exatamente o contrário: forçar uma semente conhecida para poder regerar sequências para testar um programa ou um modelo. E em desenvolvimento a segunda é talvez mais importante. Em produção a primeira, em geral.

 

Mas muitas vezes é irrelevante, como aqui. Não precisa de srand(). E se vai usar não precisa incluir time.h só para isso: use um número qualquer.

 

10 horas atrás, alexandrecasa disse:
 int vetorX[5], vetorY[8], vetorZ[13];

 

Talvez não precise repetir vetor toda hora...

 

8 horas atrás, Lucca Rodrigues disse:

Então podemos dizer que o intervalo é de INT_MIN até INT_MAX, já que não foi especificado. Se você fizer:

// rand() % ((maior - menor) + 1) + menor
rand() % ((INT_MAX - INT_MIN) + 1) + INT_MIN;

 

8 horas atrás, Lucca Rodrigues disse:
int randint(void)
{
    // Assumindo que srand() ja foi chamada
    return ((rand() % 2) ? (rand()) : ((-rand()) - 1));
}

 

Talvez estejam complicando demais as coisas. Trata-se de um programa em C, a linguagem que foi escrita para manipular essas coisas com facilidade.

 

Considere esse programa:
 

#include <stdio.h>
int main(void)
{
    int x = 0x8765;
    printf("x = %d ou 0x%X (hex)\n", x, x );

    x <<= 16;
    printf("\n(x shift left 16 bits) x = %d ou 0x%X (hex)\n", x, x );

    int y = 0x3210;
    printf("\ny = %d ou 0x%X (hex)\n", y, y );

    int z = x | y;
    printf("\nz = x|y = %d ou 0x%X (hex)\n", z, z );

    return 0;
}

 

E veja o que ele mostra:
 

x = 34661 ou 0x8765 (hex)

(x shift left 16 bits) x = -2023424000 ou 0x87650000 (hex)

y = 12816 ou 0x3210 (hex)

z = x|y = -2023411184 ou 0x87653210 (hex)

 

Em muitas plataformas RAND_MAX é short int, 32767. Mas é sempre um valor positivo. Se quer um valor aleatório que cubra todo o espectro, de INT_MIN a INT_MAX inclusive, ou mesmo um long long int com 8 bytes, pode usar rand() para cada um byte ou dois e depois usar OR, o popular '|'.

 

Veja no programa acima: x sendo 0x8765 e y sendo 0x3210 x|y vale 0x87653210, x<<16 vale 0x87650000. e a conta fecha. É mais simples escrever assim

 

8 horas atrás, Lucca Rodrigues disse:

Se rand() % 2 for 0 e rand() retornar por exemplo RAND_MAX, randint() retorna INT_MIN, ou quem sabe SHRT_MIN, vai depender já que RAND_MAX ≤ INT_MAX.

De qualquer forma, isso tende a te dar valores grandes

 

Não exatamente. Não é que "tende a dar valores grandes". Se são aleatórios e tem 2 bytes por exemplo, o primeiro byte vai ser 0 em média 1 a cada 256 chamadas a rand() :). É o que se espera.

 

 

 

  • Curtir 2
  • Obrigado 1

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