Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
1

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

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

Author24 — интернет-сервис помощи студентам
Учу С по Кернигану и Ричи. Упражнение 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2012, 05:24
Ответы с готовыми решениями:

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

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

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

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

7
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 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
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
14.02.2012, 18:58  [ТС] 3
Спасибо, теперь всё работает.

Ещё есть такие вопросы по этой задаче, пробовал решить самостоятельно, но не вышло:
1. Как сделать, чтобы ввод заканчивался не точкой, как у меня, а переносом строки? Если вместо '.' в цикле while писать '\n', то тогда ввод не заканчивается вообще.
2. Вопрос относительно рациональности этого решения. Можно ли оптимизировать его, убрав какой-нибудь цикл или изменив что-нибудь другое?
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 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
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
15.02.2012, 00:50  [ТС] 5
В оптимизации разобрался.

Цитата Сообщение от remarkes Посмотреть сообщение
потому что у тебя getchar() раставлены по всему коду, а в while проверяется только последний.
А вот этот момент не понял. Вы не могли бы поподробнее объяснить?
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 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
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
21.02.2012, 19:05  [ТС] 7
Были проблемы с Интернетом, поэтому не написал раньше.

Вроде бы разобрался, но, думаю, окончательно пойму, когда поглубже изучу ввод-вывод и циклы.
Возможно, ещё появятся вопросы.
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
23.02.2012, 13:31 8
Цитата Сообщение от Sledovatel Посмотреть сообщение
Возможно, ещё появятся вопросы.
пф... ну уж это как пить дать!
Мое имхо: очень тщательно изучайте основы, пытаясь их понять (осознать) до конца. не гонитесь за различными API, пока не выясните, как в языке все работает.
1
23.02.2012, 13:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2012, 13:31
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru