Ir ao conteúdo
  • Cadastre-se

C mostar numéros primos e valor das pontas de uma matriz


Visitante

Posts recomendados

boa noite! não consegui implementar essas duas funções: imprimir número primos e mostrar valores das quatro pontas da matriz (case 5 e 6).

alguma sugestão? 

abraço!

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

struct matriz{

  int linha;
  int coluna;
  float* valor;

};

typedef struct matriz Matriz;

Matriz* cria(int m, int n){

  Matriz* mat = (Matriz*)malloc(sizeof(Matriz));

  if (mat == NULL){
    printf("Memoria insuficiente!\n");
    exit(1);
  }
  
  mat->linha = m;
  mat->coluna = n;

  mat->valor = (float*)malloc(m*n*sizeof(float));

  return mat;

}

void libera(Matriz* mat){

  free(mat->valor);

  free(mat);

}

float acessa(Matriz* mat, int i, int j) {

  int k;

// verifica se a coordenada informada é valida. 
  if (i < 0 || i >= mat->linha || j < 0 || j >= mat->coluna) {
    printf("Acesso invalido!\n");
    exit(1);
  }

  k = i * mat->coluna + j;

  return mat->valor[k];

}

void atribui(Matriz* mat, int i, int j, float valor) {

  int k;

  if (i < 0 || i >= mat->linha || j < 0 || j >= mat->coluna) {
    printf("Atribuicao invalida!\n");
    exit(1);
  }

  k = i * mat->coluna + j;

  mat->valor[k] = valor;

}

int linhas(Matriz* mat){

  return mat->linha;

}

int colunas(Matriz* mat){

  return mat->coluna;

}

int main(){

  int opcao;

  Matriz* matriz;

  printf ("Desejas criar a Matriz?\n");
  printf ("digite 1 para sim ou 2 para nao: ");
  scanf ("%d", &opcao);
  if (opcao == 1){
      int l, c;
      printf ("quantas linhas deve ter a matriz? ");
      scanf ("%d", &l);
      printf ("quantas colunas deve ter a matriz? ");
      scanf ("%d", &c);
      matriz = cria(l,c);
  }

  do
  {
    int opcao2 = 8;

    printf ("1 - inserir valor na matriz\n");
    printf ("2 - consultar a matriz\n");
    printf ("3 - mostrar quantidade de linhas\n");
    printf ("4 - mostrar quantidade de colunas\n");
    printf ("5 - mostrar as quatro extremidades da matriz\n");
    printf ("6 - mostrar os numeros primos\n");
    printf ("7 - sair\n");
    printf ("qual a opcao? ");
    scanf ("%d", &opcao2);

    int l_u, c_u, valor, qtd_linhas, qtd_colunas, *primos, i, primo;

     switch (opcao2)
     
    {
    case 1:

        printf ("qual a linha onde sera atribuido o valor? ");
        scanf ("%d", &l_u);
        printf ("qual a coluna onde sera atribuido o valor? ");
        scanf ("%d", &c_u);
        printf ("qual o valor que sera atribuido? ");
        scanf ("%d", &valor);
        atribui(matriz, l_u, c_u, valor);
        primos = (int *)malloc(valor * sizeof(int));
        for (i = 2; i <= valor / 2; i++) {
          if (valor % i == 0) {
            primo++;
            break;
            }
        }
        if (primo == 0){
          printf ("%d\n", valor);
        }

        printf ("o valor foi atribuido\n");
        break;
    
    case 2:

        printf ("qual a linha onde sera acessado o valor? ");
        scanf ("%d", &l_u);
        printf ("qual a coluna onde sera acessado o valor? ");
        scanf ("%d", &c_u);
        float consulta = acessa(matriz, l_u, c_u);
        printf("o valor consultado foi: %.2f\n", consulta);
        break;

    case 3:

        qtd_linhas = linhas(matriz);
        printf ("a quantidade de linhas na matriz são: %d\n", qtd_linhas);
        break;

    case 4:

        qtd_colunas = colunas(matriz);
        printf ("a quantidade de colunas na matriz são: %d\n", qtd_colunas);
        break;

    case 5:
        printf ("%d\n", matriz[i][j]);
        break;
        
        break;

    case 6:

        printf ("%d\n", primos[0]);
        break;

    case 7:

        libera(matriz);
        break;



    default:
        break;
    }
  } while (opcao != 2);

}
Link para o comentário
Compartilhar em outros sites

