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

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


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

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

Выпуск № 646
от 23.01.2007, 19:05

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


Вопрос № 71408: Скажите как правильно подсоединять модули .Например есть два файла 1.cpp и 2.cpp в одной папке Пытался сделать это с помощью #include <1.cpp> и #include <2.cpp> в первом и втором файлах соответственно, но компилятор выдал ошибку ( fat...
Вопрос № 71441: Немогу разобратся с template помогите =( Нужно хранить ссылки на обекты в стеке, сделал класс, но немогу передавать адреса обьектов myobject.Push<int>(i) начинает плеватся на меня... Возможно я координально нетак использую шаблоны. Но е...
Вопрос № 71445: Здравствуйте Уважаемые эксперты повторно обращаюсь с задачей Даны вещественные массивы A[15], F[15]. Для каждого массива опpеделить наибольшее из отpицательных значений. я написала код(см.приложение) Он нормально компилируется и компо...
Вопрос № 71477: Подскажите, пожалуйста! Дана таблица из 4 строк. В первом столбце в каждой строке введены фамилии. Как сделать сортировку по значению в этом столбце? ...
Вопрос № 71484: Помогите кто может! как написать прогу на С++ в ДОС режиме преводящей строку например "сто двадцать три" в число 123...
Вопрос № 71490: Здравствуйте, уважаемые эксперы. помогите пожалуйста решить задачу. Очень нужно, чтоб получить зачёт. Заранее благодарю. Условие задачи: На входе 123,45 На выходе сто двадцать три рублЯ сорок пять копеЕК Решить задачу с 2-мя услов...
Вопрос № 71492: Здраствуйте. Подскажите как можно реализовать HEX редактор в виндовс на api, как нсчет стандартого многострочного EDITа, можноли как нибуть выводить в него записи отличные от char...
Вопрос № 71494: Пожалуйста, помогите решить задачу. Разработать функцию, которая доводит длину строки до заданной, вставляя пробелы между словами. При реализации функции запрещается пользоваться функциями библиотек языка С....
Вопрос № 71523: Пожалуйста, помогите решить задачу. Разработать функцию, которая доводит длину строки до заданной, вставляя пробелы между словами. При реализации функции запрещается пользоваться функциями библиотек языка С. Примечания: 1. в бол...
Вопрос № 71526: Помогите, пожалуйста! Нужно отобразить правую половину матрицы на левую зеркально симметрично относительно вертикальной оси, т. е. отобразить правую половину на левую, перевернув ее при этом сверху вниз. Вот код, но здесь правая половина просто отобр...
Вопрос № 71564: Помогите, пожалуйста. Почему при написании программы на С++ Buildere я дошел до такого этапе, что просто при объявлении какой-то переменной или мельчайшом изменени программы (добавка прогресс бара, Lable и т.д.) программа работает не правильно и выда...
Вопрос № 71570: Здравствуйте эксперты!Проблема состоит в следующем:в Visual Studio.NET 2003 имеется программа лежащая в файле 01.cpp.Нужно создать ещё один файл,например 02.cpp.Там будут находится некоторые процедуры и функции,которые будут вызываться из ос...

Вопрос № 71.408
Скажите как правильно подсоединять модули .Например есть два файла 1.cpp и 2.cpp в одной папке Пытался сделать это с помощью #include <1.cpp> и #include <2.cpp> в первом и втором файлах соответственно,
но компилятор выдал ошибку ( fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 2701))
Отправлен: 17.01.2007, 19:57
Вопрос задал: Hunter20 (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: kool
Здравствуйте, Hunter20!
Во-первых вместо #include <1.cpp> и #include <2.cpp>
нужно писать #include "1.cpp" и #include "2.cpp".
Во-вторых инклудить нужно файлы с расширением *.h.
А эти файлы нужно откомпилировать и скомпоновать полученные
объектные файлы - проще говоря создай проект и добавь в него эти файлы.
Но наверняка возникнут другие ошибки.
Чтобы все проверить нужен конкретный текст программы.
Удачи!
Ответ отправил: kool (статус: 5-ый класс)
Ответ отправлен: 17.01.2007, 23:02
Оценка за ответ: 3
Комментарий оценки:
Файлы с расширением .h это в C++Builder,а у меня программа В Visual C++ там таких файлов нет.
В Builder'е всё нормально получается,а с Visual Studio не выходит(ни "***.h",ни "*.cpp")

Отвечает: Thread
Здравствуйте, Hunter20!
Модуль представляет собой файл с расширением *.h и называется хедером. Напишите в нем все заголовки функций или методов, а их реализацию разместите в файле с таким же именем, но с расширением срр, добавив в его начало строчку #include <********.h> (вместо звездочек имя хедерного файла)
Ответ отправил: Thread (статус: 1-ый класс)
Ответ отправлен: 18.01.2007, 06:27

Отвечает: Sergijj
Здравствуйте, Hunter20!

Немного систематизирую ответы экспертов:

*.h - файл - файл заголовков (Header - англ. - заголовок). И в самом правильном случае должен содержать только заголовки - описания функций, классов, перечисления, описание (НЕ создание экземпляров) структур.

*.cpp - собственно файл кода, написанного на языке C++ (Plus - англ. - плюс). Здесь мы описываем сами функции, создаём экземпляры объектов, структур, объявляем константы.
Обычно для одного объекта используют пару файлов. Например так:
graphlib.h - через #include - прописаны заголовки и шаблоны структур;
graphlib.cpp - в файл проекта - прописан код и экземпляры структур.
*.h - файлы подключаются через директиву прекомпилятора #include, причём если подключается файл-заголовок (*.h - он же - "хедер") из стандартной библиотеки, то он подключается так:
#include <stdio.h>
т.е. компилятор будет его искать в том каталоге, где установлен компилятор; а если заголовочный файл из текущего каталога программы (т.е. самонаписанный) следует подключать так:
#include "myHead.h"
, причём в этом случае можно прописывать как статические, так и динамические (относительно каталога проекта) пути к файлу. Например так:
#include "src/lib/headers/myHead.h"
. Эта запись обозначает, что компилятор будет искать этот файл по следующему пути:
"путь_до_файла_проекта/src/lib/headers/myHead.h".
Причём обращаю Ваше внимание на "слэши" (косые чёрточки отделяющие каталоги один от другого): в стандарте они прописаны именно в таком виде (*nix понимают только так, Borland понимает и так: #include "src/lib/headers/myHead.h" и так #include "srclibheadersmyHead.h", а вот Microsoft тяготеет к тенденции понимания только так: #include "srclibheadersmyHead.h", хотя и в MS бывают исключения).

*.cpp - файлы - подключаются в файл проекта (В Borland - *.prj; в VC++ - *.sln; в *nix и вообще в стандарте - через make-файлы (RTFM));
Чтобы подключить файл *.cpp в проект в VC++ необходимо иметь сам проект (на диске - файл *.sln), т.е. если проекта нет, то следует его создать (FileNewProject). Потом следует на ветви дерева проекта "Имя_проектаSource Files" нажать правую кнопку мыши для вызова контекстного меню и выбрать пункт "AddNew Item" - для вновь создаваемого *.cpp-файла или "AddExisting Item" - для *.cpp-файла, существующего на диске.
Для исключения особенностей разных конпиляторов рекомендую *.h - файлы делать по следующей схеме:

#ifndef MY_SUPER_PUPER_LIBRARY_HEADER_H
#define MY_SUPER_PUPER_LIBRARY_HEADER_H

//Собственно текст заголовочного файла

#endif //MY_SUPER_PUPER_LIBRARY_HEADER_H

В VC++ есть аналог вышеприведённого кода - #pragma once.

---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 7-ой класс)
Ответ отправлен: 18.01.2007, 10:23
Оценка за ответ: 4
Комментарий оценки:
Спасибо


Вопрос № 71.441
Немогу разобратся с template помогите =(
Нужно хранить ссылки на обекты в стеке, сделал класс,
но немогу передавать адреса обьектов myobject.Push<int>(i) начинает плеватся на меня... Возможно я координально нетак использую шаблоны. Но еще нужно чтоб можно было возвращать по шаблону.
В приложении мои попытки.

Приложение:

Отправлен: 18.01.2007, 00:30
Вопрос задал: DDMZ (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ramok
Здравствуйте, DDMZ!

1. вам нет нужды использовать void*, так как при нормальном использовании шаблонов он не нужен.

2. в коментариях у вас написано что список двунаправленный. но одного указателя на прошлый элемент стека недостаточно. плюс еще должен быть указатель на вершину стека (head)

3. вам нужно использовать шаблон при _объвлении_ класса. пример объявления класса в приложении

4. для хранения данных рекомендуется использование стандарные контейнеры стандартной библиотеки С++ STL. введение можно почитать тут http://www.codenet.ru/progr/cpp/istl.php

Приложение:

Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 18.01.2007, 01:16
Оценка за ответ: 5
Комментарий оценки:
2. Это была опечатка для стека достаточно односвязного списка =)

Было серьезное упущение в ответе, это отсутствие примера как обьявлять методы в некласса, но потом допер =) похоже на то как делал я.
Все сделал успешно, работает как надо.

У меня вопрос, а можно делать шаблонным не весь каласс? а только несколько методов?
т.е. как я пробовал начинать.
а то если определю одну функцию отдельно в не класса, то она работает, а если сделаю шаблонной одну функцию внутри класса и потом обьявлю, то она неработает. пишет unexepted <тип> ...

Отвечает: Thread
Здравствуйте, DDMZ!
Вы правы, шаблоны используют не так.
вот пример
template <class T>
class SomeClass
{
T *data;
public:
SomeClass() {}
T GetElement()
{
...
}
}
Ответ отправил: Thread (статус: 1-ый класс)
Ответ отправлен: 18.01.2007, 06:20
Оценка за ответ: 4


Вопрос № 71.445
Здравствуйте Уважаемые эксперты
повторно обращаюсь с задачей
Даны вещественные массивы A[15], F[15]. Для каждого массива опpеделить наибольшее из отpицательных значений.
я написала код(см.приложение)
Он нормально компилируется и компонуется
Проблема в том, что результат программа выдает неправильный

Приложение:

Отправлен: 18.01.2007, 01:18
Вопрос задала: Lena_25 (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ramok
Здравствуйте, Lena_25!

1. в фунции raschet() максимальное значение у вас хранится в int, а значения в массивах - в float. при float z = 4.5; int max = z; переменная max будет == 4, а не 4.5

2. земечу что "наибольше отрицательное значение" может быть не то что вы думаете. например
при массиве -4, 4, -7, 0, -1 наибольшее отрицательное значение == -1, так как число -1 больше чем например -7. и ваш алгоритм правильный.

3. по хорошему нужно бы обрабатывать ситуацию когда в массиве нет отрицательных значений, иначе "наибольшим отрицательным значением" будет считатся первый элемент массива Ж:-)
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 18.01.2007, 01:38
Оценка за ответ: 5
Комментарий оценки:
Спасибо огромное за качественное и доходчивое объяснение

Отвечает: Nightm@re
Здравствуйте, Lena_25!

Проблема здесь:

max=m[0]; //функция raschet

Скорее всего когда заполняется массив первый элемент - ПОЛОЖИТЕЛЬНЫЙ!!!
Поэтому последуюшие отрицательные значения пропускаються в :
if(m[i] >max&& m[i] <0)
и значение max не изменяется.

Это должно работать:

float raschet(float m[15])
{
float max=0;

for (int i=0;i<15;i++)
if (m[i]>max && m[i] <0)
max=m[i];

return max;
}

void printrez(float x[15],char name)
{
cout<<"Исходный массив "<<name<<":"<<endl;
for (int i=0;i<15;i++)
cout<<setw(5)<<x[i];

float res=raschet(x);
if(res!=0)
cout<<endl<<"Наибольшее отрицательное значение в массиве "<<name<<" равно " <<raschet(x)<< endl;
else
cout<<endl<<"Отрицательных значений нет";
}

Удачи:)))
Ответ отправил: Nightm@re (статус: 1-ый класс)
Ответ отправлен: 18.01.2007, 05:30
Оценка за ответ: 5
Комментарий оценки:
Достаточно четко и ясно все объяснено
Спасибо!

Отвечает: Thread
Здравствуйте, Lena_25!
Я конечно могу отладить вашу программу, но думаю, что вам это будет полезнее сделать самой использую пошаговую отладку. Поишитьв меню вашей IDE что-то вроде Step Into (если у вас MSVS). Нажимая F11 проконтролируйте значение всех переменных наводя на них мышкой.
Ответ отправил: Thread (статус: 1-ый класс)
Ответ отправлен: 18.01.2007, 05:54

Отвечает: Mitya86
Здравствуйте, Lena_25!

Ошибка в алгоритме расчета.
попробуй так

int raschet(float m[15])
{
int i,max;
max=m[0];

for (i=0;i<15;i++)
if( ((m[i] >max)&& (m[i] <0))||((m[i]<0)&&(max==m[0])))
max=m[i];

return max;

}
Ответ отправил: Mitya86 (статус: 1-ый класс)
Ответ отправлен: 18.01.2007, 16:55

Отвечает: kool
Здравствуйте, Lena_25!
Исправьте функцию raschet() (см. приложение).
Удачи.

Приложение:

Ответ отправил: kool (статус: 5-ый класс)
Ответ отправлен: 18.01.2007, 23:59
Оценка за ответ: 5


Вопрос № 71.477
Подскажите, пожалуйста!
Дана таблица из 4 строк. В первом столбце в каждой строке введены фамилии. Как сделать сортировку по значению в этом столбце?
Отправлен: 18.01.2007, 10:07
Вопрос задал: Snowball (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Tek
Здравствуйте, Snowball!
Поскольку вопрос очень краток, то и ответ соответствующий:
сортировка любым притным алгоритмом,
сравнение строк strcmp()
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 7-ой класс)
Ответ отправлен: 18.01.2007, 10:39

