Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 16.08.2017
Сообщений: 9

K&R Задание 1.9

16.08.2017, 22:43. Показов 3842. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго, учебник Кернигана и Ритча, задание гласит: напишите программу, копирующую символы ввода в выходной поток и заменяющую стоящие подряд пробелы на один пробел.
На форуме нашёл код выполняющий данную задачу за авторством anmartex
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main() {
    int ch, prev = 0;
 
    while ((ch = getchar()) != EOF) {
        if ((ch != ' ') || (prev != ' ')) {
            putchar(ch);
            prev = ch;
        }
    }
 
    return 0;
}
Но он использует логический оператор "или", а в учебнике ещё не было ни слова про логику. Вопрос в том, что можно ли сделать решение хоть и менее изящное, но без массивов и логических операторов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2017, 22:43
Ответы с готовыми решениями:

K&R Задание 1.14
Доброго времени суток. Задание: Напишите программу для вывода гистограммы частот, с которыми встречаются во входном потоке различные...

K&R задание 1.9 Решение с использованием символьного массива, почему не работает?
Здравствуйте! Изучаю язык и азы программирования по книге Ритчи. В ней встречается такое задание. Конечно, его можно просто решить через...

Что делает эта строчка: ++x &amp;&amp; ++y || ++z; ?
Что делает эта строчка? ++x &amp;&amp; ++y || ++z;

26
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
28.07.2019, 13:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от poppy1 Посмотреть сообщение
советую вначале научится ручками воспроизводить основные ф-ции
например взять <unistd.h> и использовать write\while\else\ и потом уже в обучении дальше, использовать их
примерно так
Не вижу смысла, пока, ковырять инет в поисках разбора вашего кода. Я просто читаю K&R и на основе прочитанного материала пишу код. На мой взгляд он полностью удовлетворяет требованиям поставленой задачи. Хотя и о системных вызовах мне тоже было бы интересно почитать, но это в рамках какой-нибудь другой книги или курса. Спасибо!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
28.07.2019, 15:17
Цитата Сообщение от Evg Посмотреть сообщение
Использовать на начальных этапах программирования стандартные функции для сортировки - на мой взгляд плохая идея. Хотя бы потому, что в некоторых языках их попросту нет.
...
Учить человека использовать стандартные функции для сортировки - это начать превращать его в идиота, который будет считать, что для написания тетриса достаточно в Builder'е мышкой втащить компонент TTetris на главное окно и задача на этом закончена.
Я бы так не сказал. Если в каком-то ЯП нет стандартной функции сортировки, на начальном этапе элементарного алгоритма сортировки пузырьком будет вполне достаточно. Если есть, и слава богу. Для решения задач, требующих сортировки, куда важнее понять что с чем и как сравнивать. Да и по поводу превращения в идиота в корне не согласен. Если человек изначально склонен к подобному идиотизму, будет пол-жизни гуглить этот самый TTetris, пытливый ум начнёт задаваться вопросом, можно ли сделать сортировку быстрее/проще/эффективнее (что бы это ни значило). К тому же очень быстро обнаружит, что в стандартной библиотеке не только нет реализации списков, но и использовать стандартную qsort со списком, мягко говоря, непросто, как его (список) ни напиши. Волей неволей, а таки прийдётся разбираться с разными алгоритмами. Но это всё позже. По началу же действительно гораздо важнее научиться составлять алгоритмы решения задач. При этом, повторюсь, гораздо важнее понимать, почему для решения задачи нужно отсортировать данные, чем как именно это должно происходить - стандартной функцией, или простеньким алгоритмом...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
28.07.2019, 19:08
Спор хорош только тогда, когда в нём может родиться истина. В нашем с тобой споре истина родиться не может по определению, т.к. это именно тот случай, когда истина у каждого своя. Да и вообще всё началось с того, что я qsort упомянул лишь как быстро попавшийся под руку пример совсем по другому поводу и в другом контексте. Как оказалось - неудачно, ибо это спровоцировало другой спор на пустом месте. Изначальная проблема - это посыл, что нужно пользоваться write'ом. Слава яйцам все сошлись во мнении, что это не правильно. Предлагаю на этом закончить
0
11 / 2 / 1
Регистрация: 01.11.2018
Сообщений: 42
28.07.2019, 19:24
Цитата Сообщение от Evg Посмотреть сообщение
Да, там эти знания окажутся полезными. И такие как ты люди пишут такие программы. И к 90% таких программ они не в состоянии даже внятный help написать.
В 2х словах. Почему для новичка нужен write
1) из write он может сделать такое
C
1
2
3
4
void pt_char(char c)
{
    write(1, &c, 1);
}
2) усложнит себе задачу и научится использовать поинтеры
C
1
2
3
4
5
6
7
8
9
void pt_str(char *str)
{
   int i =0;
   while(str[i] != '\0')
   {
        pt_char(str[i]);
        i++;
   }
}
3) исполнить ф-цию atoi и поймет о логических выражениях и как сама ф-ция работает изнутри.
4) наполнить жизнь маллоком.
и тд. хотя че я тут говорю, браузер не поддерживает write =\ вы не путайте 2 вещи, обучение и работу.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
28.07.2019, 20:01
Цитата Сообщение от poppy1 Посмотреть сообщение
1) из write он может сделать такое
Если уж пошла такая пьянка, то почему здесь нет обработки кода ошибки? Например, в случае EINTR

Цитата Сообщение от poppy1 Посмотреть сообщение
2) усложнит себе задачу и научится использовать поинтеры
Т.е. для печати строки вместо одного write будет исполнено множество write'ов. Абсолютно неправильный подход, если предполагается, что он должен научить чему-то полезному и правильному

Цитата Сообщение от poppy1 Посмотреть сообщение
3) исполнить ф-цию atoi
Противоречит твоей концепции использовать только низкоуровневые функции. Не понятно, почему использовать atoi это правильно, а printf - не правильно

Цитата Сообщение от poppy1 Посмотреть сообщение
4) наполнить жизнь маллоком
malloc и так используется во многих алгоритмах. Чтобы наполнить жизнь malloc'ом, абсолютно незачем начинать извращения на пустом месте
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
28.07.2019, 22:25
Цитата Сообщение от Evg Посмотреть сообщение
Спор хорош только тогда, когда в нём может родиться истина. В нашем с тобой споре истина родиться не может по определению, т.к. это именно тот случай, когда истина у каждого своя.
Разные подходы к обучению, каждый по-своему аргументирован. Интересно будет начинающему - почитает, определится, какой ему самому ближе и понятнее... Всё не зря.

Цитата Сообщение от poppy1 Посмотреть сообщение
Почему для новичка нужен write
Сейчас угадаю: чтобы с самого начала учиться писать нелепые велосипеды? Какой профит от такого использования системных функций ввода/вывода? Зачем вообще начинающему забивать голову такими вещами? Всему своё время. Научится печатать на экран + читать с клавы библиотечными функциями. Со временем дойдёт до того, чтобы узнать, что значит буферизированный ввод/вывод, когда буферизация - зло и как обходить её с помощью read/write...
0
11 / 2 / 1
Регистрация: 01.11.2018
Сообщений: 42
28.07.2019, 23:30
Цитата Сообщение от easybudda Посмотреть сообщение
Всему своё время.
гуру, Вы примерно сказали то, что я пытался донести)
Я в свое время просто сделал ошибку, когда в python погрузился. Дошел до определенного уровня и понял, что мне нужно Си и юникс. Без них не выполнимы те задачи. Вот поэтому, я пытаюсь донести новичку, как лучше стартануть. Иначе в свое время он тоже вернется к истокам, но там будет великий и беспощадный баш
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2019, 23:30

K&R 2.2 Напишите цикл, не используя || и &&
эквивалентный этому циклу for (i = 0; i &lt; lim-1 &amp;&amp; (c=getchar()) != '\n' &amp;&amp; c != EOF; ++i) s = c; Есть вот такое решение, прошу...

В чем отличие & и && ?
В чем отличие &amp; и &amp;&amp; ? например if (px == x &amp;&amp; py == y) и if (px == x &amp; py == y)

Матрица. Подсчитать количество строк, ВСЕ элементы которых >=6 && <=8
Дан табель отметок. Нужно посчитать количество хорошистов. (Отметки &gt;=6 &amp;&amp; &lt;=8) #include &lt;stdio.h&gt; #include &lt;clocale&gt; ...

Переписать цикл без использования операторов && и ||
Нижеприведенный цикл нужно написать без использования операторов &amp;&amp; и || : for(i = 0; i &lt; lim-1 &amp;&amp; (c = getchar()) != '\n'...

Каким можно заменить операцию &&
Приветствую #include&lt;stdio.h&gt; int main (void) { int a=5;b=60;c; c=a&amp;&amp;amp;b; printf(&quot;%d\n&quot;,c); return 0; } Подскажите...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru