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

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

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

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

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

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

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

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

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

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

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

Ответы [ 30 ]

1 голос
/ 08 августа 2017

Вот как я думаю об алгоритме этого упражнения в псевдокоде:

define ch and bl (where bl is initially defined to be 0)

while ch is = to getchar() which is not = to end of file  
do the following:  
      if ch is = to blank and bl is = 0  
          --> output ch and assign the value 1 to bl  
      else --> if ch is = to blank and bl is = 1  
          --> do nothing  
      else --> output ch and assign the value 0 to bl

Пример реализации в C:

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

main() {

   long ch,bl=0;

   while ((ch=getchar()) != EOF)
   {
       if (ch == ' ' && bl == 0)
       {
           putchar(ch);
           bl=1;
       } else if (ch == ' ' && bl == 1) {
           // no-op
       } else {
           putchar(ch);
           bl=0;
       }
   }

   return 0;
}
1 голос
/ 15 января 2019

Использование ограничений не использовать операторы else или and. Этот код печатает пробел только тогда, когда переменная пробела равна 1, и единственный способ сбросить счетчик - ввести что-то, отличное от пробела. Надеюсь, это поможет:

включает

/ * Напишите программу, которая заменяет строки пробелов одним пробелом * /

void main () { int c, bl;

bl = 0;

while((c = getchar()) != EOF){
    if(c == ' '){
        ++bl;
        if(bl == 1){
            putchar(' ');
        }
    }
    if(c != ' '){
        putchar(c);
        bl = 0;
    }
}       

}

1 голос
/ 20 апреля 2016

Сначала объявите две переменные символ и last_character как целые числа. Когда вы не достигли конца файла (в то время как (symbol = getchar ()! = EOF) сделайте это; 1. Если символ! = '' Тогда печатный символ last_character = персонаж 2. Если символ == '' if last_character == '' последний символ = символ еще печатать символ

0 голосов
/ 04 марта 2018
// K & R Exercise 1.9
// hoping to do this with as few lines as possible 

int c = 0, lastchar = 0;
c = getchar();
while (c != EOF) {
  if (lastchar != ' ' || c != ' ') putchar(c);
  lastchar=c;
  c=getchar();
}
0 голосов
/ 09 августа 2017
/*a program that copies its input to its output, replacing each string of one or more blanks by a single blank*/

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

int main(void)
{
    double c;
    char blank = ' ';

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

                while(( c = getchar() )== ' ')      

                    {
                    if(c != ' ')                    
                    break;
                    }
            }




        if(c == '\t')                               
            {
                putchar(blank);                     
                    while((c = getchar()) == '\t')  

                    {
                    if(c != '\t')                   
                    break;
                    }
            }

    putchar(c);                                     
    }

return 0;
}
0 голосов
/ 22 июня 2017
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
 int c, flag=0;

   while((c=getchar()) != EOF){

      if(c == ' '){
         if(flag == 0){
            flag=1;
            putchar(c);
        }
    }else{
        flag=0;
        putchar(c);
     }

   }

  return 0;

}

Надеюсь, это поможет.

0 голосов
/ 14 мая 2017

Это решение, использующее только методы, описанные в K & R's C .В дополнение к использованию переменной для достижения конечного изменения состояния для различения первого пробела от последовательных пробелов, я также добавил переменную для подсчета пробелов вместе с оператором печати для проверки общего числа,Это помогло мне немного лучше обернуть голову вокруг getchar() и putchar(), а также в область действия цикла while внутри main ().

// Exercise 1-9. Write a program to copy its input to its output, replacing
//               each string of one or more blanks by a single blank.

#include <stdio.h>

int main(void)
{
    int blank_state;
    int c;
    int blank_count;

    printf("Replace one or more blanks with a single blank.\n");
    printf("Use ctrl+d to insert an EOF after typing ENTER.\n\n");

    blank_state = 0;
    blank_count = 0;
    while ( (c = getchar()) != EOF )
    {
        if (c == ' ')
        {
            ++blank_count;
            if (blank_state == 0)
            {
                blank_state = 1;
                putchar(c);
            }
        }
        if (c != ' ')
        {
            blank_state = 0;
            putchar(c);
        }
    }

    printf("Total number of blanks: %d\n", blank_count);

    return 0;
}
0 голосов
/ 29 августа 2014
#include <stdio.h>   
main()
{
    int CurrentChar, LastChar;
    LastChar = '1';
    while ((CurrentChar = getchar()) != EOF)
    {
        if (CurrentChar != ' ')
        {
            putchar(CurrentChar);
            LastChar = '1';
        }
        else
        {
            if (LastChar != ' ')
            {
                putchar(CurrentChar);               
                LastChar = ' ';
            }                   
        }   
    }
}
0 голосов
/ 30 января 2016

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

Я придумал кусок кода, который использует только то, что было объяснено до выполнения упражнения (поскольку я не обращаюсь к каким-либо другим ресурсам, а просто играю с кодом).

Существует цикл while для анализа текста и один if для сравнения текущего символа с предыдущим. Есть ли крайние случаи, когда этот код не будет работать?

#include <stdio.h>

main() {

    // c    current character
    // pc   previous character
    int c, pc;

    while ((c = getchar()) != EOF) {
        // A truthy evaluation implies 1 
        // (learned from chapter 1, exercice 6)
        // Avoid writing a space when 
        //  - the previous character is a space (+1)
        //  AND
        //  - the current character is a space (+1)
        // All the other combinations return an int < 2
        if ((pc == ' ') + (pc == c) < 2) {
            putchar(c);
        }
        // update previous character
        pc = c;
    }

}
0 голосов
/ 17 августа 2013
#include <stdio.h>

main() {
    int input, last = EOF;
    while ((input = getchar()) != EOF) {
       if (input == ' ' && last == ' ') continue;
       last = input; 
       putchar(input);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...