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

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


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

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

Выпуск № 889
от 27.10.2007, 12:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 482, Экспертов: 65
В номере:Вопросов: 3, Ответов: 13


Вопрос № 106256: как осуществить switch с классом string? приложение не работает(...
Вопрос № 106285: Здравствуйте! Работаю в C++Builder подскажите новичку. Мне нужно при определенном условии вывести форму с указанием ошибки, например: if (s<0) {показываем форму;} else {a=z/s;} Форму я уже создала: name: attention. На этой форме ес...
Вопрос № 106293: Подскажите можно ли сразу(при определении) задать двумерный массив? например: одномерный можно задать сразу так: int c[]={1,2,3,4,5}; а двумерный как? и еще вопрос как узнать кол-во элементов массива c[]={1,2,3,4,5} Я работаю...

Вопрос № 106.256
как осуществить switch с классом string?

приложение не работает(

Приложение:

Отправлен: 21.10.2007, 13:49
Вопрос задал: Makhov (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Хватов Сергей
Здравствуйте, Makhov!

Никак - switch работает только с целыми или enum

Работать приходиться либо через цепочки if () {} else if () {} ...
либо делать что-нибудь вручную, например сравнивать строки со списком и использовать индех в списке
Ответ отправил: Хватов Сергей (статус: Студент)
Ответ отправлен: 21.10.2007, 14:30

Отвечает: kool
Здравствуйте, Makhov!
switch работает только с целыми
константами.
Придется через if else что то же самое
Удачи!

---------
I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 21.10.2007, 16:43

Отвечает: Попов А.С.
Здравствуйте, Makhov!

Switch работает с int. Напишите функцию возвращающую определенные значения типа int в зависимости от исходных данных, например такую:
int f(char* s)
{if(strcpy(s,"test")==0)
return 1;
if(strcpy(s,"tes")==0)
return 2;
return 0; // если не равно test и tes
}

switch( f(cmd) ){
case 1: <..остальной код ..> }
Ответ отправил: Попов А.С. (статус: 3-ий класс)
Ответ отправлен: 22.10.2007, 06:03

Отвечает: Алексей Демаков
Здравствуйте, Makhov!

Как верно замечено в предыдущих ответах, switch работает только с целочисленными переменными (перечислимые типы к ним относятся). Однако, с точки зрения производительности switch для них - не то же самое, что и if - else if - else if - else. switch может быть реализован более эффективно с помощью таблицы переходов, если значения case идут почти подряд. А вот для строк такой реализации не бывает, поэтому switch не увеличил бы производительность. Время работы if - else if для строк растет линейно относительно общей длины строк. Если вариантов много, может оказаться эффективнее использовать хеш-таблицу - считаем хеш от строки, по нему находим действие, которое необходимо выполнить (например, адрес функции). Время работы линейно относительно произведения максимальной длины строки и логарифма количества строк.
Ответ отправил: Алексей Демаков (статус: Студент)
Ответ отправлен: 22.10.2007, 12:02


Вопрос № 106.285
Здравствуйте!
Работаю в C++Builder подскажите новичку.
Мне нужно при определенном условии вывести форму с указанием ошибки, например:
if (s<0) {показываем форму;} else {a=z/s;}
Форму я уже создала: name: attention. На этой форме есть только один компонент lable с текстом: внимение знаменатель равен нулю.
Заранее спасибо!
Отправлен: 21.10.2007, 17:58
Вопрос задала: Mart (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Виктор Пырлик
Здравствуйте, Mart!

Зачем в этом случае создовать аж целую форму... но в приложении дан код для разных случаев, в том числе и с формой...

Приложение:

---------
Если ничего не помогло - надо читать инструкцию

Ответ отправил: Виктор Пырлик (статус: Практикант)
Ответ отправлен: 21.10.2007, 18:21
Оценка за ответ: 5

Отвечает: Netizen
Здравствуйте, Mart!
Хочу дополнить предыдущий ответ!
Стандартные ошибки (типа деление на 0), удобнее и нужно обрабатывать посредством применения "Исключений"!
Синтаксис:
try
{
// Операторы, способные привести к ошибки (Исполняемый код)
}

catch (TypeToCatch)
{
// Код выполняемый в случае ошибки
}

Тип исключения деление на ноль называется EDivByZero
Ответ отправил: Netizen (статус: Студент)
Ответ отправлен: 22.10.2007, 08:35

Отвечает: Vas177
Здравствуйте, Mart!

В ответе, который дал Виктор Пырлик, есть недочёт. После вот этого всего:

Tattention * frm = new Tattention(NULL);
frm->ShowModal();

т. е. после создания формы и завершения работы с ней нужно освободить память:

delete frm;
Ответ отправил: Vas177 (статус: 1-ый класс)
Ответ отправлен: 22.10.2007, 09:54

Отвечает: Архипов Александр Леонидович
Здравствуйте, Mart!
Для открытия формы надо использовать метод Show(): attention->Show(), НО!!!
Форма attention должна быть включена в первую, т.е. должно быть #include "Unit2.h"
ДЛя этого находясь в 1 форме нажмите Alt+F12 и выбирете требуемую форму (она может не иметь имя формы).

Приложение:

Ответ отправил: Архипов Александр Леонидович (статус: 7-ой класс)
Ответ отправлен: 22.10.2007, 13:48


Вопрос № 106.293
Подскажите можно ли сразу(при определении) задать двумерный массив?
например: одномерный можно задать сразу так:
int c[]={1,2,3,4,5};
а двумерный как?
и еще вопрос как узнать кол-во элементов массива c[]={1,2,3,4,5}

Я работаю в среде C++ Builder
Отправлен: 21.10.2007, 19:28
Вопрос задала: Mart (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: CruelHity
Здравствуйте, Mart!
Можно так
int c[4][4]={ {1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};
Удачи
Ответ отправил: CruelHity (статус: 2-ой класс)
Ответ отправлен: 21.10.2007, 21:28
Оценка за ответ: 5

Отвечает: Алексей Демаков
Здравствуйте, Mart!

Задать многомерный массив можно вкладывая инициализаторы
int c[3][3] = { { 1, 2, 3 }, { 4, 5, 6}, { 7, 8, 9} };
или перечислив их списком
int c[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Правила сопоставления инициализатора и элементов массива достаточно запутанные, но в первом приближении сводятся к тому, что для элементов инициализаторы ищутся по очереди. Если инициализатор - скаляр, то он для однго элемента, если составной инициализатор (в фигурных скобках), то для всего подмассива.

Зная только c, количество элементов узнать нельзя, потому что с точки зрения языка имя массива - это просто неизменяемый указатель. Чтобы обойти проблему, обычно в конец массива добавляют значение, которого не может быть в самом массиве и ищут индекс этого элемента. Ну, или просто заводят отдельную константу для длины массива:
#define L
int c[L];
for( int i = 0; i < L; c[i++] = 0 );
Ответ отправил: Алексей Демаков (статус: Студент)
Ответ отправлен: 21.10.2007, 21:43
Оценка за ответ: 5

Отвечает: Гальцов Андрей Михаилович
Здравствуйте, Mart!

С двумерным массиво всё также:
int a[3][3]={1,2,3,4,5,6,7,8,9}; а дальше компилятор сам разбивает всё по строкам и столбцам(проверенно)

А вот по поводу количества элементов...вопервых редко когда объявляется массив с неизвестным количесвтом элементов, так как можно создать с запасом...
Но даже если Вы объявили int* b; - массив int-ов произвольной длины, то будет невозможно определить сколько же там оказалось элементов после каких либо операций над ним(я по крайней мере не знаю)...
Но можно например это подсчитать на вводе этого массива...например, Вы не знаете сколько элементов надо ввеси(пусть это зависит эт предидущих каких либо вычмслений)...см приложение...я такого конечно никогда не видел, но всё же:
Запускаем бесконечный цикл...вводим b[i]...нарищиваем счётчик...при условии если введенное число равно 32000(можете какое либо другое), то выходим из цикла(break) и в cnt у нас количество элементов массива b.

Приложение:

---------
Да здравтствует С++!!!...;)

Ответ отправил: Гальцов Андрей Михаилович (статус: 10-ый класс)
Ответ отправлен: 21.10.2007, 21:57
Оценка за ответ: 5

Отвечает: Попов А.С.
Здравствуйте, Mart!

Все просто: int c[3][3]={ {1,2,3}, // первая строка
{4,5,6}, // вторая
{7,8,9} }; // третья

Что касается второй части вопроса то насколько мне известно программисту эти данные не доступны, хотя размерность известна компилятору, приведу пример:
int *a = (int *) new int [12];
delete []a; // обратите внимание на то что скобки [] пусты, то есть компилятор точно знает сколько памяти было отведено, ровно столько он и освобождает
Ответ отправил: Попов А.С. (статус: 3-ий класс)
Ответ отправлен: 22.10.2007, 05:45

Отвечает: Mihail Yarlykov
Здравствуйте, Mart!
Что касается определения количества элементов массива int c[]={1,2,3,4,5};
В этом случае, когда размерность задана изначально, можно поступить так:
i = sizeof(c) / sizeof(int);
Т.е. кол-во байт занимаемых массивом делим на размерность типа int и получаем кол-во элементов в массиве.

Тогда как при динамическом выделении памяти
int *с = (int*) new int[x];
sizeof(c) даст нам только размер указателя на тип int, но не размер блока памяти.
А с другой стороны мы ведь знаем сколько памяти мы выделили - x * sizeof(int) байт, и при заполнении такого массива будем знать сколько элементов занесли в него.

---------
Нет ничего невозможного!
Ответ отправил: Mihail Yarlykov (статус: 3-ий класс)
Ответ отправлен: 22.10.2007, 07:28


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

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

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

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

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


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


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

В избранное