Отвечает: Терсков Сергей
Здравствуйте, Snowball!
Вот примерный вариант на C++

Приложение:

Ответ отправил: Терсков Сергей (статус: 5-ый класс)
Ответ отправлен: 18.01.2007, 10:53

Отвечает: Mitya86
Здравствуйте, Snowball!

создать вторую таблицу такого же размера и в нее заносить данные в отсортированном порядке
Ответ отправил: Mitya86 (статус: 1-ый класс)
Ответ отправлен: 18.01.2007, 16:57

Отвечает: kool
Здравствуйте, Snowball!
Используй контейнерный класс организующий список list из STL, или
сравнивай эти фамилии как строки попарно с помощью функции
strcmp. Удачи!
Ответ отправил: kool (статус: 5-ый класс)
Ответ отправлен: 19.01.2007, 00:03


Вопрос № 71.484
Помогите кто может! как написать прогу на С++ в ДОС режиме преводящей строку например "сто двадцать три" в число 123
Отправлен: 18.01.2007, 11:23
Вопрос задал: Иванов Юрий Владимирович (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Madproger
Здравствуйте, Иванов Юрий Владимирович!

Используйте целочисленное деление и остаток от деления. Например так:

int num;
string str;

1) 123 / 100 = 1
123 % 100 = 23
case по сотням
(
switch(num)
{
case 1: str += "Сто";
break;
.....
}
)
2) 23 / 10 = 2
23 %10 = 3
case по десяткам
(
switch(num)
{
case 1: str += "Десять ";
break;
case 2: str += "Двадцать ";
break;
.....
}
)

