Nuruddin Warsi Ответов: 4

C программа для печати количества символов в соответствии с подсчетом


Вы представляете собой закодированную форму строки данных следующим образом: последовательная
вхождения буквы (до 9) представлены буквой
далее следует количество вхождений.

Например, строка

a9a3b2c4de

расшифровывается как струна

aaaaaaaaaaaabbccccdc

- то есть 12 последовательных вхождений a, за которыми следуют 2 bs, а затем
4 cs, за которыми следуют A d и, наконец, c

Учитывая закодированную форму, вы должны вывести строку данных.

Он не входит в два условия if


[править]порядок, блоком кода добавил, отступы отсортированный, паразитные пустые строки удалены - OriginalGriff[/правка]

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

#include<stdio.h>
int main()
    {
    int i,n,s;
    char a[100];
    scanf("%d",&s);
    for(i=0;i<s;i++)
        {
        scanf("%c",&a[i]);
        }
    for(i=0;i<s;i++)
        { 
        if((a[i]>='a' && a[i]<='z')&&(a[i+1]>='a'&& a[i+1]<='z'))
            {
            printf("%c",a[i]);
            }
        else if((a[i]>='a' && a[i]<='z') &&(a[i+1]>='2' && a[i+1]<='9'))
            {
            n=a[i+1];
            while(n>0)
                {
                printf("%c",a[i]);
                n=n-1;
                }
            }
        }
    if(a[s-1]>='a'&& a[s-1]<='z')
        {
        printf("%c",a[s-1]);
        }
    return 0;
    }

4 Ответов

Рейтинг:
2

Patrice T

Совет научитесь правильно отступать в своем коде, это помогает чтению. Вижу ваш вопрос.
Редакторы программистов имеют такие возможности.
Блокнот++ Главная Страница[^]
личные[^]

Ваши тренировки-это Кодировка длины пробега - Википедия[^].

Так как вы работаете с позициями i и i+1, вам нужно остановить цикл на 1 шаг раньше.

Цитата:
Он не входит в два условия if

Когда вы не понимаете, почему ваш код не делает то, что вы ожидаете, ответ таков: отладчик

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

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

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


Рейтинг:
2

Member 14523825

#включить<stdio.h>
#include<string.h>
тап_п()
{
инт кол-во;
char b;
while(scanf("%c %d",&b,&num)==2)
{
время(кол-во--)
{
printf("%c",b);
}
}
возвращает 0;
}


CHill60

Домашнее задание из этого вопроса давно назрело, и выполнение чужого домашнего задания никому не помогает

Рейтинг:
1

OriginalGriff

Я сделал отступы для вашего кода, так что его легче читать.
Но... Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

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

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик teh, чтобы выяснить, почему. Поставить точку останова на строке:
myaverage.DisplayAverage();

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!

Да, я, вероятно, мог бы сказать вам, в чем "проблема" - но это не трудно сделать самому, и вы узнаете что-то действительно стоящее в то же время!

Начните с точного следования тому, что происходит, когда начинаются ваши циклы: каковы значения переменных. (Поверьте мне, это довольно большой намек!)


Рейтинг:
1

CPallini

Есть (по крайней мере :-) ) две проблемы с вашим кодом.

  1. Болтающийся символ новой строки в scanf (см., например: Как избежать "висячей" новой строки при чтении односимвольного пользовательского ввода[^])
  2. Неправильная интерпретация прочитанной цифры: если Вы читаете '4' тогда вам придется повторить ('4'-'0') раз


Попробуй
#include <stdio.h>
int main()
{
  int i,n,s;
  char a[100];

  scanf("%d",&s);
  for(i=0;i<s;i++)
  {
    scanf(" %c",&a[i]);
  }

  for(i=0;i<s;i++)
  {
    if((a[i]>='a' && a[i]<='z')&&(a[i+1]>='a'&& a[i+1]<='z'))
    {
      printf("%c",a[i]);
    }
    else if((a[i]>='a' && a[i]<='z') &&(a[i+1]>='2' && a[i+1]<='9'))
    {
      n=a[i+1]-'0';
      while(n>0)
      {
        printf("%c",a[i]);
        n=n-1;
      }
    }
  }

  if(a[s-1]>='a'&& a[s-1]<='z')
  {
    printf("%c",a[s-1]);
  }
  printf("\n");
  return 0;
}