Nesta "variação" do programa, a função "SomaLinhasPares" é "void" e seu resultado é retornado em uma variável passada "por referência".
O funcionamento é idêntico à outra versão, como podemos ver no screenshot abaixo.
Para detalhes sobre o funcionamento da "variação", veja os
trechos destacados
no código!
Bom divertimento!
Screenshot:
Código-Fonte:
#include <cstdlib>
#include <iostream>
using namespace std;
// Fazer um programa que leia uma matriz A(4,2) de elementos inteiros,
// calcule e depois mostre a soma das linhas pares da matriz.
//
// Como este algoritmo é bastante fácil e já fizemos vários exercícios semelhantes,
// vamos "enriquecer" um pouco a solução, usando alguns recursos da linguagem:
// a) Vamos usar funções. Graças a isto , a função "main" será pequena e fácil de entender,
// pois constará básicamente de chamadas a estas funções.
// Note que as funções receberão como "parâmetro por referência" o nosso "vetor principal".
// b) Já que estamos usando um vetor como parâmetro,
// e em C o nome de um vetor retorna um pointeiro (passamos implícitamente um ponteiro)
// vamos usar também um "ponteiro explícito" ao chamar a função "scanf".
// c) Nesta "variação" do programa, a função "SomaLinhasPares" é "void" e
// seu resultado é retornado em uma variável passada "por referência".
//
// Espero que gostem e se divirtam!
// Nosso truque já velho conhecido:
// as dimensões da matriz são especificadas através de constantes
const int cstNroLinhas = 4;
const int cstNroColunas = 2;
// E como os indexadores vão ser usados em várias funções, vou declará-los aqui, também
int iLinha;
int iColuna;
// -----------------------------------------------------------------------------------------------------
// Funções auxiliares
void LeMatriz(int Matriz[cstNroLinhas][cstNroColunas])
{
// Nesta função vou usar uma "firula":
// Em lugar de usar &Variavel no "scanf", vou definir e preencher uma variável ponteiro
// e passar esta variável
// Para mais detalhes, veja http://www.augustcouncil.com/~tgibson/tutorial/ptr.html
int * ptrItemMatriz;
for (iLinha =0; iLinha<cstNroLinhas; iLinha++)
{
for (iColuna=0; iColuna<cstNroColunas; iColuna++)
{
printf("Digite o valor do item da matriz para a linha %i, coluna %i: ", iLinha+1, iColuna+1);
// Aqui preencho o ponteiro
ptrItemMatriz = &Matriz[iLinha][iColuna];
// E aqui passo ao "scanf" o ponteiro preenchido
scanf("%i",ptrItemMatriz);
}
}
}
void SomaLinhasPares(int Matriz[cstNroLinhas][cstNroColunas], int * ptrSoma) // Note que o segundo parâmetro é um ponteiro!
{
int Soma = 0; // Note que esta variável Soma é independente da variável Soma na rotina principal (Main)
for (iLinha=0; iLinha<cstNroLinhas; iLinha++)
{
if ( (iLinha + 1) % 2 == 0)
{
for (iColuna=0; iColuna<cstNroColunas; iColuna++)
Soma += Matriz[iLinha][iColuna];
}
}
// Aqui o resultado é retornado atribuindo à variável Soma da rotina principal
// (através do 'ponteiro' para ela que recebemos)
// o valor da variável 'Soma' "interna" (desta subrotina)
*ptrSoma = Soma;
}
// -----------------------------------------------------------------------------------------------------
// Função Principal
int main(int argc, char *argv[])
{
// Definindo a matriz
int A[cstNroLinhas][cstNroColunas];
// Chamando a subrotina LeMatriz passando a matriz"A" como parametro
// Lembre-se: em C, quando usamos o nome de um vetor ou matriz, estamos obtendo um ponteiro, não o conteúdo
// e portanto esta chamada trabalhará com a Matriz A "por referência" (ou seja, podendo alterar seu conteúdo)
// Se quiser mais detalhes, veja http://www.augustcouncil.com/~tgibson/tutorial/arr.html
LeMatriz(A);
// Agora, vamos mostrar a "soma das linhas pares da matriz"
// Vamos considerar como "linhas pares" as que tem "o módulo 2 de (índice + 1) = 0"
// Não ficou claro? Vamos exemplificar! A linha de índice 1 será considerada "linha par",
// pois 1 + 1 % 2 = 0. OK?
// E para continuar o nosso método de usar funções,
// faremos a soma através de uma função! ;-)
// Mas nesta versão, a função não retorna valor algum (é 'void')
// e o resultado é "devolvido" através da atualização do conteúdo da variável "Soma"
// que é passada "por referência" - passamos o 'endereço de Soma', um 'ponteiro para Soma'!
int Soma;
SomaLinhasPares(A, &Soma);
// Agora basta imprimir o resultado:
printf("\nSoma dos elementos das linhas pares: %i \n", Soma);
system("PAUSE");
return EXIT_SUCCESS;
}