3) 3
case по единицам

Вот в принципе и все. Полностью программу думаю написать теперь несложно.

---------
И будет вам счАстиЕ!
Ответ отправил: Madproger (статус: 10-ый класс)
Ответ отправлен: 18.01.2007, 11:30

Отвечает: Tek
Здравствуйте, Иванов Юрий Владимирович!
Очень просто разбираете строку на слова по пробелам, затем сравниваете с имеющимся набором (предварительно для уверенности привести к одному, например нижнему регистру).
Текущее определенное число умножается на соответствующий коэффициент (или сразу подставляется чило и прибавлется к уже накопленному)
Слова-разделители типа "тысячи", "миллиарда", "миллион" и т. д. сразу умножают накопленное число на 1000 при каждом своем вхождении.
У меня даже есть класс написанный для целей перевода чисел в строку и наоборот, правда там кажется реализована только часть перевода 123 в "сто двадцать три", а до обратного руки не дошли.

---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 7-ой класс)
Ответ отправлен: 18.01.2007, 11:35

Отвечает: kool
Здравствуйте, Иванов Юрий Владимирович!

Для экзаменаторов!!!
Поскольку в течении нескольких минут было дано как минимум 4 ответа (это и привлекло мое внимание данную тему)

atoi() Преобразует строку в целое число.
Пример использования:

