Вопрос № 108922: Как грамотно написать программу выделения слов произвольной строки. Слова отделяются друг от друга одним или несколькими пробелами (в начале и в конце строки тоже могут быть пробелы).
Интересует только написание в стиле Cи ( то есть - массив тип...Вопрос № 108946: Добрый день. Как грамотно добавить символ char к строке char[] (язык Си)?
Функция strcat добавляет только строки. Я использовал такую конструкцию:
s[n-1]=st[i];
s[n]='Это работает, но мне кажется что это не совсем грамотно. <b...Вопрос № 108962: Можно ли в С++ с помощью функции вернуть два или больше значений (Например как в паскале процедуры). Каким образом это можна сделать. За рание благодарен. ...Вопрос № 109013: Плиз хэлп :)
Данн цельный массив А[10],В [10] и значение P и Q.Каждый массив преобразовать по правилу : если в массиве есть хотябы один отрицательный элемент,то все отрицательные имеющие нечетный номер заменить на значение P (для массива А) и зна...Вопрос № 109018: Даны вещественные массивы F[4][5], A[4][5]. Определить значение массивов X[4],V[4], где X[i]=максимальному отрицательному значению i-й строки массива F, V[i]=максимальному отрицательному значению i-й строки массива
A.
Значение переменной i изменя...
Вопрос № 108.922
Как грамотно написать программу выделения слов произвольной строки. Слова отделяются друг от друга одним или несколькими пробелами (в начале и в конце строки тоже могут быть пробелы).
Интересует только написание в стиле Cи ( то есть - массив типа char)
Отправлен: 11.11.2007, 12:16
Вопрос задал: Navnav (статус: 1-ый класс)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Mihail Yarlykov
Здравствуйте, Navnav!
Вт програмка для вашей задачи, разбивает предложение на слова:
Приложение:
--------- Нет ничего невозможного!
Ответ отправил: Mihail Yarlykov (статус: 4-ый класс)
Ответ отправлен: 11.11.2007, 12:53 Оценка за ответ: 5 Комментарий оценки: Программа хорошая. Только немного сложновата.
Отвечает: CruelHity
Здравствуйте, Navnav!
Восепользуйтесь функцией strtok();
ее параметры:
1-й указатель на строку, которая будет обрабатываться!
2-й указатель на строку, которая будет содержать в себе символы ограничители!
см пример!
В примере отбрасываеться все пробелы и энтеры! можете убрать энетры и оставить только пробелы!
Приложение:
Ответ отправил: CruelHity (статус: 4-ый класс)
Ответ отправлен: 11.11.2007, 13:04 Оценка за ответ: 5 Комментарий оценки: Спасибо. Не знал такой функции. Очень красивая программа получается.
Отвечает: kool
Здравствуйте, Navnav!
Может помочь ф-ция strtok
Пример в приложении
Подробности в MSDN
Удачи!
Приложение:
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 11.11.2007, 20:10 Оценка за ответ: 5 Комментарий оценки: Спасибо. Не знал этой функции.
Отвечает: Титов Михаил Анатольевич
Здравствуйте, Navnav!
А что значит "выделение слов"? В приложении программа, которая выводит "выделенные" слова по слову на строке. Для краткости исходная строка задана массивом, но вы можете добавить ввод с консоли, например функцией gets(), если у вас за неё не ругают ...
(Литература: K&R п.1.5, 5.5)
Приложение:
Ответ отправил: Титов Михаил Анатольевич (статус: 3-ий класс)
Ответ отправлен: 12.11.2007, 03:49 Оценка за ответ: 5 Комментарий оценки: Довольно неплохая программа. Однако, если в начале или в конце строки будут пробелы, то будет такое же количество пропущенных строк при выводе. Это не очень хорошо. Если инетесно посмотрите мини-форум вопроса - там уже есть очень хрошие программы. Спасибо за ответ.
Вопрос № 108.946
Добрый день. Как грамотно добавить символ char к строке char[] (язык Си)?
Функция strcat добавляет только строки. Я использовал такую конструкцию:
s[n-1]=st[i];
s[n]='Это работает, но мне кажется что это не совсем грамотно.
Отправлен: 11.11.2007, 15:59
Вопрос задал: Navnav (статус: 1-ый класс)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Argus98
Здравствуйте, Navnav!
это важно! перед тем как записывать нашу информацию в какую-то ячейку, её надо выделить функцией new или malloc (calloc для массивов), т. к. в невыделенной ячейке могла уже содержаться какая-то информация, которую мы в процессе записи теряем. как правило для c++ лучше всего использовать new. в конце программы надо обязательно надо почистить выделенную память: delete или free. для c++ желательно использовать использовать delete. посмотрите пример, нежелательные, но возможные варианты закомментированы. чтобы с
помощью new выделить массив, надо пользоваться примерно такой записью: b = new char [30]; если непонятно, можете ещё почитать здесь http://www.codenet.ru/webmast/java/02.php, подзаголовок "распределение памяти"
Приложение:
Ответ отправил: Argus98 (статус: 2-ой класс)
Ответ отправлен: 11.11.2007, 16:30 Оценка за ответ: 2 Комментарий оценки: Ответ не корректрый. Во-первых я справшивал совсем про другое (разумеется предпологается что при объявлении память выделена с запасом). Во-вторых ( главное) пример не правильный. Так память так добавлять нельзя, для изменения размера массива существует только одна функция -- realloc. В вашем примере где-то выделяется один байт, и нигде он не используется, а символный массив
выходит за свои границы и возможно пордит другую информацию.
Отвечает: Алексей Демаков
Здравствуйте, Navnav!
Если в области памяти еще есть место, то делать так, как вы написали вполне нормально. Если места нет и используется динамическая память (выделенная с помощью malloc/calloc), то предварительно потребуется увеличить размер области с помощью функции realloc
s = realloc( s, strlen(s) + 1 + 1 ); // 1 из-за '
Ответ отправил: Алексей Демаков (статус: Студент)
Ответ отправлен: 11.11.2007, 16:48 Оценка за ответ: 5 Комментарий оценки: Получается добавление элемента надо делать так некрасиво? Про выделение памяти -- спасибо, все правильно (но не об этом был вопрос, предполагалось, что с памятью все хорошо).
Отвечает: kool
Здравствуйте, Navnav!
Символ можно использовать и как строку
состоящую из одного символа и заканчивающаюся нулем,
а дальше рулит strcat.
strcat(s+n-1,"a");
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 11.11.2007, 20:10 Оценка за ответ: 4 Комментарий оценки: То что вы показываете ("а") -- это строка с нулевым символом на конце. Со строками проблем никаких нет. А я спашивал про символ. Если взять элемент строки, то у него не может быть нулевого символа и функция strcat не работает! Ответ совсем не по теме.
Отвечает: Титов Михаил Анатольевич
Здравствуйте, Navnav!
Это может быть неграмотно только в том смысле, что если s объявлена как
char s[n]
, то:
1) s[n-1] может не совпадать с действительным концом строки в s, длина строки, действительно находящейся в s может быть меньше;
2) оператор s[n]='
Специальной функции добавления char к строке (char[]) в стандартной библиотеке Си нет. Но ничего не мешает использовать strcat(my_string, "x"), где x - добавляемый символ.
Если хочется руками, то можно написать свою функцию, типа как в приложении
Приложение:
Ответ отправил: Титов Михаил Анатольевич (статус: 3-ий класс)
Ответ отправлен: 12.11.2007, 04:11 Оценка за ответ: 4 Комментарий оценки: Овет не совем грамотный. Если мы пишем strcat(my_string, "x"), то x не добавляемый символ, а добавляемая строка. Символ писался бы 'x', и в этом случае функция не работает. Я же в вопросе написал st[i]--это символ и строкой никак не может быть.
Вопрос № 108.962
Можно ли в С++ с помощью функции вернуть два или больше значений (Например как в паскале процедуры). Каким образом это можна сделать. За рание благодарен.
Отвечает: Argus98
Здравствуйте, Боднарчук Андрій Васильович!
в C++ два значения функция напрямую возвращать не может. если вам нужно оперировать с какой-то второй переменной, вы можете передать функции указатель на значение этой переменной в качестве аргумента. смотрите в приложении пример на msvc++ 2005
Приложение:
Ответ отправил: Argus98 (статус: 2-ой класс)
Ответ отправлен: 11.11.2007, 19:33
Отвечает: Petya-kurochkin
Здравствуйте, Боднарчук Андрій Васильович!
Ну вообще не помнится, что бы в паскале можно было возвращать больше двух значений) Тем более, если это процедура, а не функция =)
Далее, как промежуточный вариант, думаю, что можно вернуть результат работыы в параметре ф-ции, тогда тут два варианта:
1.
void FuncReturn(int *pInt)
{
*pInt=2;
};
int main()
{
int i=0;
FuncReturn(&i); //Теперь i==2
};
2. С помощью неявных укащателей:
void FuncReturn(int &OutValue)
{
OutValue=5;
};
int main()
{
int iTest=0;
FuncReturn(iTest); //Теперь iTest==5
};
--------- Всех порву! Всех побью! Но если можно убегу!
Ответ отправил: Petya-kurochkin (статус: 2-ой класс)
Ответ отправлен: 11.11.2007, 19:41
Отвечает: SiRuS
Здравствуйте, Боднарчук Андрій Васильович!
Ф-ции в с/с++ могу возвращать только одно значение. Но, этим значением может быть и структура и класс -> вернётся тот объём данных, который вам нужен. В приложении показано как возвращается структура содержащая две переменные.
Приложение:
Ответ отправил: SiRuS (статус: 3-ий класс)
Ответ отправлен: 11.11.2007, 19:46 Оценка за ответ: 5
Отвечает: Navnav
Здравствуйте, Боднарчук Андрій Васильович!
При переходе с Pascal, неприятно узнать, что в Си нет процедур, однако на деле способ передачи данных в Си очень похож на паскалевский:
Передача параметров по ссылке. Ссылочный параметр – это псевдоним соответствующего аргумента. Для указания, что параметр передается по ссылке, после параметра стравится символ “&”. Например:
void fun2(double &, int &); // Прототип
Вызов такой функции осуществляется:
fun2(d,r);
При таком вызове передается не переменная, а ее адрес, полученный с использованием операции “взять адрес”. Следовательно, при обращении к временной переменной в действительности происходит обращение к исходной переменной в вызывающей функции.
Передача параметров по указателю.
В отличии от передачи по ссылке адрес переменной передается в функцию не с использованием операции разадресации (&), а операцией косвенной адресации (*). В результате передается не сама переменная, а указатель на нее. Например:
void fun3(double *, int *); // Прототип
Вызов такой функции осуществляется:
fun3(&f,&k);
Здесь тоже все изменения, происходящие внутри функции приводят к изменению пременных в вызывающей программе.
В Паскале все это пришется с использованием var в описании формальных параметров.
Ответ отправил: Navnav (статус: 1-ый класс)
Ответ отправлен: 11.11.2007, 19:48
Отвечает: Титов Михаил Анатольевич
Здравствуйте, Боднарчук Андрій Васильович!
Функция ВСЕГДА возвращает одно значение. В том числе и в Паскале. Однако возвращаемое значение не обязательно должно быть скалярной величиной.
Но, судя по вопросу, Вас интересует как в Си сделать нечто вроде паскалевского параметра-переменной?
В Си (а равно С++) аргументы функций всегда передаются по значению. Для того, что бы можно было через параметры ВЕРНУТЬ значение, или несколько значений, параметры должены быть указателями на переменные, существующие в вызывающем коде.
Тему указателей довольно обширна, но ничего особо хитрого. Пример в приложении.
Приложение:
Ответ отправил: Титов Михаил Анатольевич (статус: 3-ий класс)
Ответ отправлен: 12.11.2007, 04:34
Вопрос № 109.013
Плиз хэлп :)
Данн цельный массив А[10],В [10] и значение P и Q.Каждый массив преобразовать по правилу : если в массиве есть хотябы один отрицательный элемент,то все отрицательные имеющие нечетный номер заменить на значение P (для массива А) и значение Q (для массива B).В противном случае массивы оставить без изменения.
Отправлен: 12.11.2007, 09:41
Вопрос задал: Hikaru (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: SiRuS
Здравствуйте, Hikaru!
Смотрите "рабочую часть" в приложение.
Приложение:
Ответ отправил: SiRuS (статус: 3-ий класс)
Ответ отправлен: 12.11.2007, 10:31 Оценка за ответ: 5
Отвечает: CruelHity
Здравствуйте, Hikaru!
Вот программа!! если я конечно все правильно понял то что вы хотите
Приложение:
Ответ отправил: CruelHity (статус: 4-ый класс)
Ответ отправлен: 12.11.2007, 12:13
Отвечает: Гальцов Андрей
Здравствуйте, Hikaru!
Ну я что ли предложу свой вариант...См. приложение...
0 - чётное...
Приложение:
--------- "The more you know, the less you need to show"
Ответ отправил: Гальцов Андрей (статус: Студент)
Ответ отправлен: 12.11.2007, 21:36 Оценка за ответ: 5 Комментарий оценки: зашибись все работает как надоспасибо :)
Отвечает: Титов Михаил Анатольевич
Здравствуйте, Hikaru!
В задании условие "если в массиве есть хотябы один отрицательный элемент" избыточно, т.к. нужно заменить именно отрицательные элементы, а значит они уже есть. Поэтому действия сводятся к проверке нечетных элементов массивов на отрицательное значение и замене этих значений. Но необходимо уточнение - что имеется в виду под элементами, имеющими "нечетный номер" - это нечетный индекс или нечетный порядковый номер элемента в массиве - так, как индексы начинаются с 0, то это они не будут совпадать:
третий по порядку элемент имеет индекс 2.
В приложении программа, в которой "нечетный номер" считается нечетным индексом. Заменен будет элемент b[3]. Если "нечетный номер" - это порядковый номер элемента, то нужно изменить условие во внешнем if на:
if(i % 2 == 0)
В таком случае будет заменен элемент b[2].
Приложение:
Ответ отправил: Титов Михаил Анатольевич (статус: 3-ий класс)
Ответ отправлен: 13.11.2007, 01:44
Вопрос № 109.018
Даны вещественные массивы F[4][5], A[4][5]. Определить значение массивов X[4],V[4], где X[i]=максимальному отрицательному значению i-й строки массива F, V[i]=максимальному отрицательному значению i-й строки массива A.
Значение переменной i изменяется от 0 до 3.
Отвечает: SiRuS
Здравствуйте, Лапотников Ден Александрович!
Если я правильно понял задание про максимальный отрицательный элемент, то всё работает ;)
Приложение:
Ответ отправил: SiRuS (статус: 3-ий класс)
Ответ отправлен: 12.11.2007, 10:22 Оценка за ответ: 5 Комментарий оценки: Помоги с на4алом))
Отвечает: CruelHity
Здравствуйте, Лапотников Ден Александрович!
Не совсем понял "максимальному отрицательному значению" это вы имели виду когда Х стремиться к минус безконечности или когда стремиться к нулю!
ну я вам даю два варианта решения задачи! первый когда к минус безконечности а второй когда к нулю!
Если что спрашиваейте)))
Удачи!
Приложение:
Ответ отправил: CruelHity (статус: 4-ый класс)
Ответ отправлен: 12.11.2007, 11:43 Оценка за ответ: 5 Комментарий оценки: sps))
Отвечает: Гальцов Андрей
Здравствуйте, Лапотников Ден Александрович!
Держите еще вариант...с красивым вводом :)
Только не понятно. что делать если нет в строке отрицательных элементов...поэтому я массивам X и V, в таких случаях, присваивал ноль...
Приложение:
--------- "The more you know, the less you need to show"
Ответ отправил: Гальцов Андрей (статус: Студент)
Ответ отправлен: 12.11.2007, 22:08 Оценка за ответ: 5 Комментарий оценки: =)
Отвечает: Титов Михаил Анатольевич
Здравствуйте, Лапотников Ден Александрович!
В приложении программа для вашей задачи. Только имейте в виду, что для отрицательных чисел -1 больше, чем -2.
Приложение:
Ответ отправил: Титов Михаил Анатольевич (статус: 3-ий класс)
Ответ отправлен: 13.11.2007, 02:43 Оценка за ответ: 5
Отвечает: Архипов Александр Леонидович
Здравствуйте, Лапотников Ден Александрович!
Вроде работает, но! в этой программе расчитывается только минмальное отрицательное по строкам в масивах. Если же надо рассчитать просто минимальное значение, то программу надо немного видоизменить.
Приложение:
Ответ отправил: Архипов Александр Леонидович (статус: 9-ый класс)
Ответ отправлен: 13.11.2007, 16:41 Оценка за ответ: 5