Ir ao conteúdo

Posts recomendados

Postado

Desenvolva um programa em C que gere dois vetores (A e B de 200 elementos cada. Cada elemento dos vetores deve possuir um número aleatório variando entre 1000 e 9999. O programa deverá gerar um novo vetor que será composto pelo maior elemento da posição i de A ou B. Exemplo:

a[0] = 1500 b[0] = 1850 c[0] = 1850

a[1] = 5000 b[1] = 3215 c[1] = 5000

Imprima o vetor gerado.

eu não estou conseguindo fazer o vetor C  com dois vetores que eu já tenho

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


void main()
{
    int veta[200], vetb[200], vetc[200];
 
    srand(time(NULL)); 
    for (int i = 0; i < 200; i++) {
        veta[i] = 1000 + rand()%(9999 - 1000 + 1);  
    }
    printf("Vetor A:");
    for (int i = 0; i < 200; i++) {
        printf("[%d]", veta[i]);
    
    srand(time(NULL)); 
    for (int i = 0; i < 200; i++) {
        vetb[i] = 1000 + rand()%(9999 - 1000 + 1);  
    }
    printf("\nVetor B:");
    for (int i = 0; i < 200; i++) {
        printf("[%d]", vetb[i]);
    }
    
    }
}

 

  • Obrigado 1
Postado

@Ana Clara Alves Nunes   esse vetor c poderia ser assim  :

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#define h GetStdHandle(STD_OUTPUT_HANDLE)
#define textcolor_2(l,f) SetConsoleTextAttribute(h,l+(f<<4));/* não aceita variáveis , apenas números fixos */
#define cls; system("cls");
#include <time.h>
void gotoxy_2(int x, int y){/*imprimir na linha e coluna desejada */
  COORD c;
  c.X = x;
  c.Y = y;
  SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);/* aqui aceita variáveis normal */
}
int main(){
    int veta[200], vetb[200], 
        vetc[200],i,l=1,c=0;
 
    srand(time(NULL)); /* basta uma vez no código todo */
    for(i = 0; i < 200; i++)/* apenas huma linha não precisa das chaves */
        veta[i] = rand()%9000 + 1000;  /* gera números de 0 até 8999 e soma 1000 a eles */
    
    printf("Vetor A:");
    for(i = 0; i < 200; i++)/* apenas huma linha não precisa das chaves */
        printf("[%d]", veta[i]);
    
    for(i = 0; i < 200; i++)/* apenas huma linha não precisa das chaves */
        vetb[i] = rand()%9000 + 1000;  /* gera números de 0 até 8999 e soma 1000 a eles */
    
    printf("\nVetor B:");
    for(i = 0; i < 200; i++)/* apenas huma linha não precisa das chaves */
        printf("[%d]", vetb[i]);
        
    for(i=0; i<200; i++)        /* apenas huma linha não precisa das chaves */
        if( veta[i] < vetb[i])  /* apenas huma linha não precisa das chaves */
            vetc[i] = vetb[i];
        else                    /* apenas huma linha não precisa das chaves */
            vetc[i] = veta[i];
    printf("\n\n   imprimiu os vetores A e B     Tecle . . . !");
    getch();                    /* espera teclar algo e prossegue sem enter */
    cls;                        /* Uma Macro da linguagem c , lá no define  */
    textcolor_2(14,0);          /* colorir umas letras e o fundos da tela   */
    printf("      Aqui Os N%cmeros do vetor c",163);
    textcolor_2(11,0);
    for(i=0;i<200;i++){
        gotoxy_2(c,l);
        printf("%4d",vetc[i]);
        l++;
        if(l>23){
            l=1;
            c+=7;
        }
    }
    textcolor_2(14,0);
    printf("  Tecle ! "         );
    while( ! kbhit()            ){
        printf("|\b" );Sleep(150);        
        printf("/\b" );Sleep(150);
        if(kbhit())         break;       
        printf("-\b" );Sleep(150);
        printf("\\\b");Sleep(300);
        if(kbhit())         break;        
    }
    getch();
    return 0;    
}

 

  • Obrigado 2
  • 4 anos depois...
Postado

Simplesmente mais um exercício  sobre vetores iniciantes das matrizes.

Outro exemplo,

 

Em 01/12/2019 às 15:56, Ana Clara Alves Nunes disse:

Desenvolva um programa em C que gere dois vetores (A e B de 200 elementos cada. Cada elemento dos vetores deve possuir um número aleatório variando entre 1000 e 9999.

/* declarar, definir matriz como números pseudoaleatórios */
  double snumero[2][100];
  size_t znumeroi= sizeof snumero/ sizeof(snumero[0]);
  size_t znumeroj= sizeof snumero[0]/ sizeof(snumero[0][0]);
  for (size_t i= 0 ; znumeroi>i ; ++i)
  for (size_t j= 0 ; znumeroj>j ; ++j) {
      snumero[i][j]= (double) 1000+ rand ()% (9999- 1000)+ 1;
}
Em 01/12/2019 às 15:56, Ana Clara Alves Nunes disse:

O programa deverá gerar um novo vetor que será composto pelo maior elemento da posição i de A ou B.

/* declarar, definir os maiorais */
  double smaior[znumeroj];
  for (size_t j= 0 ; znumeroj>j ; ++j)
    smaior[j]= (snumero[0][j]>snumero[1][j])?snumero[0][j]
      :snumero[1][j];
Em 01/12/2019 às 15:56, Ana Clara Alves Nunes disse:

Imprima o vetor gerado

/* produzir os maiorais no simulador */
  int sep= 0;
  size_t m= 0;
  while (znumeroj>m) {
    printf ("%c%.f",sep,smaior[m]);
    sep= ((++m)% 10UL)?' ':'\n';
}

c'11 - gcc'11.4

  • Curtir 1
Postado

 

 

4 anos e 5 meses depois, espero que tenha concluído seu programa. @Ana Clara Alves Nunes

 

Em 01/12/2019 às 15:56, Ana Clara Alves Nunes disse:

eu não estou conseguindo fazer o vetor C  com dois vetores que eu já tenho

 

Com o programa mostrado dá pra entender que não tenha consiguido. A única referência ao tal vetor C está nesta linha:

 

       int veta[200], vetb[200], vetc[200];

 

Sobre o programa postado e uma razão para outro exemplo

 
Mesmo o mínimo código que postou tem muitos problemas (comuns de ver aqui) e  então pode servir, mesmo depois de tanto tempo, ter MAIS UM exemplo de como tratar uma questão dessas.
 
O enunciado é um pouco ingênuo.

 

Precisa mostrar os dois vetores originais ou nem você vai saber se o programa funcionou. 

 

Claro que gerar os dois vetores é fazer duas vezes a mesma coisa. E mostrar os 3 vetores é fazer 3 vezes a mesma coisa. 

E uma vez gerado o segundo vetor o terceiro já está definido.

 

C sem funções de nada serve.

 

Desde a primeira aula esse conceito devia ser explicado. Se vai fazer várias vezes a mesma coisa escreva uma função --- e teste em separado. A vida fica muito mais simples:

  • mostrar um vetor, uma função.
  • preencher o vetor, uma funçào,
  • lançar uma espaçonave, uma função
void main()

 

isso está errado, main retorna um int. Não há razão para mudar isso. E se não vai usar os argumentos declare

 

	int main(void)

 

	int veta[200], vetb[200], vetc[200];


declare uma variável por linha. É grátis. Nem todos seus programas vão ter 20 linhas e logo vai descobrir que é um inferno ficar procurando declarações.

  

    srand(time(NULL)); 
    for (int i = 0; i < 200; i++) {
        veta[i] = 1000 + rand()%(9999 - 1000 + 1);  
    }
    printf("Vetor A:");
    for (int i = 0; i < 200; i++) {
        printf("[%d]", veta[i]);

 

  Isso está duplicado no programa e então são 4 loops quando podia ser 1 só.


  E não precisa --- não deve --- chamar srand() mais que uma vez no início do programa. E provavelmente nesses casos também não deve usar time() para iniciar rand(): use um valor constante e conhecido.

 

Está testando um programa --- que na prática nem fez ainda --- e é melhor poder usar os mesmos valores.

 

@devair1010 

 

    srand(time(NULL)); /* basta uma vez no código todo */
    for(i = 0; i < 200; i++)/* apenas huma linha não precisa das chaves */
        veta[i] = rand()%9000 + 1000;  /* gera números de 0 até 8999 e soma 1000 a eles */
    
    printf("Vetor A:");
    for(i = 0; i < 200; i++)/* apenas huma linha não precisa das chaves */
        printf("[%d]", veta[i]);
    
    for(i = 0; i < 200; i++)/* apenas huma linha não precisa das chaves */
        vetb[i] = rand()%9000 + 1000;  /* gera números de 0 até 8999 e soma 1000 a eles */
    
    printf("\nVetor B:");
    for(i = 0; i < 200; i++)/* apenas huma linha não precisa das chaves */
        printf("[%d]", vetb[i]);
        
    for(i=0; i<200; i++)        /* apenas huma linha não precisa das chaves */
        if( veta[i] < vetb[i])  /* apenas huma linha não precisa das chaves */
            vetc[i] = vetb[i];
        else                    /* apenas huma linha não precisa das chaves */
            vetc[i] = veta[i];
    printf("\n\n   imprimiu os vetores A e B     Tecle . . . !");

 

Notou que é tudo igual? Só muda o nome do vetor e o texto do printf
 
@Ansi C

 

/* declarar, definir matriz como números pseudoaleatórios */
  double snumero[2][100];
  size_t znumeroi= sizeof snumero/ sizeof(snumero[0]);
  size_t znumeroj= sizeof snumero[0]/ sizeof(snumero[0][0]);
  for (size_t i= 0 ; znumeroi>i ; ++i)
  for (size_t j= 0 ; znumeroj>j ; ++j) {
      snumero[i][j]= (double) 1000+ rand ()% (9999- 1000)+ 1;
}


Considere que isso pode ter tem pouco sentido:

  • Não há razão para usar double se o enunciado é claro sobre valores inteiros.
  • E rand() já retorna valores inteiros.
  • E o uso de loops aninhados para um caso em que o primeiro índice é constante é no mínimo curioso. i vale 0 ou 1.
  • Essas divisöes e chamas a sizeof() nada acrescentam. Só fica mais lerdo e difícil de ler.
  • E talvez não precisasse repetir numero toda hora: é fato conhecido que todo double é um n;úmero.

Prefira o simples, como está no enunciado:

 

Esse trecho por exemplo já define e preenche os vetores, incluído o último, em um único loop:

 

    int       a[200] = {0};
    int       b[200] = {0};
    int       c[200] = {0};
    const int limite = 9999 - 1000 + 1;
    srand(240501);
    for (size_t j = 0; j < 200; ++j)
    {
        a[j] = 1000 + rand() % limite;
        b[j] = 1000 + rand() % limite;
        if (a[j] > b[j])
            c[j] = a[j];
        else
            c[j] = b[j];
    };


Evite deixar para o compilador a missão de evitar uma conta em toda iteração do loop. Calcule `9999 - 1000 + 1` fora do loop. Deixe claro que pensou nisso, mesmo sendo aqui apenas constantes.

 

Considere uma função assim:

 

    int mostra(int M[], size_t tam, const char* msg)

 

E pode acrescentar

 

    mostra(a, 25, "\nVetor A:\n");
    mostra(b, 25, "\nVetor B:\n");
    mostra(c, 25, "\nVetor C com os maiores valores:\n");

 

ao código acima, e ver na tela:

```none


Vetor A:

5749  2787  6645  4752  9809  3318  8100  6954  5900  4974
1251  4423  7854  5606  6799  9437  5318  1956  3536  4308
1974  5949  2194  7595  2693

Vetor B:

9220  5437  3498  8460  5638  5531  3558  9801  2851  5271
6468  7831  2700  7936  3017  2552  5447  5057  6732  6727
1509  1192  5425  6477  1204

Vetor C com os maiores valores:

9220  5437  6645  8460  9809  5531  8100  9801  5900  5271
6468  7831  7854  7936  6799  9437  5447  5057  6732  6727
1974  5949  5425  7595  2693

 

sem repetir as coisas.    

 

Note que o tamanho está limitado a 25 no exemplo porque não leva a nada mostrar centenas de números aqui.

 

Esse exemplo completo

 

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

int mostra(int M[], size_t tam, const char* msg);
int main(void)
{
    int       a[200] = {0};
    int       b[200] = {0};
    int       c[200] = {0};
    const int limite = 9999 - 1000 + 1;
    srand(240501);
    for (size_t j = 0; j < 200; ++j)
    {
        a[j] = 1000 + rand() % limite;
        b[j] = 1000 + rand() % limite;
        if (a[j] > b[j])
            c[j] = a[j];
        else
            c[j] = b[j];
    };
    mostra(a, 25, "\nVetor A:\n\n");
    mostra(b, 25, "\nVetor B:\n\n");
    mostra(c, 25, "\nVetor C com os maiores valores:\n\n");
    return 0;
}

int mostra(int M[], size_t tam, const char* msg)
{
    printf("\n");
    if (msg != NULL) printf("%s", msg);
    for (size_t i = 0, c = 0, nc = 10; i < tam; i += 1)
    {
        if (++c < nc)
            printf("%4i  ", M[i]);
        else
            printf("%4i\n", M[i]),c = 0;
    }
    return 0;
}

 

A saída do exemplo está acima...

 

Sobre esse trecho, @Ansi C

 

image.png.0c4ee1bd13f1a23400b2445561102eca.png

 

Construções assim sugerem que o código seja parte do código postado pelo usuário citado na primeira parte (logo acima) e só levam a confusão.

 

Ao reviver um tópico de 4 anos atrás talvez fosse mais produtivo para os leitores do forum fazer o simples e útil postar algum código compilável, completo

 

    int   sep = 0;
    size_t m   = 0;
    double smaior[znumeroj] = {0};
    while (znumeroj > m)
    {
        printf("%c%.f", sep, smaior[m]);
        sep = ((++m) % 10UL) ? ' ' : '\n';
    }

 

Sobre esse trecho, entenda que isso é apenas um for, onde m é o valor inicial, znumero é o limite e ++m é o incremento.

 

E o printf() usando uma expressão ternária para alimentar um caractere em um %c tem o único efeito de pular de linha a cada 10 números.

 

Isso não deve gerar boa nota, não pega bem em uma entrevista de emprego, não fica bem em um estágio ou emprego, e deve ir contra qualquer convenção de codificação de empresa que eu já tenha visto, então não passaria pela revisão de jeito nenhum, em uma empresa grande.

 

Note também, que na literatura e nos exemplos em geral quando se compara uma variável com um limite em um loop o limite vem depois. Pode ver isso em qualquer site de referência ou livro. como esse exemplo em aqui em Tutorials Point ou em aqui em FreeCodeCamp

 

Pode ser divertido fazer tudo ao contrário do comum, mas isso não costuma dar certo em programação de computadores.

 

Esse trecho

 

#define DIM_V 20
double M[DIM_V] = {0};
    // mostra o vetor, 10 numeros por linha
    for (size_t i = 0, c = 0, nc = 10; i < DIM_V; i += 1)
    {
        if (++c < nc)
            printf("%.f ", M[i]);
        else
            printf("%.f\n", M[i]), c = 0;
    }


Tem o mesmo efeito, mudando de linha a cada 10 valores. Só que roda 10x mais rápido --- chamar % toda hora é lento e reavaliar sep toda vez dentro do loop é desnecessário --- e é simples de ler e entender

 

Teste nesse programa:

 

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
#define znumeroj 20
    int   sep = 0;
    size_t m   = 0;
    double smaior[znumeroj] = {0};
    while (znumeroj > m)
    {
        printf("%c%.f", sep, smaior[m]);
        sep = ((++m) % 10UL) ? ' ' : '\n';
    }
    printf("\n\noutro\n\n");

#define DIM_V 20
double M[DIM_V] = {0};
    for (size_t i = 0, c = 0, nc = 10; i < DIM_V; i += 1)
    {
        if (++c < nc)
            printf("%.f ", M[i]);
        else
            printf("%.f\n", M[i]), c = 0;
    }
    return 0;
}


 

  • Obrigado 1
  • Haha 1
Postado
57 minutos atrás, arfneto disse:

Ao reviver um tópico de 4 anos atrás talvez fosse mais produtivo para os leitores do forum fazer o simples e útil postar algum código compilável, completo

 

Sou leitor e discordo disso que você tão amargamente escreve.

 

Entretanto, pelo menos, essa minha postagem, que foi toda desqualificada, feita de fezes, atraiu você que me proporciona diversão.

 

Por mim, tudfo bem.

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