Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
1

Ввод-вывод. Замена нескольких пробелов одним. Код и блок-схема прилагаются.

13.02.2012, 05:24. Просмотров 2792. Ответов 7
Метки нет (Все метки)

Учу С по Кернигану и Ричи. Упражнение 1-7. Напишите программу, которая копирует ввод на вывод, заменяя при этом каждую последовательность из одного или более пробелов на один пробел.
Составил блок-схему алгоритма и код, но программа не работает. Помогите, пожалуйста, найти ошибку. Заранее спасибо.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main() {
    int c;
    c=getchar();
    while(c != '.'){
        if (c=' ') {
            c=getchar();
            while(c=' ') c=getchar();
            printf(" ");
            putchar(c);
            c=getchar();
            }
        if (c != ' '){
            putchar(c);
            c=getchar();
            }
        }
    return 0;
    }
Подскажите, пожалуйста, где ошибка (не писать, что в ДНК ) - в алгоритме или только в его реализации? Как исправить?
0
Миниатюры
Ввод-вывод. Замена нескольких пробелов одним. Код и блок-схема прилагаются.  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2012, 05:24
Ответы с готовыми решениями:

Замена каждой строки, состоящей из одного или нескольких пробелов, одним пробелом
Здесь я бы хотел обратить внимание на важный момент. Я просматривал различные решения. Все они...

Замена нескольких пробелов одним
Народ, нужна ваша высококвалифицированная помощь. Нужно: написать функцию, в которую передаётся...

Замена группы пробелов одним
Помогите пожалуйста, в общем, нужно во введенной строке группы пробелов, ну тоесть &gt;1 заменить...

Замена нескольких пробелов на один
Пишу код. #include &lt;stdio.h&gt; /*копирование ввода, замена нескольких пробелов на один*/ main () ...

Замена нескольких пробелов подряд на один
Visual Studio 13. Надо заменить пару пробелов подряд на один. Использовать putchar и...

7
remarkes
303 / 226 / 15
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
13.02.2012, 06:46 2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h> // здесь ошибка - нет пробела
 
int main()
{
    int c;
    c = getchar();
    while (c != '.') {
        if (c == ' ') { // здесь была ошибка =
            c = getchar();
            while (c == ' ') // и здесь ошибка =
                c = getchar();
            printf(" ");
            putchar(c);
            c = getchar();
        }
        if (c != ' ') {
            putchar(c);
            c = getchar();
        }
    }
    return 0;
}
путаешь оператор равенства == (равны ли?) с оператором присваивания = (присвоить).
не забывай пользоваться кнопкой "пробел".
1
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
14.02.2012, 18:58  [ТС] 3
Спасибо, теперь всё работает.

Ещё есть такие вопросы по этой задаче, пробовал решить самостоятельно, но не вышло:
1. Как сделать, чтобы ввод заканчивался не точкой, как у меня, а переносом строки? Если вместо '.' в цикле while писать '\n', то тогда ввод не заканчивается вообще.
2. Вопрос относительно рациональности этого решения. Можно ли оптимизировать его, убрав какой-нибудь цикл или изменив что-нибудь другое?
0
remarkes
303 / 226 / 15
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
14.02.2012, 21:39 4
Цитата Сообщение от Sledovatel Посмотреть сообщение
Как сделать, чтобы ввод заканчивался не точкой, как у меня, а переносом строки?
Цитата Сообщение от Sledovatel Посмотреть сообщение
Можно ли оптимизировать его
думаю, так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
    int c;
    while ((c = getchar()) != '\n') {
        if (c == ' ') {
            putchar(c);
            c = getchar();
            while (c == ' ')
                c = getchar();
        }
        putchar(c);
    }
    return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от Sledovatel Посмотреть сообщение
то тогда ввод не заканчивается вообще.
потому что у тебя getchar() раставлены по всему коду, а в while проверяется только последний.
1
14.02.2012, 21:39
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
15.02.2012, 00:50  [ТС] 5
В оптимизации разобрался.

Цитата Сообщение от remarkes Посмотреть сообщение
потому что у тебя getchar() раставлены по всему коду, а в while проверяется только последний.
А вот этот момент не понял. Вы не могли бы поподробнее объяснить?
0
remarkes
303 / 226 / 15
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
15.02.2012, 13:36 6
примерно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        c = getchar(); // создал значение c
        while (c != '.') { // проверил значение c на \n
                if (c == ' ') { 
                        c = getchar(); // создал новое значение c
                        while (c == ' ') // проверил на пробел, но не проверил на \n
                                c = getchar(); // создал новое значение с
                        printf(" ");
                        putchar(c);
                        c = getchar(); // создал новое значение c, которое не проверяется на \n
                }
                if (c != ' ') { // <-- тут в принципе правильней поставить else
                        putchar(c);
                        c = getchar(); // создал новое значение c, которое проверится 
                }
        }
нижнюю часть кода лучше сделать так, потому что и в том и в другом случае у тебя в конце по две одинаковых функции:
C
1
2
3
4
5
6
7
if (c == ' ') {.... //код
             ...
                     ...printf(" ");
                } 
                putchar(c);
                c = getchar(); // создал новое значение c, которое проверится 
        }
2
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
21.02.2012, 19:05  [ТС] 7
Были проблемы с Интернетом, поэтому не написал раньше.

Вроде бы разобрался, но, думаю, окончательно пойму, когда поглубже изучу ввод-вывод и циклы.
Возможно, ещё появятся вопросы.
0
remarkes
303 / 226 / 15
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
23.02.2012, 13:31 8
Цитата Сообщение от Sledovatel Посмотреть сообщение
Возможно, ещё появятся вопросы.
пф... ну уж это как пить дать!
Мое имхо: очень тщательно изучайте основы, пытаясь их понять (осознать) до конца. не гонитесь за различными API, пока не выясните, как в языке все работает.
1
23.02.2012, 13:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2012, 13:31

Замена нескольких символов одним символом
Добрый день, форумчане. Возник такой вопрос: Нельзя ли с помощью StringReplace заменять...

Вывод нескольких пробелов
Как вывести на консоль (cmd) много пробелов (нужно, чтобы строка, длина которой (количество букв)...

Заменить в программе, переводящую строку в двоичный код, консольный ввод/вывод на файловый ввод/вывод
Добрый день! Помогите, пожалуйста, с программой. Программа считывает строку с клавиатуры и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru