Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
278 / 174 / 21
Регистрация: 10.07.2011
Сообщений: 441

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

10.07.2011, 10:41. Показов 3695. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера 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