Ir ao conteúdo

C Problema com enunciado do professor


Ir à solução Resolvido por herbertbahia,

Posts recomendados

Postado

Boa noite, meu professor da faculdade me passou uma lista de exercícios para fazer programas em C

em um dos exercicios ele pedo o seguinte:

Citação

elabore um programa que calcule e mostre os resultados da tabuada do n até m.

Inicie um laço de repetição com teste no final e:

a. Escreva Digite dois numero inteiros (n m):

b. Leia os valores n e m na mesma linha. (Dica: use scanf(“%d %d”, &n, &m).

Exemplo de saída:

 

Tabuadas

 

Digite dois numero inteiros (n m): 3 5

 

c. Limpa a tela.

 

d. Se n for menor ou igual a m, calcule a tabuada de n até m.

         i. Escreva o título Tabuada do 3 ao 5. 

         Neste caso, o n=3 e m=5.

 

Exemplo de saída:

 

Tabuada do 3 ao 5

 

3 x 1 = 3

3 x 2 = 6

3 x 3 = 9

    : :

3 x 10 = 30

 

4 x 1 = 4

4 x 2 = 8

4 x 3 = 12

    : :

4 x 10 = 40

 

5 x 1 = 5

5 x 2 = 10

5 x 3 = 15

    : :

5 x 10 = 50

 

Se n for menor que m, calcule a tabuada de m até n.

(Dica: use o laço for, com decremento da variável que controla o índice).

            i. Escreva o título Tabuada de 5 a 3.

 

Exemplo de saída:

 

Tabuada do 5 ao 3

 

5 x 1 = 5

5 x 2 = 10

5 x 3 = 15

    : :

5 x 10 = 50

 

4 x 1 = 4

4 x 2 = 8

4 x 3 = 12

   : :

4 x 10 = 40

 

3 x 1 = 3

3 x 2 = 6

3 x 3 = 9

    : :

3 x 10 = 30

Eu consegui fazer o código, consigo exibir as tabuadas, mas ou exibo de n até m ou de m até n, tendo que excluir um dos "if's"

eu não entendi o enunciado do professor, ele pediu pra se caso n for menor ou igual a m, fazer a tabuada de n até m, mas se n for menor que m, fazer a tabuada de m até n (o contrário) como pode se nos dois casos n é menor que m?

 

meu código:

**ele executa as tabuadas direitinho**

não incluí as bibliotecas porque é muito extenso e esse é um dos sub programas do programa principal

        system ("cls");
        char TC2;  // Ignorem o char, será usado posteriormente
        int NT2=0, NT3=0, IT=0;
        Tabuada1:
        printf("\n");
        printf("\n              Tabuadas                ");
        printf("\n");
        printf("\nDigite aqui dois número inteiros: ");
        scanf("%d %d", &NT2, &NT3);
        system ("cls");
        if (NT2 <= NT3)
        {
            printf("\n      Tabuada do %d ao %d\n\n", NT2, NT3);
            for (NT2=NT2; NT2 <= NT3; NT2++)
            {
                for (IT=1; IT<=10; IT++)
                {
                    printf("\n%d x %d = %d", NT2, IT, NT2*IT);
                }
                if (IT = 10)
                {
                    printf("\n");
                }
            }
        }
        if (NT3 < NT2) //o que eu consegui foi caso o NT3(m) for menor que o NT2(n), faz a tabuada do NT2 ao NT3, decrementando o NT2, mas não entendi o enunciado, será que foi isso que ele quis dizer?
        {
            printf("\n      Tabuada do %d ao %d\n\n", NT2, NT3);
            for (NT2=NT2; NT2 >= NT3; NT2--)
            {
                for (IT=1; IT<=10; IT++)
                {
                    printf("\n%d x %d = %d", NT2, IT, NT2*IT);
                }
                if (IT = 10)
                {
                    printf("\n");
                }
            }
        }

PS: da um erro estranho quando manda fazer da tabuada do 1 ao 10, aparece a do 11 até o 10 também

Postado
Citação

Se n for menor que m, calcule a tabuada de m até n.

(Dica: use o laço for, com decremento da variável que controla o índice).

            i. Escreva o título Tabuada de 5 a 3.

Você por acaso tem como verificar se houve algum erro de digitação do professor nesse caso?

 

A frase "Se n for menor que m, calcule a tabuada de m até n." só faria sentido pra mim se fosse "Se m for menor que n, calcule a tabuada de m até n." (vai diminuindo até chegar em n)

 

Exemplo:

m -> 5

n -> 3

 

Tabuada do 5 ao 3

 

5 x 1 = 5

5 x 2 = 10

5 x 3 = 15

    : :

5 x 10 = 50

 

4 x 1 = 4

4 x 2 = 8

4 x 3 = 12

   : :

4 x 10 = 40

 

3 x 1 = 3

3 x 2 = 6

3 x 3 = 9

    : :

3 x 10 = 30

 

================================================= Caso inverso

 

Se n for menor que m, calcule a tabuada de n até m." (vai aumentando até chegar em m)

 

Tabuada do 3 ao 5

 

3 x 1 = 3

3 x 2 = 6

3 x 3 = 9

    : :

 

 

4 x 1 = 4

4 x 2 = 8

4 x 3 = 12

   : :

4 x 10 = 40

 

5 x 1 = 5

5 x 2 = 10

5 x 3 = 15

    : :

5 x 10 = 50

 

 

 

 

  • Curtir 1
Postado

@bart448 Eu não sei se o professor digitou errado mas pra mim só faz sentido dessa forma também

 

adicionado 3 minutos depois
4 minutos atrás, bart448 disse:

Você por acaso tem como verificar se houve algum erro de digitação do professor nesse caso?

 

A frase "Se n for menor que m, calcule a tabuada de m até n." só faria sentido pra mim se fosse "Se m for menor que n, calcule a tabuada de m até n." (vai diminuindo até chegar em n) //Mas como vai diminuir até chegar em n se o m é menor que n?

 

 

 

adicionado 27 minutos depois

Por que quando eu faço assim:

 

Digite aqui dois número inteiros: 1 ao 4 

 

porque sempre que o primeiro numero é menor que o segundo, aparece também a tabuada do 5 e a do quatro repetido por exemplo?

 

fica sempre assim:

 

Tabuada do 1 ao 4


1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9
1 x 10 = 10

2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
2 x 10 = 20

 

3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
3 x 10 = 30

 

4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36
4 x 10 = 40

 

      Tabuada do 5 ao 4


5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50

 

4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36
4 x 10 = 40

adicionado 28 minutos depois

quando o primeiro numero é maior que o segundo, funciona direitinho

adicionado 28 minutos depois

o que estou fazendo de errado?

 

  • Solução
Postado

@Ragnarbrody

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

int main(){
	int n=0, m,i,j;
	printf ("digite N e M:\n");
	scanf("%d %d", &n, &m);
	Sleep(2500);
	system ("cls");
	if (n<=m){
		printf("tabuada de %d ao %d", n,m);
		for (n=n; n<=m; n++){
			for (i=0;i<=m;i++){
			printf("\n%d * %d = %d", n,i,n*i);
			}
	}
}
	else{
		//printf("tabuada de %d ao %d", m,n);
}
}

 

  • Curtir 1
Postado

Desafio interessante.

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

int main() {
    int inicio = 0;
    int fim = 0;
    
    bool incremento = false;
    bool terminou = false;
    
    printf("Digite dois numeros inteiros (inicio fim): ");
    scanf(" %i %i%*c", &inicio, &fim);

    incremento = (inicio <= fim);

    // Escolha o comando de acordo com o sistema operacional
    //system("clear");    // Linux
    //system("cls");      // Windows

    printf("Tabuada do %i ao %i \n\n", inicio, fim);

    while (!terminou) {
        // Exibe a tabuada
        for (int x = 1; x <= 10; ++x) {
            printf("%2i X %2i = %3i \n", inicio, x, (inicio * x));
        }
        
        printf("\n");

        // Condicao de parada
        terminou = (inicio == fim);

        // Determina a movimentacao do inicio
        if (incremento) {
            inicio += 1;
        } else {
            inicio -= 1;
        }
    }

    return EXIT_SUCCESS;
}

Lógica: Fiz o início caminhar até o fim, seja incrementando ou decrementando.

  • Curtir 1
Postado

Uma forma alternativa com o operador ?:

 

Mas só por curiosidade já que talvez não seja uma forma tão otimizada e clara.

 

#include <stdio.h>

int main(void) {
  int n, m, i, j;

  scanf("%d %d", &n, &m);

  printf("Tabuada do %d ao %d:\n", n, m);
  
  for(j=n; n > m ? j>=m : j<=m; n > m ? j-- : j++){
      for(i=1; i<= 10; i++){
        printf("%d x %d = %d\n", j, i, j*i);
      }
    printf(": :\n");
  }

  return 0;
}

 

  • Curtir 1
Postado

@herbertbahia Isso foi basicamente o que fiz, mas usar o else ao invés de outro if resolveu o bug de exibir uma tabuada a mais, obrigado 

adicionado 7 minutos depois

@AdrianoSiqueira Eu entendi sua lógica, ficou boa, mas segundo o professor não posso utilizar variaveis booleanas, eu consegui resolver o problema, minha maior duvida é quanto ao enunciado do professor, porque não entendo como nas duas situação o n pode ser menor que m e mudar o que acontece, mas eu tenho umas duvidas referente ao seu método:

3 horas atrás, AdrianoSiqueira disse:

Desafio interessante.

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

int main() {
    int inicio = 0;
    int fim = 0;
    
    bool incremento = false;
    bool terminou = false;
    
    printf("Digite dois numeros inteiros (inicio fim): ");
    scanf(" %i %i%*c", &inicio, &fim); // porque após os '%i" existe esse *c?

    incremento = (inicio <= fim);

    // Escolha o comando de acordo com o sistema operacional
    //system("clear");    // Linux
    //system("cls");      // Windows

    printf("Tabuada do %i ao %i \n\n", inicio, fim);

    while (!terminou) { //esse aqui você quis dizer que enquanto a condição for diferente de terminou, ele vai executar a tabuada,
                       //certo? *não seria (!= terminou)?
                        
        // Exibe a tabuada
        for (int x = 1; x <= 10; ++x) { //aqui, se você faz o incremento antes da condição ele já soma antes de fazer a multiplicação pelo primeiro número, logo a tabuada começaria pelo número vezes o número 2, mas o método é parecido
            printf("%2i X %2i = %3i \n", inicio, x, (inicio * x));
        }
        
        printf("\n");

        // Condicao de parada
        terminou = (inicio == fim);

        // Determina a movimentacao do inicio
        if (incremento) {
            inicio += 1;
        } else {
            inicio -= 1;
        }
    }

    return EXIT_SUCCESS;
}

Lógica: Fiz o início caminhar até o fim, seja incrementando ou decrementando.

 

adicionado 9 minutos depois

@Midori a lógica eu imagino ser a mesma mas tem uma coisa que não entendi muito bem:

2 horas atrás, Midori disse:

Uma forma alternativa com o operador ?:

 

Mas só por curiosidade já que talvez não seja uma forma tão otimizada e clara.

 

#include <stdio.h>

int main(void) {
  int n, m, i, j;

  scanf("%d %d", &n, &m);

  printf("Tabuada do %d ao %d:\n", n, m);
  
  for(j=n; n > m ? j>=m : j<=m; n > m ? j-- : j++){ //esses pontos de interrogação serviriam como um if dentro do for? e como funcionaria? logicamente falando.
      for(i=1; i<= 10; i++){
        printf("%d x %d = %d\n", j, i, j*i);
      }
    printf(": :\n");
  }

  return 0;
}

 

 

adicionado 11 minutos depois

Mas quanto ao enunciado em si, o que vocês entenderam? ele errou na digitação? como seria possível uma situação em que caso n fosse menor ou igual que m fazer n até m e caso n for menor que m fazer de m até n, se nas duas situações o n é menor que o m?

  • Obrigado 1
Postado
21 minutos atrás, Ragnarbrody disse:

//esses pontos de interrogação serviriam como um if dentro do for? e como funcionaria? logicamente falando.

 

É similar ao If-else e é chamado de operador ternário, isso tem em várias linguagens de programação.

 

A sintaxe é, condição ? valor se verdadeiro : valor se falso

 

Exemplo, se a > b, condição verdadeira atribui 1 a x, caso contrário atribui 0  a x:

 

  x = a > b ? 1 : 0;

  printf("%d\n", x);

 

 

22 minutos atrás, Ragnarbrody disse:

Mas quanto ao enunciado em si, o que vocês entenderam? ele errou na digitação?

 

Me parece que foi erro mesmo e ele quis dizer "Se n for maior que m"

 

  • Curtir 1
  • Amei 1
Postado

@Midori

Citação

É similar ao If-else e é chamado de operador ternário, isso tem em várias linguagens de programação.

 

Entendo, eu consegui compreender a lógica, qual a vantagem de usar isso ao invés do if else?

 

e eu acho que o professor quis dizer o seguinte:

 

se n for menor ou igual a m, fazer do n até o m, Ex: 3 ao 5

e se n for maior que m, fazer ainda o n até o m, só que agora muda a ordem seria : 5 ao 3, porque ele usou um exemplo de saída colocando a tabuada do menor até o maior, então acho que ficaria assim.

Postado
25 minutos atrás, Ragnarbrody disse:

Entendo, eu consegui compreender a lógica, qual a vantagem de usar isso ao invés do if else?

Dependendo da situação o programador pode preferir usar essa notação para resumir uma condicional (para dos valores, por exemplo) numa única linha de forma mais simples.

 

25 minutos atrás, Ragnarbrody disse:

e eu acho que o professor quis dizer o seguinte:

 

se n for menor ou igual a m, fazer do n até o m, Ex: 3 ao 5

e se n for maior que m, fazer ainda o n até o m, só que agora muda a ordem seria : 5 ao 3, porque ele usou um exemplo de saída colocando a tabuada do menor até o maior, então acho que ficaria assim.

Eu também vi dessa forma.

  • Curtir 1
Postado

@Midori  Okay, entendi

Citação

Dependendo da situação o programador pode preferir usar essa notação para resumir uma condicional numa única linha de forma mais simples.

então isso é para quando eu tiver um programa consideravelmente extenso e quiser resumir o maximo possível?

 

 

e então o problema deve ter sido na digitação do professor, estou em contato com ele nesse instante, obrigado por tirar minhas duvidas.

Postado
32 minutos atrás, Ragnarbrody disse:

então isso é para quando eu tiver um programa consideravelmente extenso e quiser resumir o maximo possível?

Dependendo da complexidade nem sempre é viável usar esse método, mesmo que o código fique mais extenso.

 

A ideia é simplificar casos específicos que no momento da programação você vai acabar percebendo se é melhor usar ou não.

  • Obrigado 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!