int n;
char *str = "12345";
n = atoi(str);


Потому использование данной функции при решении задачи является не верным!!!
=====
Gh0stik


Используй функцию atoi().
Удачи!
Ответ отправил: kool (статус: 5-ый класс)
Ответ отправлен: 19.01.2007, 00:04


Вопрос № 71.490
Здравствуйте, уважаемые эксперы. помогите пожалуйста решить задачу. Очень нужно, чтоб получить зачёт.
Заранее благодарю.
Условие задачи:
На входе 123,45
На выходе сто двадцать три рублЯ сорок пять копеЕК
Решить задачу с 2-мя условиями:
1) Когда входные данные - вещественное число
2) Когда входные данные - строка
Ограничения:
1) Шаблон определить самим ([+/-][99...][./,][99])
2) Реализовать меню
3) Выход из программы по признаку конца
4) Формулу преобразования строки в число реализовать самим
Отправлен: 18.01.2007, 12:03
Вопрос задала: Чагина Наталья (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Чагина Наталья!
Вот ссылка на исходник с решением этой задачи.

http://algolist.manual.ru/maths/misc/sumwrite.php

На всякий случай повторяю его в приложении. Используя этот исходник в качастве основы все остальное (условия и ограничения задачи) несложно доделать...

Приложение:

Ответ отправил: Терсков Сергей (статус: 5-ый класс)
Ответ отправлен: 19.01.2007, 09:02


Вопрос № 71.492
Здраствуйте. Подскажите как можно реализовать HEX редактор в виндовс на api, как нсчет стандартого многострочного EDITа, можноли как нибуть выводить в него записи отличные от char
Отправлен: 18.01.2007, 12:13
Вопрос задал: Харламов Евгений Вячеславович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, Харламов Евгений Вячеславович!
Edit выводит, принимает и хранит данные в виде символов, а вот как интерпретировать находящиеся в нем данные - только ваше желание.
Все равно вам стоит определять ASCII код каждого символа в редактируемой строке, преобразовывать число в 16-чном формате к строке и выводить в Edit.
Соответственно наоборот - полученные данные edit'а следует перевести в число и считать его кодом символа.
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 7-ой класс)
Ответ отправлен: 18.01.2007, 12:26
Оценка за ответ: 4


Вопрос № 71.494
Пожалуйста, помогите решить задачу.
Разработать функцию, которая доводит длину строки до заданной, вставляя пробелы между словами. При реализации функции запрещается пользоваться функциями библиотек языка С.
Отправлен: 18.01.2007, 12:19
Вопрос задал: Snowball (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Tek
Здравствуйте, Snowball!
В чем проблема?
Посимвольно в цикле проходите строку и без всяких библиотек.
Алгоритм упрощенно может быть например такой:
1. Проходим строку посимвольно, считаем слова по пробелам (если перед текущим пробелом был также пробел - то счетчик слов не увеличиваем)
2. Вычисляем разницу между требуемой длиной строки и текущей.
3. Количество промежутков между словами = кол-во слов - 1. Это исходные данные.
4. На каждой итерации вставляем после очередного слова количество пробелов равное оставшая разница разница, деленная на количество оставшихся промежутков с округлением вверх. От разницы вычитаем вставленное кол-во пробелов, кол-во промежутков уменьшаем на 1. Переходим к следующей итерации.
5. Перед последним словом вставляем все оставшиеся пробелы.
Итог: примерно равное количество пробелом между всеми словами БЫЛО вставлено (если изначально было больше между какими-то словами, то и сейчас осталось больше) +-1.
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 7-ой класс)
Ответ отправлен: 18.01.2007, 12:41

Отвечает: Sergijj
Здравствуйте, Snowball!

