278 / 174 / 21
Регистрация: 10.07.2011
Сообщений: 441

Консультация по решенным упражнениям.

10.07.2011, 10:41. Показов 3714. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день форумчане.
Хотел бы в первую очередь поздороваться. Принимайте в ряды начинающих, пока еще хэллоувордщиков, на Си.

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

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

Просьба к знатокам проверить и при желании высказаться. Сильно уж не ругайте. 3 дня только как занимаюсь. Спасибо всем заранее.

З.Ы. В коде умышленно не используется sizeof(); т.к. в лекции перед заданиями данная функция не обсуждалась.
Собственно код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
 
/* Функция используется для опредения длины строки и 
дальнейшего создания массива с длиной по возвращаемому значению*/
int stringLength(str) 
char str[];
{
    int i;
    for(i=0; str[i] != '\0'; ++i)
        ;
    return i;
}
 
/* Функция проверяющая строку на наличие повторяющихся пробелов и табуляций 
и удаляющая все пробелы и табуляции в конце строки*/
int deleteSpacesAtTheEnd(stToTrim)
char stToTrim[];
{
    int stringLen, i, j, lastCharIndex;
    char resultString[stringLen];
    stringLen = stringLength(stToTrim);
    lastCharIndex = j = 0;
 
    for(i = 0; stToTrim[i] != '\0'; ++i) {
        if(stToTrim[i] != ' ' && stToTrim[i] != '\t') {
            if(lastCharIndex < i) {
                resultString[j] = stToTrim[lastCharIndex + 1];
                ++j;
            }
            resultString[j] = stToTrim[i];
            ++j;
            lastCharIndex = i;
        } else {
            for( ; stToTrim[i] == ' ' || stToTrim[i] == '\t'; ++i)
                ;
            --i;
        }
    }
    resultString[j] = '\0';
    
    printf("%s",resultString);
    return 0;
}
 
/*Вызов может быть например таким*/
int main()
{
    deleteSpaces("stroka    dlya       testa     ");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.07.2011, 10:41
Ответы с готовыми решениями:

Уточнения по уже решенным задачам
148) Как на рисунках показать что сумма всех сил равна 0 (если есть возможность то хотелось бы пример) 235) Покажите на рисунке...

Ответы к упражнениям из книги Сэджвика "Фундаментальные алгоритмы на С++" части 1-4
Привет! Читаю данную книгу, в конце каждой главы имеются упражнения, но нет ответов на них. На решение некоторых задач просто нехватает...

Есть ли ответы к упражнениям книги "Алгоритмы" автор С. Дасгупта?
Добрый день Скажите, где можно получить решения упражнений для книги &quot;Алгоритмы&quot; автор С. Дасгупта. На любом языке. Упражнения...

29
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
11.07.2011, 18:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от greeezz Посмотреть сообщение
Напишите программу entab, которая заменяет строки пробелов минимальным числом табуляций и пробелов, достигая при этом тех же самых промежутков. Используйте те же табуляционные остановки, как и в detab.
На мой взгляд программа работает не верно. Она заменяет 4 пробела в любом месте на одну табуляцию, тогда как чтобы сохранились отступы надо учитывать позиции, где находятся эти пробелы.
Например такие строки (пробелы показаны точками)
1....6 должна получится 1 табуляция и один пробел
12....7 табуляция и 2 пробела
123....8 либо табуляция и 3 пробела, либо 4 пробела
1234....9 вот здесь только табуляция
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
11.07.2011, 18:45

Не по теме:

Приятно читать, глаз радует стиль кода в частности и оформления постов в целом


grizlik78, верное замечание.

Добавлено через 6 минут
Цитата Сообщение от greeezz Посмотреть сообщение
По поводу современного компилятора. Может подскажите. Понимаю что вопрос наверно замыленый, но все же. Сами какой предпочитаете?
GCC под Linux и его порт MinGW под Windows.
Цитата Сообщение от greeezz Посмотреть сообщение
у меня сейчас GNU GCC.
Актуальными можно считать версии выше 4.3.x, проверьте свою и обновите в случае необходимости.
Цитата Сообщение от greeezz Посмотреть сообщение
C
1
for(j = newspaces + tabs; j > 0; --j) {
А вот такие циклы я не люблю Когда приходиться начинать использовать беззнаковые числа вместо знаковых, они перестают работать. Но это вовсе не минус, то есть не повод не использовать их.
1
278 / 174 / 21
Регистрация: 10.07.2011
Сообщений: 441
11.07.2011, 19:11  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
На мой взгляд программа работает не верно. Она заменяет 4 пробела в любом месте на одну табуляцию, тогда как чтобы сохранились отступы надо учитывать позиции, где находятся эти пробелы.
Например такие строки (пробелы показаны точками)
1....6 должна получится 1 табуляция и один пробел
12....7 табуляция и 2 пробела
123....8 либо табуляция и 3 пробела, либо 4 пробела
1234....9 вот здесь только табуляция
Во всех ваших примерах содержится по 4 пробела внутри строки. Если полагать что табуляция это 4 пробела, то как можно для сохранения имеющихся отступов между словами туда поставить что-то больше чем одна табуляция или 4 пробела.

Полагаю что я что-то не правильно понял. Буду благодарен за уточнение.
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
11.07.2011, 19:57
Табуляция не заменяет 4 пробела. Она заполняет пустотой пространство до ближайшей позиции табуляции (табуляционной остановки). Эти позиции находятся на расстоянии, кратном интервалу табуляции, в данном случае, кратном 4.
Если нумеровать позиции с нуля, то пространство, занимаемое табуляциями вставленными на позициях 0, 1, 2, 3 будет заканчиваться в одном и том же месте, а именно в начале позиции 4.
Аналогично с позиций 4, 5, 6, 7 — в начале позиции 8, и так далее.
Проверить это можно в любом текстовом редакторе.
1
278 / 174 / 21
Регистрация: 10.07.2011
Сообщений: 441
12.07.2011, 02:47  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Табуляция не заменяет 4 пробела. Она заполняет пустотой пространство до ближайшей позиции табуляции (табуляционной остановки).
Поправил (переписал) код с учетом замечаний по табуляции и отступам. Буду рад услышать комментарии.
Заранее спасибо!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#define TABLEN 8 /*длина табуляции*/
 
void entab()
{
    int ch, cursor, spaces, spaceForTab, tabs;
    spaces = spaceForTab = tabs = 0;
    for(cursor = 0; (ch = getchar()) != EOF; cursor++) {
        if(ch == ' ' && ch != '\n') {
            if((cursor % TABLEN) == 0 || spaceForTab > 0) {
                ++spaceForTab;
                if(spaceForTab == TABLEN) {
                    ++tabs;
                    spaceForTab = 0;
                }
            } else {
                 putchar(ch);
            }
 
        } else if(ch != ' ') {
            if(spaceForTab > 0 || tabs > 0) {
                if (spaceForTab > 0) {
                    spaces = spaceForTab;
                    spaceForTab = 0;
                }
                while(tabs + spaces > 0) {
                    if(tabs > 0) {
                        putchar('\t');
                        --tabs;
                    } else if (spaces > 0) {
                        putchar(' ');
                        --spaces;
                    }
                }
            }
            putchar(ch);
        }
        if(ch == '\n') {
            cursor = -1;
        }
    }
}
 
 
int main()
{
    entab();
    return 0;
}
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.07.2011, 03:46
Стало лучше, в том смысле, что теперь отступы сохраняются. Но пробелы вплоть до первой табуляционной остановки остаются пробелами, и лишь последующие заменяются табуляциями. Хотя начальные пробелы тоже можно табуляцией заменить.
А ещё, есть ощущение, что это можно сделать компактнее и проще. Но это ощущения только, пока не проверял
1
278 / 174 / 21
Регистрация: 10.07.2011
Сообщений: 441
13.07.2011, 07:11  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Но пробелы вплоть до первой табуляционной остановки остаются пробелами,
Да точно... .. если строка не начинается с пробела то до первой табуляции будут пробелы.
Пока оставлю в таком виде. Позже постораюсь вернуться к задаче.
0
278 / 174 / 21
Регистрация: 10.07.2011
Сообщений: 441
14.07.2011, 07:47  [ТС]
Господа специалисты, они же профессионалы.

Задача
Напишите функцию strrindex (s, t), которая бы возвращала
индекс самого правого вхождения строки t в s, либо -1, если такой строки в s нет.


С удовольствием проанализирую любые замечания || мнения .

Получилась следующая реализация.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <ctype.h>
 
 
/*функция возвращает индех первого вохождения templ в string*/
int strrindex(char string[], char templ[]); 
 
 
int main()
{
    printf("%d", strrindex("ALIBABA I SOROK RAZBOYNIKOV", "baba"));
    return 0;
}
 
 
int strrindex(char string[], char templ[])
{
    int i, j, index;
    char chString, chTempl;
    i = 0;
    index = -1;
    for(j = 0; (chString = string[j]) != '\0' && (chTempl = templ[i]) != '\0' ; ++j) {
        if(tolower(chString) == tolower(chTempl)) {
            if(index == -1) {
                index = j;
            }
            ++i;
        } else {
            index = -1;
            i = 0;
        }
    }
    return index;
}
0
71 / 76 / 9
Регистрация: 30.06.2011
Сообщений: 176
14.07.2011, 09:34
C++
1
2
3
4
5
6
7
8
9
10
11
int strrindex( const char *str, const char *substr)
{
  int index = 0;
  for ( const char *s = str, *sub = substr; *str; s = ++str, sub = substr, index++)
     while ( tolower(*s++) == tolower(*sub++))
    {
      if (!*sub) return index;
      if (!*s) break;
    }
  return -1;
}
0
278 / 174 / 21
Регистрация: 10.07.2011
Сообщений: 441
15.07.2011, 07:48  [ТС]
An1ka
Возможно реализация интересная и имеет место быть. К сожалению я еще не дошел до раздела в Си где изучаются указатели, поэтому мало что понял из того что вы написали.
И еще досада в том что при компиляции появляется слишком много предупреждений. В честности на инициализацию переменных в заголовке цикла.
В любом случае спасибо за пример. Сохраню для его разбора в дальнейшем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.07.2011, 07:48

БД: Консультация
Всем здравствуйте.. Создал БД для учета специалистов которые идут на повышение квалификации. Что-то сомневаюсь в своем проектировании и...

Консультация по СИ
Заранее извиняюсь за то, что создал тему не в том разделе. Кто может подсказать, проконсультировать - какую программу/работу написать...

Консультация.
Доброго Всем! У меня есть вопрос по divelopment board, в частности какую плату использовать для разработки вот такого проекта:...

Консультация
Пожалуйста распишите что значат строчки.Буду очень благодарен. #include &lt;stdio.h&gt; #include &lt;malloc.h&gt; #include...

консультация
Здравствуйте!у меня просто вопрос!как можно понять быстрее программирование литературой или рассматривать готовые программы...


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

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

Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru