Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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
Postado
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
Postado

@arfneto realmente pode ser a opção de criar uma segunda matriz com a soma dos algarismos da primeira, porém não consegui um processo pra chegar nesta 2ª fase ainda

  • Amei 1
Postado

 

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!