1 hora atrás, glaukito disse:

boa noite! não consegui implementar essas duas funções: imprimir número primos e mostrar valores das quatro pontas da matriz (case 5 e 6).

 

Não escreva programas interativos quando está testando. Só vai perder muito tempo. Muito mesmo. Escreva e teste em separado.

 

Escreva sempre em torno dos dados... É mais fácil.

 

Isso

 

struct matriz{

  int linha;
  int coluna;
  float* valor;

};

typedef struct matriz Matriz;

Matriz* cria(int m, int n); 

// ...

 

é muito complicado. Escreva o simples
 

typedef struct
{
	int     l; // linhas
	int     c; // colunas
	float*  M; // a tal matriz MxN de float

} Matriz;

Matriz* cria(int m, int n); // ...

 

  • main() deve ser a primeira função de seu programa

Sobre os "valores das pontas" não entendo qual a dúvida. A matriz MxN vai ter linas de 0 a M-1 e colunas de 0 a N-1 e assim nos cantos vai ter (0,0), (0,N-1) na primeira linha e (M-1,0), (M-1,N-1) na última, certo? ;)

 

Sobre os primos

Imagino que queira dizer que quer mostrar apenas os elementos primos DA MATRIZ. Não mostrou isso no menu nem em lugar nenhum. Como alguém vai saber?

 

A primeira função que devia ter escrito seria a que MOSTRA a matriz, certo? Afinal como vai saber se leu direito se não mostrar? Só que não fez isso.

 

Para saber se o elemento é primo

  • que tal uma função que devolve 0 se o número não é primo e 1 se ele é primo? Não seria original. E tem centenas pela internet e aqui mesmo no forum, em várias linguagens, se precisa de "inspiração".

E se tem uma função que mostra a matriz (aquela que deveria ter escrito antes de todas) não seria esperto aproveitar a mesma função e escrever outra usando recortar e colar e trocando o valor do elemento por espaços na hora de mostrar, caso ele não seja primo? Daria um visual caprichado até...

 

 

 

Link para o comentário
Compartilhar em outros sites

23 horas atrás, glaukito disse:

Matriz* cria(int m, int n){
		Matriz* mat = (Matriz*)malloc(sizeof(Matriz));
  		if (mat == NULL){ 
          		printf("Memoria insuficiente!\n");
          		exit(1);
		}
  		mat->linha = m;
  		mat->coluna = n;
  		mat->valor = (float*)malloc(m*n*sizeof(float));
  		return mat;
}

 

@glaukito É preciso ter para o campo   valor   o mesmo cuidado na requisição de memória que tem com a estrutura. É incoerente pensarmos que o vetor está garantido somente porque a menor provável porção de memória necessária foi alocada. 

 

O coerente e por norma é verificarmos a

Requisição de Memória.

Matriz* cria(int m, int n){
		Matriz* mat = (Matriz*)malloc(sizeof(Matriz));
  		if (mat == NULL){ 
          		printf("Memoria insuficiente!\n");
          		exit(1);
		}
  		mat->linha = m;
  		mat->coluna = n;
  		float *v= (float*)malloc(m*n*sizeof(float));
		if (v == NULL){ 
          		printf("Memoria insuficiente!\n");
				free(mat);
          		exit(1);
		}
		mat->valor = v;
  		return mat;
}

 

 

Outra abordagem tem uma pequena modificação na Struct Matriz para Struct    'Array' Flexível    Matriz.

struct Matriz {
	size_t	nCOL;
	size_t	nLIN;
  	float	elems[ ]; //<--- Arranjo flexivel
};

 

Requisição de Memória

struct Matriz* criar(int m, int n){
		struct Matriz* mat = malloc(sizeof(struct Matriz) + (m*n*sizeof(float)));
  		if (mat == NULL){ 
          		printf("Memoria insuficiente!\n");
          		exit(1);
		}
  		mat->nLIN = m;
  		mat->nCOL = n;
  		return mat;
}

A memória extra depois do tamanho de Struct Matriz é requisitada para elems.

 

 

 

Não existe justificativa lógica para escrever:

cria  ao invés de  criar

 

 

:muro:

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

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