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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Вычисление нормального веса человека http://www.cyberforum.ru/cpp-beginners/thread213061.html
Помогите написать программу, которая вычисляет нормальный вес человека по формуле v=k*r-100, k=1.08 где k – коэффициент коррекции v = это «нормальный» вес r = рост человека, целочисленная переменная, необходимо получить её от пользователя. результат v – вывести на экран с помощью функции printf(). добавить условие выбора, k - для возраста «до 16» = 0,94 k - для возраста «17 - 25» = 1 k...
C++ Исправить ошибки в программе Написать программу которая выводит ваше имя на экран в основном модуле и в модуле функции... #include<stdio.h> fun(); voind main() {printf ("sergey"); fun();} fun() {printf(sergey);} http://www.cyberforum.ru/cpp-beginners/thread213054.html
C++ Создайте а затем измените программу двумерного массива с использованием задания размера в виде константы и в виде #define
Создайте а затем измените программу двумерного массива с использованием задания размера в виде константы и в виде #define. Помогите люди добрые, чем можете. Спасибо.
C++ лаба по Си++ подскажите как написать=)
Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент Заранее Огромное спасибо! =) Начинаю делать: создаю целочисленную матрицу, а вот дальше темный лес.....
C++ Лабиринт заданный массивом http://www.cyberforum.ru/cpp-beginners/thread213025.html
Лабиринт задан массивом A(n*n), в котором элемент A(k,m)=0, если клетка A(k,m)-прохадима и A(k,m)=1, если не прохадима. Начальное положение пункта задано в проходимой клетке (i,j) Выяснить сможет ли путник выйти из лабиринта(т.е. попасть в граничную клетку). Если да распечатать путь. Вообще не каких идей O_o =/ Добавлено через 6 часов 6 минут Памогите хатябы задать массив =/
C++ Работа в строках Очень нужна помощь! Ввести строку. Вывести в виде нескольких строк так, чтобы в каждой строке было по 4 слова, первое слово начиналось в 5-ой позиции, а последнее заканчивалось в 60-ой. подробнее

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

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 и Ваш компилятор ко-мандной строки.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru