Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2012, 17:39   #21
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

pu6ka, если вы позволите, я в таком форматировании текст вашей программы запишу:
Код:
#include <stdio.h>

// замена нескольких подряд стоящих пробелов на один
main()
{
    int c, ns = 0;

    while ((c = getchar()) != EOF ) {
        if (c != ' ') {
            ns = 0;         // если след.символ не пробел, обнулим счетчик
        }
        if (c == ' ') {
            ++ns;           // если след.символ пробел, увеличим счетчик на единицу
        }
        if (ns <= 1) {
            putchar (c);    // если счетчик до единицы, печатаем
        }
    }
}
Алгоритм вы всё-таки отличный придумали:


Я выёживался, как мог, но улучшить его пока не смог.

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

P.S. Ничего не выйдет с многострочным вводом, так как символы мы не можем хранить. Потому что массивы ещё "неизвестны". Можно, конечно, завести переменные в количестве N штук (общее количество символов) и предупреждать пользователя, что строка не больше K символов и количество строк не больше M. Думаю, так делать не стоит. Так что победила программа pu6ka!

Последний раз редактировалось 8Observer8; 22.03.2012 в 22:58. Причина: Добавил P.S.
8Observer8 вне форума Ответить с цитированием
Старый 25.03.2012, 17:19   #22
REdyX
Новичок
Джуниор
 
Регистрация: 25.03.2012
Сообщений: 2
По умолчанию

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

Код:
#include <stdio.h>
#include <tchar.h>

main(){
	int c;
	int cl;
	cl=0;
	while ((c=getchar()) != EOF){
		if (c==' '){
			cl++;
			if (cl<2)
				putchar(c);
		}
		else{
			putchar(c);
			cl=0;
		}
	}
	system("PAUSE");
	return 0;
}
REdyX вне форума Ответить с цитированием
Старый 25.03.2012, 17:24   #23
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

REdyX, так нельзя, так как конструкцию else мы ещё "не знаем". Она появляется только в следующем параграфе книги.
8Observer8 вне форума Ответить с цитированием
Старый 25.03.2012, 17:46   #24
REdyX
Новичок
Джуниор
 
Регистрация: 25.03.2012
Сообщений: 2
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
REdyX, так нельзя, так как конструкцию else мы ещё "не знаем". Она появляется только в следующем параграфе книги.
Хорошо, допустим без else, все равно более наглядно, так как участвует вложенность.

Код:
#include <stdio.h>
#include <tchar.h>

main(){
	int c;
	int cl;
	cl=0;
	while ((c=getchar()) != EOF){
		if (c==' '){
			cl++;
			if (cl<2)
				putchar(c);
		}
		if (c != ' '){
			putchar(c);
			cl=0;
		}
	}
	system("PAUSE");
	return 0;
}
REdyX вне форума Ответить с цитированием
Старый 29.06.2012, 13:39   #25
xcx
Новичок
Джуниор
 
Регистрация: 29.06.2012
Сообщений: 2
По умолчанию

хм... тема наверное уже не актуальна, но вставлю свои 5 копеек.
я 1,9 в свое время так написал:

Код:
#include <stdio.h>

int main(){
	int c,b=0;
	
	while((c=getchar())!=EOF){
		if(c==' '){
			if(b!=' ') putchar(' ');	
		}
		if(c!=' ') putchar(c);
		b=c;	
	}
        return 0;
}

Последний раз редактировалось xcx; 29.06.2012 в 14:02.
xcx вне форума Ответить с цитированием
Старый 29.06.2012, 13:45   #26
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2xcx
и допустил распространенную ошибку

она еще осталась
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 29.06.2012 в 15:24.
pproger вне форума Ответить с цитированием
Старый 29.06.2012, 14:04   #27
xcx
Новичок
Джуниор
 
Регистрация: 29.06.2012
Сообщений: 2
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
и допустил распространенную ошибку
Постараюсь догадаться.
Не int ли должно быть всесто char?
xcx вне форума Ответить с цитированием
Старый 29.06.2012, 15:24   #28
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2xcx
Цитата:
Постараюсь догадаться.
Не int ли должно быть всесто char?
именно.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 08.07.2012, 19:13   #29
Kaela
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 36
По умолчанию

эм
собственно захотел внести свою лепту по 9 упражнению

Код:
#include <stdio.h>
using namespace std;

int main()
{
int c, nforspaces = 0;
while ( (c = getchar()) != EOF)
  {
      if ( c != ' ' ) { putchar(c); nforspaces; }
      if ( c == ' ' && nforspaces == 0 ) { putchar(c); nforspaces++; }
  }
}

Последний раз редактировалось Kaela; 08.07.2012 в 19:27.
Kaela вне форума Ответить с цитированием
Старый 05.11.2012, 23:47   #30
tungsten
Пользователь
 
Регистрация: 05.11.2012
Сообщений: 16
По умолчанию

интересно год назад буквально прорешал задачки вплоть до 1.19
вот моя версия 1.9
Код:
#include <stdio.h>
main()
{
int c,pc; /* Char, PrevChar */
pc = EOF;
    while ((с=getchar()) != EOF) {
        if (c==' '){
            if (pc != ' ')
                putchar(c);
            }
        if (c != ' ')
                putchar(c);
        pc=c;
    }
}
смотрю не один я так решил видимо это решение есть правильное.

скажите, друзья как вы поняли постановку задачи 1.20?
что делать с табуляторами которые стоят в середине\конце строки и дополняют ее(строку) не 8-мью символами (допустим это значение ТАБ по умолчанию) а например 3-мя, тоесть строка заканчивается на позиции 21, если мы жмем ТАБ курсор становится на позицию 24.
стоит написать процедуру определения "остатка пробелов" до ближайшего справа места табулятора, ведь мы же "незнаем" о матфункции "остаток от деления"?

Последний раз редактировалось tungsten; 06.11.2012 в 00:05.
tungsten вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Упражнения c# veter48 Помощь студентам 0 12.07.2011 18:53
[Си] Упражнения Fobo5 Помощь студентам 1 02.02.2011 21:22
(С) Простое упражнение из Кернигана, Ричи. Пробелы Матвейка Помощь студентам 1 07.06.2009 12:37
Упражнения делфи MAKEDON Свободное общение 1 26.08.2008 02:31