Ir ao conteúdo
  • Cadastre-se

C++ Programa de Soma - Matriz


phbgarcia

Posts recomendados

Comecei um código de matriz 10x10, que gera números de 100 a 999, até aí tudo bem, no entanto, preciso desenvolver uma parte que some os algarismos de todas as linhas separadamente. Ex: se apareceu 198 na linha1 e coluna 1, a soma deles será de 1+9+8=18, se na linha 1 e coluna 2 apareceu 560, 5+6+0=11, não consigo aplicar isso de modo nenhum. Preciso gerar algarismo por algarismo, segue o código abaixo para adiantar o processo. Grato pela ajuda

 

 

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void gen( int [][10] );
void prn( int [][10] );
int main()
{
    int n[ 10 ][ 10 ];
    gen( n );
    prn( n );
    return 0;

void gen( int g[][10] )
{
    srand(time(0));
    for( int i = 0 ; i < 10 ; i++ )
        for( int j = 0 ; j < 10 ; j++ )
            g[ i ] [ j ]= 100+ rand()%899 + 1 ;
}
void prn( int p[][10] )
{
    for( int i = 0 ; i < 10 ; i++ )
    {
        for ( int j = 0 ; j < 10 ; j++ )
            cout << p[ i ][ j ] << '|';
        cout << endl;
    }
}

matriz.png

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@phbgarcia Você pode pegar o último dígito usando "% 10" depois basta eliminar o último dígito do número divindo por 10, e então repetir a operação outras duas vezes e somar os dígitos.

#include <iostream>
using namespace std;

int main() {
    int n = 198;
    int soma;
    soma = n % 10;
    n = n / 10;
    soma = soma + n % 10;
    n = n / 10;
    soma = soma + n % 10;

    cout << soma << endl;
    return 0;
}

Teste esse programa e depois você pode fazer as adaptações necessárias em seu código.

  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

9 horas atrás, phbgarcia disse:

Comecei um código de matriz 10x10, que gera números de 100 a 999, até aí tudo bem, no entanto, preciso desenvolver uma parte que some os algarismos de todas as linhas separadamente

 

Não entendi como chegou a isso que escreveu, a partir disso que seria o enunciado:
 

image.png.5ee344a6478b41f74bad757c123c248d.png

 

De onde vem a ideia de somar todas as linhas separadamente? O que iria fazer com as somas, que seriam 10?

 

Não seria simplesmente o caso de criar uma nova matriz 10x10 onde cada elemento seria a soma dos dígitos do mesmo elemento na matriz original?

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

 

void gen( int [][10] );
void prn( int [][10] );

 

Considere

 

image.png.7f9c0e04413b1dffa6d87122856da029.png

 

Não deve declarar as matrizes como int se SABE que não é pra ter sinal... Faça o simples e use

 

void gen( unsigned [][10] );
void sel( unsigned [][10] );
void prn( unsigned [][10] );

 

15 horas atrás, phbgarcia disse:

não consegui um processo pra chegar nesta 2ª fase ainda

 

Talvez esteja superestimando o problema.

 

Escreva em torno dos dados.

 

Talvez tenha uma lei que obrigue os caras que escrevem esses enunciados a deixarem brechas e coisas por esclarecer, mas vamos imaginar que os extremos estejam incluídos no intervalo, como se o cara tivesse escrito
 

Citação

inteiros positivos entre 100 e 999, inclusive


e aí o menor número possível seria 100, o maior 999. Quantos são então? 900. Se dividir um número qualquer por 900 quanto pode sobrar? Algo entre 0 e 899, certo? Em geral se usa rand() para conseguir um número praticamente aleatório... E rand() retorna um inteiro positivo então não precisa testar o sinal. E o valor está entre 0 e RAND_MAX, que por certo é maior que 899. Então a conta simples:
 

    rand() % 900


vai dar o resto da divisão de um inteiro entre 0 e RAND_MAX (pode ser 32767 na sua plataforma) divido por 900. Isso somado a 100 vai dar o que? Um número entre 100 e 999? Não é? '%' é o operador que dá o resto da divisão, mas nem precisa disso já que se sabe bem como achar o resto, desde o ensino fundamental:

 

    int x = 34567;
    int y = x / 900;
        y = x - 900*y;
    printf("x = %d, resto da divisao por 900 = %d (%d)\n",
        x, y, x%900 );

 

E as funções?

 

Acho que sabe que as 3 funções são a mesma coisa. Vai percorrer a matriz toda e fazer uma única coisa. A única coisa vai ser:

  • gerar o valor entre 100 e 999, inclusive. Usando rand() como descrito acima
  • mostrar o valor na tela, usando um printf()
  • calcular a soma dos dígitos do valor, fazendo uma conta

E que conta é essa para somar os dígitos?

 

De volta ao ensino fundamental, dado um valor entre 100 e 999 tem aí até 3 dígitos. Conhecidos por dígito das centenas, dígito das dezenas e dígito das unidades. Como identificar esses caras? 

 

Dividindo.

 

Note que a divisão por inteiros em C só gera outros inteiros. 301 dividido por 30 dá 10, nada mais.

 

E assim por exemplo

 

    x = 345;
    int soma_dos_digitos = 0;

    y = x / 100;
    printf("x = %d, sao %d centenas...\n",
        x, y );
    soma_dos_digitos += y; // centenas

    x = x - 100 * y; // tira as centenas
    
    y = x / 10;
    printf("         sao %d dezenas...\n",
         y );
    soma_dos_digitos += y; // dezenas

    x = x - 10 * y; // tira as dezenas
    
    printf("         sao %d unidades...\n",
        x );
    soma_dos_digitos += x; // unidades

    printf("... E a soma dos digitos deve ser %d...\n",
        soma_dos_digitos );

 

Deve mostrar como no ensino fundamental:

 

x = 34567, resto da divisao por 900 = 367 (367)
x = 345, sao 3 centenas...
         sao 4 dezenas...
         sao 5 unidades...
... E a soma dos digitos deve ser 12...

 

E  o processo está no enunciado:

 

gera a matriz, mostra, soma os dígitos dos elementos e mostra. Não precisa de duas matrizes.
 

    gen(M); // cria
    prn(M); // mostra
    sel(M); // soma os digitos
    prn(M); // mostra


E cada função é um simples loop seguindo pelas linhas e colunas e fazendo o que foi descrito aqui...

 

Veja esse programa
 

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

void gen( unsigned [][10] );
void prn( unsigned [][10] );
void sel( unsigned [][10] );

int main(void)
{
    unsigned M[10][10];
    printf( "RAND_MAX nessa maquina: %d\n", RAND_MAX );

    int x = 34567;
    int y = x / 900;
        y = x - 900*y;
    printf("x = %d, resto da divisao por 900 = %d (%d)\n",
        x, y, x%900 );
    
    x = 345;
    int soma_dos_digitos = 0;

    y = x / 100;
    printf("x = %d, sao %d centenas...\n",
        x, y );
    soma_dos_digitos += y; // centenas

    x = x - 100 * y; // tira as centenas
    
    y = x / 10;
    printf("         sao %d dezenas...\n",
         y );
    soma_dos_digitos += y; // dezenas

    x = x - 10 * y; // tira as dezenas
    
    printf("         sao %d unidades...\n",
        x );
    soma_dos_digitos += x; // unidades

    printf("... E a soma dos digitos deve ser %d...\n",
        soma_dos_digitos );


    gen(M);
    prn(M);

    sel(M);
    prn(M);

    return 0;
}
// fim

void gen ( unsigned matriz[][10] ){};
void prn ( unsigned matriz[][10] ){};
void sel ( unsigned matriz[][10] ){};

 

Que mostra em alguma máquina
 


RAND_MAX nessa maquina: 2147483647
x = 34567, resto da divisao por 900 = 367 (367)
x = 345, sao 3 centenas...
         sao 4 dezenas...
         sao 5 unidades...
... E a soma dos digitos deve ser 12...

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!