Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Mahaus

C Preencher matriz 6x6 com números aleatórios de 0 a 100.

Recommended Posts

Então pessoal,meu professor passou o seguinte exercício:

Desenvolva um programa que atribua em uma matriz quadrada de dimensão 6 valores aleatórios entre 0 e 100. Depois exiba os valores das células da matriz e mostre em cada final de linha a soma dos valores da linha e no final de cada coluna a soma dos valores de cada coluna. Os valores entre as colunas devem ser exibidos separados por sinal de | (pipeline).

Eu n consegui entender essa parte: ''Depois exiba os valores das células da matriz e mostre em cada final de linha a soma dos valores da linha e no final de cada coluna a soma dos valores de cada coluna. Os valores entre as colunas devem ser exibidos separados por sinal de | (pipeline).''

Ficarei grato pela ajuda, o que eu consegui fazer até agora foi isso.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main ()
{
	int mat[6][6],lin,col,x;
	
	for (lin=0;lin<6;lin++)
	{
		for (col=0;col<6;col++)
		{
			mat[lin][col] = rand() % 100;
			printf ("mat[%d][%d] = %d \n",lin,col,mat[lin][col]);
		}
	}
	
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mahaus Olá. Segue essa parte do código q gera os números aleatórios. No enunciado não consta q os números 0 e 100 estão incluídos. Diz q no intervalo de 0 a 100.

Chegou perto nessa parte, só na hora de imprimir não saiu

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

int main() {

    int mat[6][6], i, j, numAleatorios;

    srand(time(NULL));

    // gera os números aleatórios e imprime a matriz
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 6; j++) {
            numAleatorios = (rand() % 99) + 1;
            mat[i][j] = numAleatorios;
            printf("%3d | ", mat[i][j]); // %3d é para usar 3 casas para mostrar o número
        }
        printf("\n");
    }

    printf("\n");
  
    return 0;
}

Só essa parte vou passar. Tem agora a questão da soma das linhas e soma das colunas

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 21/06/2018 às 22:57, giu_d disse:

@Mahaus Olá. Segue essa parte do código q gera os números aleatórios. No enunciado não consta q os números 0 e 100 estão incluídos. Diz q no intervalo de 0 a 100.

Chegou perto nessa parte, só na hora de imprimir não saiu


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

int main() {

    int mat[6][6], i, j, numAleatorios;

    srand(time(NULL));

    // gera os números aleatórios e imprime a matriz
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 6; j++) {
            numAleatorios = (rand() % 99) + 1;
            mat[i][j] = numAleatorios;
            printf("%3d | ", mat[i][j]); // %3d é para usar 3 casas para mostrar o número
        }
        printf("\n");
    }

    printf("\n");
  
    return 0;
}

Só essa parte vou passar. Tem agora a questão da soma das linhas e soma das colunas

obrigado pela ajuda, estou quebrando a cabeça aqui pra tentar resolver. Eu consegui somar linhas,porém apenas o total de todas, n o total de uma por uma, segue o q eu fiz

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

int main() {

    int mat[6][6], i, j, numAleatorios;
    int soma,somal[6],somac[6];

    srand(time(NULL));

    // gera os números aleatórios e imprime a matriz
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 6; j++) {
            numAleatorios = (rand() % 99) + 1;
            mat[i][j] = numAleatorios;
            printf("%3d | ", mat[i][j]); // %3d é para usar 3 casas para mostrar o número
        }
        printf("\n");
    }

    printf("\n");
    
    // soma das linhas
	for (i=0;i<6;i++)
	{
		for (j=0;j<6;j++)
		{
			soma = soma+mat[i][j];
		}
		
		somal[i] = soma;
		
	}
	
	printf("Soma das linhas: %d \n", soma);
  
    return 0;
}

 

Editado por Simon Viegas
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mahaus Para mostrar onde deve aparecer a soma das linhas coloquei SL, e para mostrar onde deve aparecer a soma das colunas SC:

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

int main() {

    int mat[6][6], i, j, numAleatorios;

    srand(time(NULL));


    // gera os números aleatórios e imprime a matriz
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 6; j++) {
            numAleatorios = (rand() % 99) + 1;
            mat[i][j] = numAleatorios;
            printf("%2d | ", mat[i][j]);
        }
        printf("SL\n");
    }

    for (i = 0; i < 6; i++) {
        printf("SC   ");
    }

    printf("\n");

    return 0;
}

Execute esse código e vai entender

Pelo q entendi é isso. A questão agora é fazer as somas rs... 

Tô aqui pensando em q lógica usar :)

Editado por giu_d
corrigir comentário
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mahaus    para gerar números aleatórios precisa usar a biblioteca time.h , pois senão os números sorteados serão sempre os mesmos ,  e use também a função   srand(time(NULL))   e para imprimir a soma de cada linha coloque o somatório dentro do loop col e logo abaixo desse loop imprima o resultado ,  então  essa parte ficaria assim  :

#include <time.h>
 dentro da main
srand(time(NULL));
for (lin=0;lin<6;lin++){
    somatorio_linha=0;
    for (col=0;col<6;col++){
        mat[lin][col] = rand() % 100;
        somatorio_linha += mat[lin][col];
        printf ("mat[%d][%d] = %d \n",lin,col,mat[lin][col]);
    }
    printf("\nsoma da linha %d = %d\n\n",lin,somatorio_linha);
}

 

Editado por devair1010
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Já matou a 'charada' das linhas! :thumbsup:

adicionado 16 minutos depois

@Mahaus Se você já fez um exercício sobre matriz transposta vai saber agora somar as colunas. 

for (j = 0; j < 6; j++) {
    somatorio_col = 0;
    for (i = 0; i < 6; i++) {
        somatorio_col += mat[i][j];
    }
    printf("%3d   ", somatorio_col);
}

 

Cara, Eu me divirto com isso! :lol:

 

Para mostrar o resultado final eu faria assim:

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

int main() {

    int mat[6][6], i, j, numAleatorios;
    int somatorio_linha = 0;
    int somatorio_col = 0;

    srand(time(NULL));


    // gera os números aleatórios e imprime a matriz
    for (i = 0; i < 6; i++) {
        somatorio_linha = 0;
        for (j = 0; j < 6; j++) {
            numAleatorios = (rand() % 99) + 1;
            mat[i][j] = numAleatorios;
            somatorio_linha += mat[i][j];
            printf("%3d | ", mat[i][j]);
        }
        printf("  %3d\n", somatorio_linha);
    }

    printf("\n");

    for (j = 0; j < 6; j++) {
        somatorio_col = 0;
        for (i = 0; i < 6; i++) {
            somatorio_col += mat[i][j];
        }
        printf("%3d   ", somatorio_col);
    }

    printf("\n");

    return 0;
}

Estou considerando q os números devem ser de 1 a 99

 
Editado por giu_d
corrigir comentário
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Valeu por essa! Pela sua resposta das linhas cheguei na minha. 

Abraço!

adicionado 5 minutos depois

A dúvida é a seguinte: No enunciado diz assim:

3 horas atrás, Mahaus disse:

valores aleatórios entre 0 e 100

Não diz de 0 a 100 e sim entre 0 e 100 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
12 horas atrás, giu_d disse:

@devair1010 Já matou a 'charada' das linhas! :thumbsup:

adicionado 16 minutos depois

@Mahaus Se você já fez um exercício sobre matriz transposta vai saber agora somar as colunas. 


for (j = 0; j < 6; j++) {
    somatorio_col = 0;
    for (i = 0; i < 6; i++) {
        somatorio_col += mat[i][j];
    }
    printf("%3d   ", somatorio_col);
}

 

Cara, Eu me divirto com isso! :lol:

 

Para mostrar o resultado final eu faria assim:


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

int main() {

    int mat[6][6], i, j, numAleatorios;
    int somatorio_linha = 0;
    int somatorio_col = 0;

    srand(time(NULL));


    // gera os números aleatórios e imprime a matriz
    for (i = 0; i < 6; i++) {
        somatorio_linha = 0;
        for (j = 0; j < 6; j++) {
            numAleatorios = (rand() % 99) + 1;
            mat[i][j] = numAleatorios;
            somatorio_linha += mat[i][j];
            printf("%3d | ", mat[i][j]);
        }
        printf("  %3d\n", somatorio_linha);
    }

    printf("\n");

    for (j = 0; j < 6; j++) {
        somatorio_col = 0;
        for (i = 0; i < 6; i++) {
            somatorio_col += mat[i][j];
        }
        printf("%3d   ", somatorio_col);
    }

    printf("\n");

    return 0;
}

