Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

Народное голосование ПРЕМИИ РУНЕТА-2007!
Голосуем за RusFAQ.ru >>

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 909
от 17.11.2007, 12:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 479, Экспертов: 72
В номере:Вопросов: 5, Ответов: 22


Вопрос № 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
Можно ли в С++ с помощью функции вернуть два или больше значений (Например как в паскале процедуры). Каким образом это можна сделать. За рание благодарен.
Отправлен: 11.11.2007, 19:20
Вопрос задал: Боднарчук Андрій Васильович (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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.

Приложение:

Отправлен: 12.11.2007, 10:10
Вопрос задал: Лапотников Ден Александрович (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.62.1 от 14.11.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное