Форум программистов, компьютерный форум CyberForum.ru

Задания на строки и указатели - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
6elka
10 / 1 / 0
Регистрация: 06.10.2009
Сообщений: 73
17.12.2010, 10:04     Задания на строки и указатели #1
Помогите с заданиями пожалуйста..

1.4.1. Длина строки
В файле str.c напишите функцию вычисления длины строки (str_lenght). Саму строку опишите в качестве локальной переменной в функции main, например следующим образом: char s[100]=”Hellо”; или так: char *s=”world”; . разница между этими двумя формами объявления в том, что в первом случае создается массив байт в первые 6 элементов которого заносятся значения символов ’H’, ’e’, ’l’, ’l’, ’o’ и нуль-символ в конец. Передавайте в качестве параметра функции указатель на char. Возвращаемым значением данной функции должно быть целое значение – количество символов в строке отличных от нуль-символа.
Эта очень простая функция может быть реализована одним из следующих методов:
1. int i; for(i=0;s[i];i++);
2. int i=0; while(s[i++]);
3. int i=0; while(*s++) i++;
Замечание: во втором и в третьем варианте предполагается, что переменная i имеет на-чальное значение равное 0.
В первых двух вариантах строка рассматривается как массив символов и обращение к элементам массива осуществляется через индексную переменную i. Причем обратите вни-мание, что во втором варианте значение переменной i будет на 1 больше, чем количество ненулевых символов.
Третий вариант более сложный, но при этом более оптимальный. В данном варианте вся обработки строки (подсчет количества символов, в данном случае) происходит через указа-тель на строку. Перед каждой итерацией цикла проверятся текущее значение ячейки по адре-су s. Если эта ячейка не равна 0, то выполняется тело цикла (i++). В любом случае после взятия значения ячейки по адресу s производится инкремент данной переменной. Таким об-разом, в данном цикле указатель s последовательно перемещается по всем символам строки, пока не дойдет до конца строки.
Для этого и для всех последующих заданий данного раздела сделайте в главной функции пример использования.

1.4.2. Копирование строки
В предыдущую программу добавьте функцию копирования строк (str_copy). У этой функции будет уже два параметра типа char* – входная и выходная строка. Основной цикл работы данной программы может выглядеть, например, так:
1. while (*d++=*s++);
При компиляции данного куска текста компилятор, скорее всего, выдаст предупрежде-ние типа: «Possibly incorrect assignment» («возможно некорректное присваивание»). В данном случае можно не обращать внимания на это предупреждение. Компилятор просто сообщает Вам, что, возможно, вы ошибочно указали знак присваивания ’=’ вместо знака сравнения ’==’. Но нам здесь нужно как раз таки присваивание.
Разберитесь, как работает данный цикл. Убедитесь в том, копируется завершающий нуль символ. Обратите внимание на фактические параметры, которые вы будете использовать при вызове данной функции. Убедитесь в том, что у выходного массива выделена память под символы. Например:
1. void main() {
2. char *src=”Hello world!”, dst[20];
3. str_copy(src,dst);
4. printf(”\nsrc: %s\ndst: %s\n”,src,dst);
5. }
Здесь переменная src описана как указатель на строку (то есть выделяется память под указатель – 2 либо 4 байта в зависимости от реализации компилятора), которому сразу при-сваивается значение – адрес строки ”Hello world!”. Кроме того, выделятся память под саму строчку (13 символов в данном случае, считая нуль символ в конце строки). При передаче в функцию переменной src в стек записывается значение данной переменной (адрес начала строки в данном случае).
Под переменную dst выделяется 20 байт памяти (2 – 4 байта под указатель не выделя-ются), а при передаче в функцию в качестве параметра в стек записывается адрес нулевого элемента данного массива.

1.4.3. Конкатенация строк
Добавьте в тот же файл функцию конкатенации строк (str_concate). Данная функция должна добавлять содержимое второй строки к первой. Фактически данная функция есть объединение двух предыдущих – необходимо, во-первых, узнать длину первой строки, а точнее сказать адрес ее нуль символа, а затем скопировать вторую строку, начиная с вычисленного адреса.