Estou considerando q os números devem ser de 1 a 99

 

Nossa cara, as vezes acho q n sou capaz de conseguir terminar essa faculdade apesar de gostar do que faço, parece que vocês tem tanta facilidade,muito obrigado pela ajuda

adicionado 20 minutos depois.
adicionado 36 minutos depois

@giu_d Poderia me explicar só mais uma coisa, por exemplo para gerar números de 0 a 100 é usado rand()%100, como %99+1 gera números  de 1 a 99? e como eu faria para gerar números entre 50 e 100 ou 2 e 512? obrigado pela atençao novamente.

Editado por Mahaus
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mahaus

1 hora atrás, Mahaus disse:

para gerar números de 0 a 100 é usado rand()%100, como %99+1 gera números  de 1 a 99?

 Olá. Quando eu faço algo como rand() % 10, por exemplo, vão ser gerados números aleatórios de 0 a 9 ( 0, 1, 2, 3... 9 ) e não de 0 a 10, Ou seja, o número mínimo é 0 e o máxima é 9. Deu para entender?

Logo, ao fazer rand() % 99 vão ser gerados números de 0 a 98, daí somando com 1 temos os números de 1 a 99.

Se ficou alguma dúvida pergunte, ok?

1 hora atrás, Mahaus disse:

s vezes acho q n sou capaz de conseguir terminar essa faculdade apesar de gostar do que faço, parece que vocês tem tanta facilidad

Não se incomode com isso e não se preocupe com isso. Como também nunca pense algo como "as vezes acho q não sou capaz"!

A boa notícia que tenho para te dar é que, com o passar do tempo, a medida q você vai estudando a respeito de determinada linguagem de programação, as coisas vão "clareando". Ou seja: Aquele código q até a pouco tempo parecia um "mostro" passa a ser algo simples de entender. O segredo mesmo é praticar muito! Se você não praticar não vai mesmo aprender.

É como eu ler 5, 10, 50 livros q ensinam como andar de bicicleta. Mas se eu não subir em uma e tentar andar nunca vou aprender.

Quanto a 'levar tombos' é normal, mas é assim q aprendo e aprendi a andar d bicicleta

Outro segredo, além de praticar muito, é aprender a fazer o "teste de mesa". Se você dominar essa técnica maravilha!

Segue abaixo um link onde é ensinado como fazer um teste de mesa. No vídeo é bem explicado a respeito disso e dominar essa técnica e fazer uso dela no seu dia-a-dia é importantíssimo para seu aprendizado. Segue o link: (não deixe de ver o vídeo)

http://www.softblue.com.br/blog/como-fazer-teste-de-mesa

Se ficar alguma dúvida pode perguntar.

Abraço!

 

Editado por giu_d
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d e se acaso eu quizesse gerar numero que nao comecem do 0 e 1,por exemplo que começasse do 3 ou 7 ou 50,qualquer outro numero que seja,como eu definiria isso? vou ver o video sim,pode deixar

Editado por Mahaus
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mahaus Boa pergunta essa! 

Vou passar um método q é bastante simples e que você pode usar em seus códigos. Esse método gera números aleatórios de acordo com o intervalo que você queira.

Se quer números de 5 a 10. Chama o método e passa os valores 5 e 10 para o método. Os números gerados serão 5, 6, 7, 8, 9 e 10.

Dá uma olhada no uso desse método:

#include <stdio.h>
#include <time.h> // para a função time(NULL)
#include <stdlib.h> // para as funções srand e rand e a macro NULL

int gerarInt(int min, int max) {
    int intervalo = (max - min + 1);
    int n = (rand() % intervalo) + min;
    return n;
}

int main() {

    srand(time(NULL));
    int i;

    for (i = 0; i < 20; i++) {
        int x = gerarInt(10, 20); // números de 10 a 20 (10, 11, 12, ... 20)
        printf("%d ", x);
    }

    return 0;
}

Procure entender a lógica dessa função acima gerarInt.

Suponha q os números sejam esses mesmos: 10 e 20.

Na primeira linha da função equivale a isso.

intervalo = (20 - 10 + 1) ->  resultado: 11. intervalo vale 11

Na linha seguinte é feito isso:

