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:
- 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;
- 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;
- Escreva ambas matrizes na tela, de uma forma legível;
- Escreva a matriz resultante da soma destas duas matrizes multiplicada pelos últimos dois números da sua matricula;
- Escreva um vetor resultante da soma das diagonais principais das duas matrizes multiplicado pelos últimos dois números da sua matricula;
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define LINHAS 3
#define COLUNAS 3
int mat1 [LINHAS][COLUNAS] = {0};
int mat2 [LINHAS][COLUNAS] = {0};
int soma [LINHAS][COLUNAS] = {0};
int mulp [LINHAS][COLUNAS] = {0};
int i, j, ru;
int main() {
printf(" Digite os 2 ultimos numero R.U.: "); /*identificação do fator de multiplicação*/
scanf("%d", &ru);
for(int i = 0; i<LINHAS; i++) {
for(int j = 0; j<COLUNAS; j++) {
printf("Digite o valor %d|%d = ", i, j);
scanf("%d", &mat1[i][j]);
}
}
printf("\n 1.a Matriz gerada\n");
for(int i=0;i<LINHAS;i++) {
for(int j=0;j<COLUNAS;j++) {
printf("%d\t", mat1[i][j]);
}
printf("\n");
}
for(int i = 0; i<LINHAS; i++) {
for(int j = 0; j<COLUNAS; j++) {
printf("Digite o valor %d|%d = ", i, j);
scanf("%d", &mat2[i][j]);
}
}
printf("\n 2a. Matriz gerada\n");
for(int i=0;i<LINHAS;i++) {
for(int j=0;j<COLUNAS;j++) {
printf("%d\t", mat2[i][j]);
}
printf("\n");
}
// cálculo da soma dos valores
for(i=0;i<LINHAS;i++)
for(j=0;j<COLUNAS;j++)
m[i][j]=m[i][j]*ru;
//EXIBIR VALORES MULTIPICADOS
printf("\n::: Valores Multiplicados pelo fator ru:::\n");
system("pause");
return 0;
}
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 ressalva 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.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define LINHAS 5
#define COLUNAS 5
int mat1 [LINHAS][COLUNAS] = {0};
int mat2 [LINHAS][COLUNAS] = {0};
int soma [LINHAS][COLUNAS] = {0};
int mulp [LINHAS][COLUNAS] = {0};
int i, j, ru, lin, col;
int main() {
//faz a leitura da dimensao das matrizes
printf("Digite a dimensao das matrizes: "); /*identificação do fator de multiplicação*/
scanf("%d %d", &lin, &col);
while ((lin > 5 || col > 5) && (lin < 0 || col < 0)) {
printf("Dimensoes incorretas. Digite a dimensao das matrizes: ");
scanf("%d %d", &lin, &col);
}
//faz a leitura dos valores da primeira matriz
for(int i = 0; i<lin; i++) {
for(int j = 0; j<col; j++) {
printf("Digite o valor %d|%d = ", i, j);
scanf("%d", &mat1[i][j]);
}
}
//faz a leitura dos valores da segunda matriz
for(int i = 0; i<lin; i++) {
for(int j = 0; j<col; j++) {
printf("Digite o valor %d|%d = ", i, j);
scanf("%d", &mat2[i][j]);
}
}
//Mostra os valores das duas matrizes
printf("\n 1.a Matriz gerada\n");
for(int i=0;i<lin;i++) {
for(int j=0;j<col;j++) {
printf("%d\t", mat1[i][j]);
}
printf("\n");
}
printf("\n 2a. Matriz gerada\n");
for(int i=0;i<lin;i++) {
for(int j=0;j<col;j++) {
printf("%d\t", mat2[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
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().
char matricula[10], ult[3], pen[2];
int tamMatricula;
printf("Digite a matricula: "); /*identificação do fator de multiplicação*/
scanf("%s", matricula);
tamMatricula = strlen(matricula); //pega o tamanho da string
//ru = atoi(strcat(matricula[tamMatricula-1], matricula[tamMatricula-2]));
ult[0] = matricula[tamMatricula-1];
ult[1] = '\0';
//strcat(ult, matricula[tamMatricula-2]);
pen[0] = matricula[tamMatricula-2];
pen[1] = '\0';
strcat(ult, pen);
ru = atoi(ult);
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:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define LINHAS 5
#define COLUNAS 5
int mat1 [LINHAS][COLUNAS] = {0};
int mat2 [LINHAS][COLUNAS] = {0};
int soma [LINHAS][COLUNAS] = {0};
int mulp [LINHAS][COLUNAS] = {0};
int i, j, ru, lin, col;
int main() {
//faz a leitura da dimensao das matrizes
printf("Digite a dimensao das matrizes: "); /*identificação do fator de multiplicação*/
scanf("%d %d", &lin, &col);
while ((lin > 5 || col > 5) && (lin < 0 || col < 0)) {
printf("Dimensoes incorretas. Digite a dimensao das matrizes: ");
scanf("%d %d", &lin, &col);
}
//faz a leitura dos valores da primeira matriz
for(int i = 0; i<lin; i++) {
for(int j = 0; j<col; j++) {
printf("Digite o valor %d|%d = ", i, j);
scanf("%d", &mat1[i][j]);
}
}
//faz a leitura dos valores da segunda matriz
for(int i = 0; i<lin; i++) {
for(int j = 0; j<col; j++) {
printf("Digite o valor %d|%d = ", i, j);
scanf("%d", &mat2[i][j]);
}
}
//Mostra os valores das duas matrizes
printf("\n 1.a Matriz gerada\n");
for(int i=0;i<lin;i++) {
for(int j=0;j<col;j++) {
printf("%d\t", mat1[i][j]);
}
printf("\n");
}
printf("\n 2a. Matriz gerada\n");
for(int i=0;i<lin;i++) {
for(int j=0;j<col;j++) {
printf("%d\t", mat2[i][j]);
}
printf("\n");
}
//pega o dois ultimos digitos das matriculas
char matricula[10], ult[3], pen[2];
int tamMatricula;
printf("Digite a matricula: "); /*identificação do fator de multiplicação*/
scanf("%s", matricula);
tamMatricula = strlen(matricula);
ult[0] = matricula[tamMatricula-1];
ult[1] = '\0';
pen[0] = matricula[tamMatricula-2];
pen[1] = '\0';
ru = atoi(strcat(ult, pen));
printf("%d", ru);
// cálculo da soma dos valores e a multiplicacao
for(i=0;i<lin;i++)
for(j=0;j<col;j++)
mulp[i][j]=(mat1[i][j]+mat2[i][j])*ru;
printf("\nMatriz resultante:\n");
for(int i=0;i<lin;i++) {
for(int j=0;j<col;j++) {
printf("%d\t", mulp[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
Teste o código online em: https://ideone.com/wFTHzF