Код в приложении.
Частный случай, который несложно доработать до требуемой кондиции, учитывая обилие комментариев...

Успехов!

Приложение:

---------
Стучитесь! И Вас откопают...

Ответ отправил: Sergijj (статус: 7-ой класс)
Ответ отправлен: 18.01.2007, 14:33


Вопрос № 71.523
Пожалуйста, помогите решить задачу.

Разработать функцию, которая доводит длину строки до заданной, вставляя пробелы между словами. При реализации функции запрещается пользоваться функциями библиотек языка С.

Примечания:
1. в большинстве заданий необходимо предусмотреть работу функции при некорректном задании ее параметров.
2. в тех заданиях, где применен термин "слово", под ним понимается любая последовательность символов, ограниченная любым числом пробелов и/или началом/концом строки.
Отправлен: 18.01.2007, 13:53
Вопрос задал: Snowball (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Snowball!
Вот примерный вариант функции... Засчет увеличения числа пробелов между словами меняем длину строки.

Приложение:

Ответ отправил: Терсков Сергей (статус: 5-ый класс)
Ответ отправлен: 19.01.2007, 03:26


Вопрос № 71.526
Помогите, пожалуйста! Нужно отобразить правую половину матрицы на левую зеркально симметрично относительно вертикальной оси, т. е. отобразить правую половину на левую, перевернув ее при этом сверху вниз. Вот код, но здесь правая половина просто отображена на левую.

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

void main(int i,int j,int **a,int n){
clrscr();
printf("vvedi razmernost' matrici: ");
scanf("%2d",&n);
randomize();
a=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
a[i]=(int*)malloc(n*sizeof(int));

for(i=0;i<=n;i++){
for(j=0;j<=n;j++)
{a[i][j]=random(100);
printf("%2d ",a[i][j]);}
printf(" ");}

printf(" ");

for(i=0;i<=n;i++){
for(j=0;j<=n;j++){
a[i][j]=(a[i][n-j]);
printf("%2d ",a[i][j]);}
printf(" ");}
free(a);
getch();
}
Отправлен: 18.01.2007, 14:02
Вопрос задал: Snowball (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Tek
Здравствуйте, Snowball!
Если действительно зеркально отобразить одну правую на левую симметрично относительно вертикальной оси, проходящей по центру, то у вас почти правильно, за исключением того, что вложенные циклы отзеркаливания должны начинаться один(отвечающий за элементы в строке) не с 0, а с int(n/2) заканчиваться <n, а не <=n, как у вас, а второй полный но опять же до <n (кстати и заполнение у вас идет неправильно, странно что run-time error не было - вы выделяете память под n строк и n столбцов а заполнить пытаетесь матрицу (n+1)Х(n+1)). И хоть вы и игнорируете new/delete, но и free надо применять не только к массиву указателей но и к каждому указателю, так как он каждый указывает на указатель.
Если же перевернутость сверху вниз не ваша догадка, а дополнительное условие (из основного условия это не вытекает никак),
тогда оба вложенных цикла должны начинаться с int(n/2) а внутри них делать обмен через промежуточную переменную
tmp = a[n-i][n-j];
a[n-i][n-j]=(a[i][j]);
a[i][n-j]=tmp;


---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 7-ой класс)
Ответ отправлен: 18.01.2007, 14:30

Отвечает: Lemeshev Konstantin
Здравствуйте, Snowball!
По моему можно так (см. вложение).

Обратите внимание, что если n - размерность массива, то цикл для перебора его элементов должен выглядеть так

for(i=0;i<n;i++)

Нельзя использовать знак '<='
Кроме того не корректно освобождаете память (см. приложение)

Приложение:

Ответ отправил: Lemeshev Konstantin (статус: 3-ий класс)
Ответ отправлен: 18.01.2007, 14:32

Отвечает: Volodymyr
Здравствуйте, Snowball!
Я думаю следует внести некоторые изменения (код не тестировал, но идея думаю будет понятна)

Приложение:

Ответ отправил: Volodymyr (статус: 2-ой класс)
Ответ отправлен: 18.01.2007, 17:31


Вопрос № 71.564
Помогите, пожалуйста. Почему при написании программы на С++ Buildere я дошел до такого этапе, что просто при объявлении какой-то переменной или мельчайшом изменени программы (добавка прогресс бара, Lable и т.д.) программа работает не правильно и выдает ошибку Access violation и т.д. У меня подозрение, что это нехватка памяти. Как ее увеличить или что вообще можна сделаь?
Отправлен: 18.01.2007, 18:42
Вопрос задал: Костенко Игорь Викторович (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: kool
Здравствуйте, Костенко Игорь Викторович!
Как говорится телепаты в отпуске.
Причин может быть много.
Чаще всего ("Access violation" переводится как запрет доступа)
неинициализированные переменные или обращение к области памяти,
которая не распредеелна для твоего приложения.
Удачи!
Ответ отправил: kool (статус: 5-ый класс)
Ответ отправлен: 19.01.2007, 00:05
Оценка за ответ: 4


Вопрос № 71.570
Здравствуйте эксперты!Проблема состоит в следующем:в Visual Studio.NET 2003
имеется программа лежащая в файле 01.cpp.Нужно создать ещё один файл,например 02.cpp.Там
будут находится некоторые процедуры и функции,которые будут вызываться из основного модуля
01.cpp.Как это лучше сделать и нужно ли в этом случае создовать "хедеры"?

Приложение:

Отправлен: 18.01.2007, 18:57
Вопрос задал: Hunter20 (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ramok
Здравствуйте, Hunter20!

вам необходимо создать проект и добавить туда все нужные файлы исходников, заголовки и используемые библиотеки

вот тут http://www.realcoding.net/article/view/2524 в пункте 7.2 описано как создать проект исльзующий gl в vc 6.0, что то подобное нужно вам сделать и в вашей среде
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 19.01.2007, 05:13
Оценка за ответ: 3

Отвечает: Tek
Здравствуйте, Hunter20!
Классическая схема - предназначена кстати изначально для сокрытия исполняемого кода, но удобного предоставления его результатов для использования:
создаете файл 2.h - заголовочный файл, хэдер - в нем перечисляете ОБЪЯВЛЕНИЯ всех треубемых (но именно к внешнему использованию) функций. Объявления (declarations) должны выглядеть следующим образом
int Func(char x[], int g, CClass *f);
Или аналогично. Заметьте важные пункты:
1. Если поставить {} - это тело функции то это будет уже не объявление а пустое описание - по-этому в объявлении эти операторные скобки не ставяться.
2. В конце точка с запятой - так как объявление является полноценной программной инструкцией и следовательно обязательно должно завершаться точкой с запятой.
И наконец, как я и писал в ответе на ваш прошлый вопрос - читайте книги по языку С/С++ хотя бы - иначе у вас будет слишком много вопросов, а экспертам нет ну нинакого интереса постоянно отвечать на совершенно неинтересные, рядовые, скучные, типовые, стандартные, и т. п. вопросы. И в конечном итоге на очередной такой вопрос вас могут послать не к соответсвующей литературе, а по другому адресу.
---------
WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 7-ой класс)
Ответ отправлен: 19.01.2007, 09:23
Оценка за ответ: 5
Комментарий оценки:
Thank you very match!

Отвечает: Thread
Здравствуйте, Hunter20!
Да, здесь необходимо использовать хедеры. Можете просто засунуть все что вам нужно в хедер, а не в файл *.срр, а потом подключать, а можете разместить в хедере только объявления функция, а их реализации разместить в файле *.cpp с тем же именем, что и хедер., подключать так же
Ответ отправил: Thread (статус: 1-ый класс)
Ответ отправлен: 19.01.2007, 22:30
Оценка за ответ: 4

Отвечает: Ross
Здравствуйте, Hunter20!

Как вариант: в файле 02.cpp поместите реализации функций, а в 01.cpp - их объявления с предварительным словом extern. Пример:

02.cpp
void my_function(int first,char * last)
{
code;
}

01.cpp
#include <header1>
#include <header2>

extern void my_function(int ,char *);
Ответ отправил: Ross (статус: 4-ый класс)
Ответ отправлен: 19.01.2007, 22:49
Оценка за ответ: 3


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.41 beta от 19.01.2007
Яндекс Rambler's Top100

В избранное