K & R Упражнение 1-9 (C) - PullRequest
       48

K & R Упражнение 1-9 (C)

18 голосов
/ 22 июля 2010

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

Я предполагаю, что под этим он подразумевает что-то вроде ...

Мы (пустой) (пробел) (пробел) 1011 * идти * (пробел) до (пробел) (пробел) (пробел) The (пусто) торговый центр!

... и выведите его как:

Мы (пустой) 1027 * идти * (пробел) до (пробел) The (пусто) торговый центр!

Возможно, это проще, чем я себе представляю, но, тем не менее, я не могу понять это. Мне не очень нужен код ... тем более псевдокод .

Кроме того, как я должен смотреть на это? Я почти уверен, что любой программе, которую я напишу, понадобится хотя бы один variable, цикл while, пара операторов if, и он будет использовать функции getchar() и putchar() ... кроме того, я в растерянности. На самом деле у меня пока нет мыслителей, поэтому, если бы вы могли дать мне несколько советов о том, как я должен смотреть на «проблемы» в целом, это было бы здорово.

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

Ответы [ 30 ]

0 голосов
/ 02 ноября 2015

Я также начинаю с учебника K & R, и я нашел решение, которое использует только материал, который был рассмотрен до этого момента.

Как это работает:

Во-первых, установите некоторые счетчики «пробелов» на ноль. Используется для подсчета пробелов.

Если пробел найден, увеличьте счетчик «пробелов» на единицу.

Если пробел не найден, то сначала проведите подтест: счетчик «заготовок» равен или больше 1? Если да, то сначала напечатайте пробел, а после этого установите счетчик «заготовок» на ноль.

После того, как этот подтест завершен, вернитесь и вставьте символ, который не был найден пустым.

Идея состоит в том, чтобы перед размещением непустого символа сначала выполнить тест, чтобы увидеть, были ли подсчитаны некоторые пробелы ранее. Если раньше были пробелы, сначала напечатайте одну пробел, а затем сбросьте счетчик пробелов. Таким образом, счетчик снова равен нулю для следующего раунда пробелов. Если первый символ в строке не является пробелом, счетчик не мог увеличиться, поэтому пробел не печатается.

Одно предупреждение, я не слишком углубился в книгу, поэтому я еще не знаком с синтаксисом, поэтому возможно, что фигурные скобки {} могут быть написаны в разных местах, но мой пример работает нормально.

#include <stdio.h>

/* Copy input to output, replacing each string of one or more blanks by a single blank. */

main()
{
    int c, blanks;

    blanks = 0;
    while ((c = getchar()) != EOF) {
        if (c != ' ') {
            if (blanks >= 1)
                printf(" ");
                blanks = 0;
            putchar(c); }
        if (c == ' ')
            ++blanks;
    }
}
0 голосов
/ 31 июля 2014

Я в той же точке в книге. и мое решение состоит в том, чтобы сделать счетчик ++, если пробел найден, и вернуть счет к нулю, если найдено что-то кроме пустого.

Для оператора if я ставлю еще одну проверку для проверки значения счетчика (если равен нулю) и затем печатаю.

Хотя на данном этапе обучения я не должен беспокоиться об эффективности двух методов, но о том, какой из них эффективен.

Мой код выглядит следующим образом:

#include <stdio.h>


main()
{
    int count=0,c;
    for( ; (c=getchar())!=EOF; )
    {
        if(c==' ')
        {
            if(count==0)
            {
                putchar(c);
                count++;
            }
        }
        if(c!=' ')
        {
            putchar(c);
            count=0;
        }


    }
}
0 голосов
/ 15 июля 2015
#include <stdio.h>
int main(void)
{
        long c;
        long nb = 0;
        while((c = getchar()) != EOF) {
                if(c == ' ' || c == '\t') {
                        ++nb;
                } else {
                        if(nb > 0) {
                                putchar(' ');
                                nb = 0;
                        }

                        putchar(c);
                }
        }
        return 0;
}
0 голосов
/ 28 мая 2015

способ облегчить жизнь новым людям, застрявшим в этой книге (не зная ничего, что поднялось до страницы 22 в K & R).

кредиты @Michael, @Mat и @Matthew, чтобы помочь мне понять

#include <stdio.h>
main()
{
 int c;

while ((c = getchar()) != EOF) /* state of "an input is not EOF" (1) */ 
 {
        if (c == ' ') /* "blank has found" -> change the rule now */
        {
          while ((c = getchar ()) == ' '); /* as long you see blanks just print for it a blank until rule is broken (2) */
          putchar(' ');
        }
   putchar(c); /* either state (2) was broken or in state (1) no blanks has been found */
  }
}
0 голосов
/ 04 мая 2018

Я только начал книгу, и вот решение, которое я нашел, используя 3 оператора if, надеюсь, это достаточно ясно:

0 голосов
/ 15 октября 2016
for(nb = 0; (c = getchar()) != EOF;)
{
    if(c == ' ')
       nb++;
    if( nb == 0 || nb == 1 )
       putchar(c);
    if(c != ' '  &&  nb >1)
       putchar(c);
    if(c != ' ')
       nb = 0;
 }
0 голосов
/ 11 января 2019

Учитывая то, что было задано в вопросе, я также позаботился о том, чтобы программа работала гладко в случае различных вкладок, пробелов, а также когда они объединяются в клубы для формирования различных комбинаций! Вот мой код,

int c, flag = 1;
    printf("Enter the character!\n");
    while ((c = getchar()) != EOF) {
    if (c == ' '||c == '\t') {
        c=getchar();
        while(c == ' '|| c == '\t')
               {
                   c = getchar();
               }
        putchar(' ');
        if (c == EOF) break;
    }
    putchar(c);
}

Не стесняйтесь запускать все тестовые примеры, используя различные комбинации пробелов и табуляций.

0 голосов
/ 12 февраля 2017

Вот мой ответ, я в настоящее время нахожусь в том же месте, где вы были годы назад.

Я использовал только тот синтаксис, которому научили до этого момента в книгах, и он сокращает несколько пробелов в один пробел только по мере необходимости.

#include<stdio.h>
int main(){
    int c
    int blanks = 0; // spaces counter
    while ((c = getchar()) != EOF) {        
        if (c == ' ') { // if the character is a blank
            while((c = getchar()) == ' ') { //check the next char and count blanks

                blanks++;

                // if(c == EOF){
                // break;
                // }
            }            
            if (blanks >= 0) { // comparing to zero to accommodate the single space case, 
                               // otherwise ut removed the single space between chars
                putchar(' '); // print single space in all cases                    
            }

        }
        putchar(c); //print the next char and repeat        
    }


    return 0;
}

Я удалил часть разрыва, так как она еще не была представлена ​​в книге, надеюсь, это поможет таким новичкам, как я:)

0 голосов
/ 16 октября 2015

Чтобы сделать это, используя только циклы while и операторы if, нужно добавить переменную, которая запоминает предыдущий символ.

Loop, reading one character at a time, until EOF:
    If the current character IS NOT a space:
        Output current character

    If the current character IS a space:
        If the previous character WAS NOT a space:
            Output a space

    Set previous character to current character

В коде C:

#include <stdio.h>

main()
{
    int c, p;

    p = EOF;

    while ((c = getchar()) != EOF) {
        if (c != ' ')
            putchar(c);

        if (c == ' ')
            if (p != ' ')
                putchar(' ');

        p = c;
    }
}
0 голосов
/ 13 августа 2014
1.Count the number of blanks.
2.Replace the counted number of blanks by a single one.
3.Print the characters one by one.

<code>
main()
{
    int c, count;
    count = 0;
    while ((c = getchar()) != EOF)
    {
        if (c == ' ')
        {
            count++;
            if (count > 1) 
            {
                putchar ('\b');
                putchar (' ');
            }
            else putchar (' ');
        }
        else 
        {
            putchar (c);
            count = 0;
        }
    }
    return;
}
</code>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...