Member 13618624 Ответов: 3

Я пишу программу для подсчета числа случаев


#include<stdio.h>
#include<conio.h>

int a,i,b,num;
int main()
{

scanf("%d",&a);

	for(i=0;i<10;i++)
{
	
	while(a!=0)
	{
		num=(a%10);
		if(num==i)
		{
			b++;
		}
		a=a/10;
	
	}

	printf(" %d number  %d  times\n",i,b);

}
	
	return 0;
}


Что я уже пробовал:

да но не работает не могли бы вы пожалуйста помочь выяснить что в нем не так

jeron1

При первом выходе из цикла while значение a равно нулю. Тогда в следующий раз, когда вы нажмете while оператор a все еще равен нулю.

3 Ответов

Рейтинг:
2

Thomas Daniels

Две проблемы:


  1. "а" делится до нуля, но значение никогда не сбрасывается.
  2. 'b' никогда не сбрасывается до нуля.

Чтобы устранить эти проблемы, можно создать дополнительную переменную c который вы будете использовать для выполнения деления на 10 и копирования a к нему в начале цикла и установить b к нулю в начале цикла, вот так:
int a, i, b, c, num;
int main()
{

	scanf("%d", &a);

	for (i = 0; i < 10; i++)
	{
		b = 0;
		c = a;
		while (c != 0)
		{
			num = (c % 10);
			if (num == i)
			{
				b++;
			}
			c = c / 10;
		}
		printf(" %d number  %d  times\n", i, b);
	}
	return 0;
}

Обратите внимание, что вы увидите неожиданные результаты, если входные данные больше максимального значения целого числа: целое число будет переполнение[^] и значение не будет тем, что вы ввели. Если вы хотите сделать это для числа с неограниченным количеством цифр, вам придется сохранить значение в строке и выполнить сравнение символов строки.


Рейтинг:
0

Patrice T

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.

#include<stdio.h>
#include<conio.h>

int a,i,b,num;
int main()
{
  scanf("%d",&a);

  for(i=0;i<10;i++)
  {

    while(a!=0)
    {
      num=(a%10);
      if(num==i)
      {
        b++;
      }
      a=a/10;
    }
    printf(" %d number  %d  times\n",i,b);
  }
  return 0;
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]
-----
Ваш алгоритм не эффективен, он делает в 10 раз больше работы.
Более эффективно использовать массив и подсчитывать цифры по мере их появления.
-----
Совет: Научитесь пользоваться отладчиком, это отличный инструмент обучения, который поможет вам найти ошибки.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
0

CPallini

Вы должны вхождение каждой цифры, начинающейся с одного и того же значения a то есть вам нужно сделать резервную копию. Попробуй

#include <stdio.h>

int main()
{

  int a, i;
  scanf("%d",&a);

  for(i=0;i<10;i++)
  {
    int tmp = a;
    int cnt = 0;
    int dgt;

    while(tmp != 0)
    {
      dgt = (tmp % 10);
      if ( dgt == i)
      {
        cnt++;
      }
      tmp = tmp / 10;
    }

    printf(" %d digit  %d  times\n", i, cnt);

  }

  return 0;
}