rand() % intervalo. Seria isso: rand() % 11. Aqui vai ser gerado um número de 0 a 10. Aí esse número é somado com o valor mínimo, que é 10.

Seria isso: 0 + 10  ->  101 + 10  ->  11 .... 10 + 10 -> 20. Ou seja, se o número 'sorteado' for o 5, somado com 10, que é o número mínimo, o resultado seria 15

É uma lógica bastante simples. É importante entender a lógica para não ter que ficar "decorando" código. Algo que não é nada recomendável fazer

 

Ou, se passar a mesma função de forma reduzida:

int gerarInt(int min, int max) {
    return (rand() % (max - min + 1)) + min;
}

Vê se ajuda isso. Qualquer coisa é só perguntar!

Gosto de pessoas q perguntam mesmo. Isso demonstra q a mesma tem vontade de aprender!

Editado por giu_d
Correção no código
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 22/06/2018 às 15:48, giu_d disse:

@Mahaus Boa pergunta essa! 

Vou passar um método q é bastante simples e que você pode usar em seus códigos. Esse método gera números aleatórios de acordo com o intervalo que você queira.

Se quer números de 5 a 10. Chama o método e passa os valores 5 e 10 para o método. Os números gerados serão 5, 6, 7, 8, 9 e 10.

Dá uma olhada no uso desse método:


#include <stdio.h>
#include <time.h> // para a função time(NULL)
#include <stdlib.h> // para as funções srand e rand e a macro NULL

int gerarInt(int min, int max) {
    int intervalo = (max - min + 1);
    int n = (rand() % intervalo) + min;
    return n;
}

int main() {

    srand(time(NULL));
    int i;

    for (i = 0; i < 20; i++) {
        int x = gerarInt(10, 20); // números de 10 a 20 (10, 11, 12, ... 20)
        printf("%d ", x);
    }

    return 0;
}

Procure entender a lógica dessa função acima gerarInt.

Suponha q os números sejam esses mesmos: 10 e 20.

Na primeira linha da função equivale a isso.

intervalo = (20 - 10 + 1) ->  resultado: 11. intervalo vale 11

Na linha seguinte é feito isso:

rand() % intervalo. Seria isso: rand() % 11. Aqui vai ser gerado um número de 0 a 10. Aí esse número é somado com o valor mínimo, que é 10.

Seria isso: 0 + 10  ->  101 + 10  ->  11 .... 10 + 10 -> 20. Ou seja, se o número 'sorteado' for o 5, somado com 10, que é o número mínimo, o resultado seria 15

É uma lógica bastante simples. É importante entender a lógica para não ter que ficar "decorando" código. Algo que não é nada recomendável fazer

 

Ou, se passar a mesma função de forma reduzida:


int gerarInt(int min, int max) {
    return (rand() % (max - min + 1)) + min;
}

Vê se ajuda isso. Qualquer coisa é só perguntar!

Gosto de pessoas q perguntam mesmo. Isso demonstra q a mesma tem vontade de aprender!

@giu_dCara desculpa demora pra responder, me ajudou pra caramba essa função que você fez, estou conseguindo compreender a lógica com sua explicação, valeu mesmo, queria fazer outra pergunta sobre um outro problema também em C,posso fazer aqui mesmo ou devo criar outro tópico?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mahaus Creio q pode fazer aqui mesmo, pois esse tópico foi você q criou 

Compartilhar este post


Link para o post
Compartilhar em outros sites
18 horas atrás, giu_d disse:

@Mahaus Creio q pode fazer aqui mesmo, pois esse tópico foi você q criou 

@giu_d Tenho que fazer o seguinte exercício.

Escreva um programa em C que leia os valores de um vetor com 10 posições e exiba os valores em ordem crescente apresentando o índice correspondente do vetor ao lado da cada valor da lista ordenada. 

Eu já consegui ponhar em ordem crescente, porém os numeros digitados pelo usuario,agora falta ordenar os vetores, tipo vamos supor que vet[0] = 5, vet[1] = 3 e vet[2] = 8, eu teria que ponhar em ordem crescente mais carregar o indice do vetor junto, iria ficar assim no caso: vet[1] = 3, vet[0] = 5, vet[2] = 8, pelo que eu entendi, porém to perdido nessa parte. No exercicio fala pra usar ordenação de valores.

#include <stdio.h>
#include <conio.h>
#include <locale.h>
int main ()
{
	setlocale (LC_ALL,"Portuguese");
	int vet[10],i,j,a;
	
	printf ("Entre com 10 números inteiros para carregar o vetor:\n");
	for (i=0;i<10;i++)
	{
		scanf ("%d",&vet[i]);
	}
	
	for (i=0;i<10;i++)
	{
		for (j = i + 1; j < 10; j++)
		{
			if (vet[i] > vet[j])
        	{
            	a =  vet[i];
            	vet[i] = vet[j];
            	vet[j] = a;
			}
		}
	}
	
	printf ("\n----------Ordenando os valores dos vetores em ordem crescente---------\n\n");
	
	for (i = 0; i < 10; i++)
    	printf("vet[%d] - %d\n",i,vet[i]);
	
	return 0;
}

 

Editado por Simon Viegas
Alterar tipo de code para C Languages
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se alguém tiver alguma sugestão para dar p o autor do tópico com respeito ao exercício acima fique a vontade p postar

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em 3 etapas, é como resolveria.

Funções:

  1. capturar os dados
  2. ordenar os dados
  3. imprimir os dados

 

 

  • ✓ Programa principal:
Spoiler

#include <stdio.h> /* scanf,printf */
#include <locale.h>/* setlocale;LC_CTYPE */
  
/* vetor_pegar_inteiro: captura lista de valores inteiros */
void vetor_pegar_inteiro( unsigned siz,int vet[siz] );

/* vetor_sort: em ordem crescente ordena os índices do vetor */
void vetor_sort( unsigned siz,int vet[siz],unsigned index[siz] );

/* vetor_show: escrever o conteúdo do vetor */
void vetor_show( unsigned siz,int vet[siz],unsigned index[siz] );
int main( void )
{
    int vetor[10];
    unsigned index[10];
    
    setlocale( LC_CTYPE,"Portuguese" );
    printf( "%s","Entre com 10 números inteiros para carregar o vetor:\n" );
    vetor_pegar_inteiro( 10,vetor );
    
    printf ("%s","\n----------Ordenando os valores dos vetor"
                          " em ordem crescente---------\n\n");
    vetor_sort( 10,vetor,index );
    
    printf( "%s","\n----------Valores ordenados---------\n\n");
    vetor_show( 10,vetor,index );
    return 0;
}

 

 

  • ✓ Capturar os dados: Força e mostra para usuário qual a quantidade e posição da captura.
  1.  Declaramos uma variável para memorizar o mais atual caractere no fluxo de entrada.
  2. Capturamos o caractere mais atual
  3. Testamos se é caractere de nova linha: Se sim então exibisse o índice do INPUT atual. Se não capturasse o inteiro e atribuísse a lista. Repete o contador

Erros: Entrada de não dígitos.

Spoiler

void vetor_pegar_inteiro( unsigned siz,int vetor[siz] )
{ /* captura lista de valores inteiros */
  int inputc;

  for (unsigned item= 0; item < siz; item+= 1) {

    inputc= getchar( );
    if ('\n' == inputc) {

      printf( "%s%d%s","[",item + 1," ...]: " );
      item-= 1;
    }
    else {

      ungetc( inputc,stdin );
      scanf( " %i",&vetor[item] );
    }
  }
  return;
}

 

 

  • ✓ Ordenar dados: Para ordenação usará um outro vetor de índices que será ordenado.

Pois será este vetor índice que terá seus valores trocados.

Spoiler

void vetor_sort( unsigned siz,int vet[siz],unsigned index[siz] )
{ /* em ordem crescente ordena os índices do vetor */
  unsigned a= 0;

  for (unsigned i= 0; i < siz; i+= 1) {

    index[i]= i; /* "Indexalizando" o vetor de 0 a siz-1*/
  }
  for (unsigned i= 0; i < siz; i++) {

    for (unsigned j= i + 1; j < siz; j++) {

      if (vet[ index[i] ] > vet[ index[j] ]) {
        /* O vetor índice trocar de dados*/
        a= index[i]; 
        index[i]= index[j];
        index[j]= a;
      }
    }
  }
  return;
}

 

 

  • ✓ Imprimir dados: Deverá exibir por meio de um segundo vetor que contém os índices da ordenação.
Spoiler

void vetor_show( unsigned siz,int vet[siz],unsigned index[siz] )
{ /* escrever o conteúdo do vetor */
  for (unsigned i= 0; i < siz; i+= 1) {
    printf( " [%u]: %d ",index[i],vet[ index[i] ] );
  }
  return;
}

 

 

 

 

 

Editado por AnsiC
  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Eu cheguei ao resultado após conhecer a função qsort, nesse link:

https://programacaodescomplicada.wordpress.com/2014/06/09/ed1-aula-55-ordenacao-usando-a-funcao-qsort/

também foi preciso o uso de uma struct

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

struct data {
    int valor;
    int index;
};

typedef struct data Data;
  
void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

int cmp(const void *a, const void *b) {
    if ((*(Data *) a).valor == (*(Data *)b).valor)
        return 0;
    else
        if ((*(Data *) a).valor < (*(Data *)b).valor)
            return -1;
        else
            return 1;
}

int main () {

    setlocale (LC_ALL, "Portuguese");

    Data vet[10];
    int i;

    printf ("Entre com 10 números inteiros para carregar o vetor:\n\n");
    for (i = 0; i < 10; i++) {
        printf("Posicao[%d]: ", i);
        scanf ("%d", &vet[i].valor);
        vet[i].index = i; // já guarda o índice para não precisar de outro for p isso
        limpa_linha();
    }

    // função qsort
    qsort(vet, 10, sizeof(Data), cmp);   

    printf ("\n----------Ordenando os valores dos vetores em ordem crescente---------\n\n");

    for (i = 0; i < 10; i++)
        printf("vet [%d] - %d\n", vet[i].index, vet[i].valor);

    return 0;
}
  

@AnsiC Convenhamos... com essa sua resolução do exercício deixa a gente até com vergonha d postar algo aqui 

Editado por giu_d
Correção no código
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui outro problema de ordenação através dos índices do vetor similar a solução do @AnsiC mas usando ordenação por inserção (Insertion Sort) ao invés de ordenação por flutuação (Bubble Sort), caso tenha interesse:

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 horas atrás, AnsiC disse:

:thumbsup: Perguntas @giu_d @Mahaus?

*Poderia me explicar o porque colocar essas linhas aqui na frente da definição das variaveis ( unsigned siz,int vet[siz],unsigned index[siz] ); porque unsigned?

*Na declaração da biblioteca locale.h, utilizar LC_ALL e LC_CTYPE  da no mesmo?

*Porque você utilizou void na definiçao da funçao, daria no mesmo se utilizasse um int ou só ()?

*É possível fazer isso sem utilizar funções?

*Teria como você implementar isso no que eu já fiz pra mim entender melhor,tipo usando as variáveis q eu usei? sem querer abusar da sua paciência, mas já abusando rs

Gente peço desculpas pela enrolação, mas é q tem tanta coisa q eu não sei ainda, e uma explicação sempre é bem vinda,mais uma vez agradeço a vcs que estão me ajudando.

adicionado 5 minutos depois
3 horas atrás, giu_d disse:

@AnsiC Eu cheguei ao resultado após conhecer a função qsort, nesse link:

https://programacaodescomplicada.wordpress.com/2014/06/09/ed1-aula-55-ordenacao-usando-a-funcao-qsort/

também foi preciso o uso de uma struct


#include <stdio.h>
#include <locale.h>
#include <stdlib.h> // para a função qsort

struct data {
    int valor;
    int index;
};

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

int cmp(const void *a, const void *b) {
    if (*(int *) a == *(int *)b)
        return 0;
    else
        if (*(int *) a < *(int *)b)
            return -1;
        else
            return 1;
}

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

    struct data vet[10];
    int i, j;

    printf ("Entre com 10 números inteiros para carregar o vetor:\n");
    for (i = 0; i < 10; i++) {
        printf("Posicao [%d]: ", i);
        scanf ("%d", &vet[i].valor);
        vet[i].index = i; // já guarda o índice para não precisar de outro for p isso
        limpa_linha();
    }

    // função qsort
    qsort(vet, 10, sizeof(struct data), cmp);

    printf ("\n----------Ordenando os valores dos vetores em ordem crescente---------\n\n");

    for (i = 0; i < 10; i++)
        printf("vet [%d] - %d\n", vet[i].index, vet[i].valor);

    return 0;
}

 

adicionado 1 minuto depois

@AnsiC Convenhamos... com essa sua resolução do exercício deixa a gente até com vergonha d postar algo aqui 

@giu_d A utilização de ponteiros ficaria meio complicada já que não entrei nesse assunto ainda, e o que seria struct?

Editado por Mahaus
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  1. unsigned é um modificar de tipos do C: Qualquer valor negativo vai ser convertido para o correspondente sem sinal (positivo), assim estamos passando essa mensagem para os futuros reutilizadores.

  2. Utilizar LC_ALL e LC_CTYPE  da no mesmo? O primeiro alterá todos os padrões de entrada e saída [ALL do inglês TUDO], o segundo apenas os textos. Se a finalidade é acentuar as palavras do nosso idioma então LC_CTYPE faz só isso e deixando o resto como é de padrão. Sim para o contexto do problema, da no mesmo.

  3. void na definição da função, daria no mesmo se utilizasse um int ou só ()? Não, Primeiro se você não declarar o tipo de retorno o programa assumirá o tipo padrão [int], portando existe igualdade int e em branco. Porém em braco e void não é a mesma coisa, então qual importância do void? segundo o Jamsa Ph.D é impedir usos inadequados de funções que não oferecem retorno orientado. Ao que me aparece, mesmo uma função sendo void ela comunica que chegou ao seu fim de alguma maneira que nos meros mortais não sabemos. Daí então void reduz um processo nessa tarefa de avaliação do sistema operativo.

  4. como você implementar isso no que eu já fiz pra mim entender melhor,tipo usando as variáveis q eu usei? Desta forma.É muito fácil de adaptar, pois só fiz acrescentar um vetor. ^_^ O resto é charme!

    Spoiler
    
    #include <stdio.h>
    #include <conio.h>
    #include <locale.h>
    int main ()
    {
      setlocale (LC_ALL,"Portuguese");
      int vet[10],index[10],i,j,a;
    
      printf ("Entre com 10 números inteiros para carregar o vetor:\n");
      for (i=0;i<10;i++)
      {
        scanf ("%d",&vet[i]);
        index[i] = i;
      }
    
      for (i=0;i<10;i++)
      {
        for (j = i + 1; j < 10; j++)
        {
          if (vet[ index[i] ] > vet[ index[j] ])
          {
            a =  index[i];
            index[i] = index[j];
            index[j] = a;
          }
        }
      }
    
      printf ("\n----------Ordenando os valores dos vetores em ordem crescente---------\n\n");
    
      for (i = 0; i < 10; i++)
        printf("vet[%d] - %d\n",index[i],vet[ index[i] ]);
    
      return 0;
    }

     

     

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
53 minutos atrás, Mahaus disse:

*Poderia me explicar o porque colocar essas linhas aqui na frente da definição das variaveis ( unsigned siz,int vet[siz],unsigned index[siz] ); porque unsigned?

 

unsigned significa sem sinal em português, no caso declarar uma variável como unsigned significa que a variável armazena apenas valores positivos.

 

Também poderia escrever assim "unsigned int siz;", mas o tipo int é o tipo padrão da linguagem C, então ao escrever "unsigned siz;" está implícito que a variável siz é do tipo unsigned int. Para um tipo diferente seria necessário deixar explícito que não é int, por exemplo o tipo char sem sinal ficaria unsigned char (lembrando que o tipo char é um tipo inteiro com apenas 8 bits).

 

 

1 hora atrás, Mahaus disse:

*Na declaração da biblioteca locale.h, utilizar LC_ALL e LC_CTYPE  da no mesmo?

 

Não.

 

LC_CTYPE muda apenas a lista de caracteres especiais para os definidos no locale selecionado, por exemplo no caso do português permite caracteres com acentuação, cedilha, etc.

 

LC_ALL muda o local para todos os tipos de dados afetados pelo local (data e hora, moeda local, separador em números reais) e até operações de comparação de strings, não apenas caracteres especiais, por exemplo no Brasil usamos vírgula ao invés de ponto para separar a parte inteira da parte fracionária de um número real, então ao usar LC_ALL isso também é modificado e passa a ser esperado que o usuário digite números com vírgula e não ponto no terminal (cmd).

 

 

 

1 hora atrás, Mahaus disse:

*Porque você utilizou void na definiçao da funçao, daria no mesmo se utilizasse um int ou só ()?

 

Não.

 

Leia esse post para entender a diferença:

 

E esse tópico para ver uma discussão sobre o assunto:

 

 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
29 minutos atrás, AnsiC disse:
  1. unsigned é um modificar de tipos do C: Qualquer valor negativo vai ser convertido para o correspondente sem sinal (positivo), assim estamos passando essa mensagem para os futuros reutilizadores.

  2. Utilizar LC_ALL e LC_CTYPE  da no mesmo? O primeiro alterá todos os padrões de entrada e saída [ALL do inglês TUDO], o segundo apenas os textos. Se a finalidade é acentuar as palavras do nosso idioma então LC_CTYPE faz só isso e deixando o resto como é de padrão. Sim para o contexto do problema, da no mesmo.

  3. void na definição da função, daria no mesmo se utilizasse um int ou só ()? Não, Primeiro se você não declarar o tipo de retorno o programa assumirá o tipo padrão [int], portando existe igualdade int e em branco. Porém em braco e void não é a mesma coisa, então qual importância do void? segundo o Jamsa Ph.D é impedir usos inadequados de funções que não oferecem retorno orientado. Ao que me aparece, mesmo uma função sendo void ela comunica que chegou ao seu fim de alguma maneira que nos meros mortais não sabemos. Daí então void reduz um processo nessa tarefa de avaliação do sistema operativo.

  4. como você implementar isso no que eu já fiz pra mim entender melhor,tipo usando as variáveis q eu usei? Desta forma.É muito fácil de adaptar, pois só fiz acrescentar um vetor. ^_^ O resto é charme!

      Ocultar conteúdo
    
    
    #include <stdio.h>
    #include <conio.h>
    #include <locale.h>
    int main ()
    {
      setlocale (LC_ALL,"Portuguese");
      int vet[10],index[10],i,j,a;
    
      printf ("Entre com 10 números inteiros para carregar o vetor:\n");
      for (i=0;i<10;i++)
      {
        scanf ("%d",&vet[i]);
        index[i] = i;
      }
    
      for (i=0;i<10;i++)
      {
        for (j = i + 1; j < 10; j++)
        {
          if (vet[ index[i] ] > vet[ index[j] ])
          {
            a =  index[i];
            index[i] = index[j];
            index[j] = a;
          }
        }
      }
    
      printf ("\n----------Ordenando os valores dos vetores em ordem crescente---------\n\n");
    
      for (i = 0; i < 10; i++)
        printf("vet[%d] - %d\n",index[i],vet[ index[i] ]);
    
      return 0;
    }

     

     

É que ficou tão charmoso que me perdi olhando as outras linhas tentando entender kkk, como sempre esplêndido, muito obrigado pela ajuda fera.

adicionado 11 minutos depois
28 minutos atrás, isrnick disse:

 

unsigned significa sem sinal em português, no caso declarar uma variável como unsigned significa que a variável armazena apenas valores positivos.

 

Também poderia escrever assim "unsigned int siz;", mas o tipo int é o tipo padrão da linguagem C, então ao escrever "unsigned siz;" está implícito que a variável siz é do tipo unsigned int. Para um tipo diferente seria necessário deixar explícito que não é int, por exemplo o tipo char sem sinal ficaria unsigned char (lembrando que o tipo char é um tipo inteiro com apenas 8 bits).

 

 

 

Não.

 

LC_CTYPE muda apenas a lista de caracteres especiais para os definidos no locale selecionado, por exemplo no caso do português permite caracteres com acentuação, cedilha, etc.

 

LC_ALL muda o local para todos os tipos de dados afetados pelo local (data e hora, moeda local, separador em números reais) e até operações de comparação de strings, não apenas caracteres especiais, por exemplo no Brasil usamos vírgula ao invés de ponto para separar a parte inteira da parte fracionária de um número real, então ao usar LC_ALL isso também é modificado e passa a ser esperado que o usuário digite números com vírgula e não ponto no terminal (cmd).

 

 

 

 

Não.

 

Leia esse post para entender a diferença:

 

E esse tópico para ver uma discussão sobre o assunto

@isrnick Muito obrigado, estou começando a compreender mais

 

 

 

  • Curtir 1
  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×