Algoritmo solicitado 2

A solicitação de algoritmo foi enviada por Hedson Ferreira. A solicitação foi enviada por comentário no blog e não foi enviada corretamente conforme solicito (veja a forma correta aqui), mas resolvi atender mesmo assim. O enunciado é o seguinte:

Faça um algoritmo em linguagem C com as seguintes funcionalidades:

  1. Receba duas matrizes como dados e entrada. A dimensão das matrizes deve ser de, no máximo 5×5. Ambas matrizes devem ter as mesmas dimensões;
  2. O usuário deve digitar a dimensão das matrizes (máximo 5×5). Faça uma checagem usando um laço de repetição que só permita o programa avançar caso ele digite dimensões corretas de no máximo 5;
  3. Escreva ambas matrizes na tela, de uma forma legível;
  4. Escreva a matriz resultante da soma destas duas matrizes multiplicada pelos últimos dois números da sua matricula;
  5. Escreva um vetor resultante da soma das diagonais principais das duas matrizes multiplicado pelos últimos dois números da sua matricula;

O código tentou atender os 4 primeiros itens, então vou auxiliar na solução desses 4 itens. Inicialmente, vou alterar o algoritmo para atender a primeira parte da questão, que consiste em ter matrizes com uma dimensão informada pelo usuário até o limite máximo de 5 linhas e 5 colunas.

Por ter um limite máximo definido e ele não ser muito grande, a solução feita pelo Hedson, onde duas constantes foram definidas (linhas 5 e 6) para definir o tamanho das matrizes (linhas 8-11), pode ser empregada. Vale a resalva de que existirá uma subutilização da matriz para valores menos do que os das constantes e que seria melhor fazer uma alocação dinâmica dos recursos, mas como disse, o tamanho das matrizes não está muito grande.

Eu adicionei as linhas 15-20 ao código para atender aos itens 1 e 2 do enunciado. O usuário informa as dimensões e eu verifico se os valores digitados atendem as limites do problema. Eu verifiquei se os valores digitados eram maiores do que zero e também menores do que 5. Se os valores para as duas dimensões não forem válidos, então novos valores são solicitados.

Com a indicação da dimensão das matrizes vinda do usuário, foi preciso alterar as condições de teste dos laços de repetição for para que os laços fossem percorridos até o limite informado pelo usuário e não mais pelas constantes. Sendo assim, nas especificações troquei as constantes “LINHAS” e “COLUNAS” pelas variáveis “lin” e “col”, respectivamente, lidas do usuário.

O restante do código mantive conforme estava, apenas alterando a ordem com que são feitas as operações. O Hedson faz leitura da primeira matriz, mostra os valores da primeira matriz, depois faz a leitura da segunda matriz e depois mostra a segunda matriz. Eu prefiro ler os valores das duas matrizes e depois mostrar os valores das duas matrizes, mas é preferência pessoal minha. Acho que fica mais fácil localizar as operações no código.

A próxima etapa consiste em ler o número de matrícula e utilizar os dois últimos dois dígitos para multiplicar esse valores com soma dos valores das matrizes.

Extrair os dois últimos dígitos de um número é fácil se o número de dígitos do número for fixo, mas eu vou considerar que a quantidade de dígitos pode variar. Nesse sentido fica difícil elaborar um cálculo para extrair a dezena e a unidade do número, então vou fazer a leitura da matrícula como uma string, pegar os dois últimos caracteres e transformá-los para número. Essas operações são feitas nas linhas x-y do trecho de código abaixo.

Existem formas mais fáceis, mas eu quis utilizar a função básica de concatenação. Eu inicialmente leio o número da matrícula como uma string e pego o tamanho da string através da função strlen(), da biblioteca string.h. A ideia é depois pegar os dois últimos caracteres e utilizar a função atoi(), que converte string para número inteiro.

matricula[tamMatricula-1] pega corretamente o último dígito e matricula[tamMatricula-2] pega corretamente o penúltimo dígito. Só para relembrar, se a matrícula tem 8 dígitos, então strlen() retornará o tamanho 8, mas a string é um vetor de caracteres e começa com o índice zero. Com isso a última letra estará na posição 7, enquanto a penúltima estará na posição 6.

Inicialmente eu tentei erroneamente fazer simplemente ru = atoi(strcat(matricula[tamMatricula-1], matricula[tamMatricula-2]));. Isso não funciona porque a função strcat() concatena as strings e guarda o resultado da concatenação no primeiro parâmetro. Como eu passei matricula[tamMatricula-1] como primeiro parâmetro, não é válido que nessa posição (que armazena uma única letra) eu guarde toda uma string.

Sendo assim eu criei a string ult com 3 caracteres. Defini 3 caracteres porque a string deverá ao final guardar os dois últimos dígitos da matricula e também, por ser uma string, o caracter de final de string, o ‘\0’. As linhas 9 e 10 atribuem o último dígito a variável de string que criei. Veja que é necessário colocar o caracter finalizador de linha e que esse deve ser fornecido utilizando aspas simples. Por mais que utilizemos dois caracteres para escrever o finalizador de linha, ele é apenas 1 caracter.

Tentei em seguida fazer strcat(ult, matricula[tamMatricula-2]);, mas mais um erro ocorreu. O segundo parâmetro da strcat() também precisa ser uma string e da maneira que fiz informei apenas um caracter, o que não é válido. Por isso tive que atribuir o penúltimo caracter em uma outra string para só depois fazer a devida concatenação e finalmente passar a string para a função atoi().

O restante é simples. Eu apenas percorri as matrizes somando seus valores e já multiplicando pelos dois últimos dígitos da matrícula. Ao final foi mostrada a matriz com os valores resultantes. O código completo é mostrado a seguir:

Teste o código online em: https://ideone.com/wFTHzF

 

Share

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.