1.4.4. Количество пробелов
Напишите функцию (str_spaces), вычисляющую в строке количество символов «пробел» (код 32 десятичного). Основной цикл будет похож на цикл при вычислении длины строки, однако тело цикла изрядно модифицируется: теперь Вам нужно производить инкре-мент переменной i не в каждой итерации, а только в случае, если текущий символ ’ ’ («пробел»). Кроме того, инкремент указателя s нужно производить не при проверке условия цикла, а в теле цикла.

1.4.5. Пробельный символ
Напишите функцию (str_isspace) принимающую на вход одно целое число типа char и возвращающую 1, если это число соответствует коду символов «пробел», «табуля-ция» (символ ’\t’) или «перевод строки» (символ ’\n’). Все эти символы считаются «пробельными символами».

1.4.6. Количество пробельных символов
В том же файле написать функцию (str_spcs) возвращающую количество пробельных символов в строке. В основном цикле данной функции (сделанной по аналогии с 1.4.4) вос-пользуйтесь предыдущей функцией (1.4.5), для определения является ли данный символ пробельным.

1.4.7. Удаление пробельных символов
Напишите функцию (str_delspc) имеющую два входных параметра (начальная и ко-нечная строки). Данная функция копирует содержимое начальной строки в выходную строку помимо пробельных символов. Для определения является ли символ пробельным, воспользуйтесь функцией из 1.4.5.

1.4.8. Удаление дублирующихся пробельных символов
Напишите функцию str_deldspc – более сложный вариант предыдущей функции. В выходную строку копируются не более одного пробела подряд. То есть если встречаются по-следовательности пробельных символов, то эти последовательности должны быть заменены в выходной строке ровно одним пробелом.

1.4.9. Печать строки в кодах символов
Написать функцию str_prncod – печатающую десятичные коды символов переданной в качестве параметров строки.

1.4.10. Замена символа табуляции на пробелы
Напишите функцию tab2spc. Все знаки табуляции в исходной строке заменить на по-следовательность пробелов в выходной. Остальные символы оставить неизменными.
Существуют стандартные правила для табуляций. Один символ табуляции должен пере-двигать курсор на ближайшую позицию кратную 8 вправо.
Например, строка: ”Мама\tмыла” заменятся строкой ”Мама!!!!мыла’ (’\t’ – сим-вол табуляции, а вместо пробела, для наглядности записаны символы ’!’). Другой пример: ”Оля\tмыла\tраму” преобразуется в строку: ”Оля!!!!!мыла!!!!раму”.
Для наглядности при выводе строки на экран воспользуйтесь функцией str_prncod. При выводе строки на экран в обычном режиме у вас начальная строка должна выглядеть точно так же, как конечная.

1.4.11. Замена пробелов на символ табуляции
Написать функцию spc2tab – обратную предыдущей функции: последовательность пробелов, которую можно заменить одним знаком табуляции необходимо сделать это.

1.4.12. Сравнение строк
Написать функцию str_compare производящую посимвольное сравнение двух строк. Функция должна значение +1, если первая строка больше, -1, если первая строка меньше, и 0, если строки идентичны. Строка считается больше, если хоть код символа данной строки больше, чем соответствующий код символа второй строки. Проверку кодов символов необ-ходимо делать слева направо.

1.4.13. Проверка палиндрома
Написать функцию palindrom. Данная функция возвращает значение 1, если строка (параметр функции) является палиндромом, то есть ее можно прочитать одинаково как слева направо, так и справа налево. Например: “город хорог - горох дорог”. Для упрощения задачи будем считать, что все символы набраны в одном регистре (все буквы маленькие).

1.4.14. Модуль str
В завершении работы составьте заголовочный файл str.h в котором запишите декларации всех функций, реализованных в этом файле. Оформите данный заголовочный файл по стан-дартным правилам:
1. #ifndef __STR_H
2. #define __STR_H
3. int str_length(char*s);
4. void str_copy(char*s,char*d);
5. …
6. #endif
То, что Вы сейчас сделали (связка str.c + str.h), фактически есть модуль, который Вы мо-жете в дальнейшем использовать в любом вашем проекте. Назовем этот модуль str. Однако, учитывая, что в программе должна быть только одна функция main Вам необходимо исключить из модуля str эту функцию (например, просто закомментировать) или вынести в другой модуль (strmain.c, например). Вот так может выглядеть главный модуль:
1. #include <stdio.h>
2. #include ”str.h”
3. void main() {
4. char *s1=”Hello world!”,s2[80];
5. printf(”\nlen s1: %d\n”,str_length(s1));
6. str_copy(s1,s2);
7. printf(”s2: %s\n”,s2);
8. …
9. }
Здесь, в строке 2 подключается заголовочный файл str.h, в котором перечислены дек-ларации функций, которые используются в данном модуле (str_length и str_copy). Поскольку имя заголовочного файла в директиве #include указано в кавычках, препроцессор будет искать данный фал в текущем каталоге. В строке 1 имя указано в угловых скобках, поэтому данный файл будет искаться в стандартном каталоге.
Следующим шагом будет объединить эти два модуля (str и strmain) в один проект. Как это сделать зависит от той инструментальной системы, которой Вы пользуетесь. Одним из универсальных способов, более или менее подходящим для всех инструментальных сис-тем является использование программы make. Создайте файл str.mak:
1. OBJS = str.obj strmain.obj
2. CC = bcc32
3. TARGET = strtest
4. $(TARGET) : $(OBJS)
5. $(CC) –e$(TARGET) $(OBJS)
6. str.obj : str.c str.h
7. $(CC) -c str.c
8. strmain.obj : strmain.c str.h
9. $(CC) -c strmain.c
В строке 1 создается переменная с именем OBJS и значением ”str.obj strmain.obj”. Эта переменная необходима для удобства, в ней необходимо указывать имена всех объектных файлов, участвующих в проекте. В строке 2 описывается переменная CC, в которой указано имя компилятора командной строки, который Вы используете, в дан-ном случае – bcc32 (Borland C Compiler 32 bit). В третьей строке описывается основная цель проекта – программа strtest. В строке 4 указаны strtest , в данном случае, strtest зависит от str.obj и strmain.obj. В строке 5 стоит указание для программы make ка-ким образом ей нужно получить результат. В данном случае сказано, что необходимо вы-полнить командную строку:
bcc32 -estrtest str.obj strmain.obj
Опция компилятора ’–e’ задает имя исполняемого файла. Указание $(имя_переменной) означает подстановку значения данной переменной.
В строках 6 – 7 указываются зависимости и способ получения файла str.obj, а в стро-ках 8 – 9 для получения файла strmain.obj. Опция компилятора ’-c’ означает «только компиляция» (без редактирования связей).
Теперь наберите в командной строке:
make –f str.mak
И программа make по заданным ей указаниям сформирует исполняемую программу. На самом деле здесь Вас может поджидать множество подводных камней, Дать какие-то одно-значные рекомендации по их преодолению сложно. Внимательно читайте руководство к ва-шей среде разработки и читайте, что Вам сообщает программа make и Ваш компилятор ко-мандной строки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2010, 10:04     Задания на строки и указатели
Посмотрите здесь:

Си++ Задания по теме Файлы и Указатели C++
C++ Строки и указатели........
C++ массивы и указатели нужен текст задания и код проги!!!
Строки и указатели с++ C++
Указатели и строки C++
Задания на строки C++
C++ Указатели и строки
C++ Указатели на строки

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
6elka
10 / 1 / 0
Регистрация: 06.10.2009
Сообщений: 73
18.12.2010, 18:08  [ТС]     Задания на строки и указатели #2
Ребят, помогите пожалуйста! Хотя бы с некоторыми, не со всеми...
оч надо...
Yandex
Объявления
18.12.2010, 18:08     Задания на строки и указатели
Ответ Создать тему
Опции темы

Текущее время: 13:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru