Вопросы по программированию

Автор Богдан, 03 Листопад 2007, 11:41:18

Попередня тема - Наступна тема

Edd.Dragon

#650
А, вон оно чё (с)
Ты по сути хотел спросить "Как  можно ли в операциях внутри шаблона создавать новые экземляры этого же шаблона?"
Ну сорри, что проглядели простой вопрос %)







Добавлено: 30 Травень 2009, 01:36:44

Цитата: ostman від 30 Травень 2009, 02:02:02і потрібно самому писати під який конкретно тип даних виділяти память
А разве ты этого не делал?
Ты и написал

Цитата: ostman від 30 Травень 2009, 02:02:02new LIST<T>;

T - это разве не конкретный тип данных?! Такой же конкретный как и float или string, которыми компилятор будет заменять слово T в конкретных экземплярах твоего шаблона.

2kin

А может кто-то посоветовать как реализовать такую задачу(ну очень желательно методами С#):
необходимо  на выход ЛПТ(те контакты, что отвечают за отправку информации) подавать импульсы длительностью 1-2мс.

В тулбксе студии содержится стандартный компонент SerialPort и у него есть метод WriteLine, но вопрос в том каким именно образом его использовать, чтобы на нужных контактах соблюдалась длительность импульсов.

Edd.Dragon

Цитата: 2kin від 31 Травень 2009, 17:28:46В тулбксе студии содержится стандартный компонент SerialPort и у него есть метод WriteLine, но вопрос в том каким именно образом его использовать, чтобы на нужных контактах соблюдалась длительность импульсов.
Высокоуровненвые API не решат твою особенную задачу :(
Разве что, провести эксперимент - посылаем 1 символ (11111111b), а скорость порта подбираем так, чтобы это и было около 1-2 мс.


2kin

Нет. со скоростью порта играть не получится, т.к. она выбирается из фиксированого списка ...4800,7200,9600,...
а длительность импульсов надо менять с большой(1 мкс) точностью.
Еще вопрос вот в чем: если послать на запись что-то, то какое время уровни напряжения будут держаться. Осцилографа пока нету - так бы проверил

Edd.Dragon

Цитата: 2kin від 31 Травень 2009, 19:32:07а длительность импульсов надо менять с большой(1 мкс) точностью.
Подожди, микро или милли? В предыдущем сообщении было милли

Цитата: 2kin від 31 Травень 2009, 19:32:07то какое время уровни напряжения будут держаться
Это не регламентируется на уровне посылки символов. Задача отправителя послать пакет, задача приемника - принять.
А длительность приемки битов самым на уровне микрух - кто его знает... В любом случае, если программно доступно управление длительностью сигнала, то не на уровне user-friendly-интерфейса. Т.е. как-минимум нужно писать свой низкоуровневый драйвер порта или работать напрямую с имеющимся, а не пользовать посылку символов, которые потом независимо от тебя сформируются в пакеты, которые снова независимо от тебя передаются побитово. Если речь о миллисекундах, тогда поиграть со скоростью может быть достаточно. А так не знаю...


βεερ_βooρ

Цитата: 2kin від 31 Травень 2009, 19:32:07а длительность импульсов надо менять с большой(1 мкс) точностью.
И поэтому идея использовтьдля этого дела ком-порт бредовенькая, если учесть что ПК сам по себе точность больше 10^-3 c не обеспечивает без дополнительных извратов.
Цитата: 2kin від 31 Травень 2009, 19:32:07Еще вопрос вот в чем: если послать на запись что-то, то какое время уровни напряжения будут держаться.
Ком-порт держит уровень маркера, пока не начинается передача. Сначала идет старт-бит, потом данные, потом 1 или 2 стоп-бита. Напряжение биполярное +/- 15В. А уровень определенный держится столько, сколько передается текущий бит.

Цитата: Edd.Dragon від 31 Травень 2009, 18:42:29
А длительность приемки битов самым на уровне микрух - кто его знает...
Вот на это и влияет скорость пересылки данных, которая указывается при инициализации ком-порта.

Fear is the path to the dark side. Fear leads to anger. Anger leads to hate. Hate leads to suffering.
All that's here is Fear! Suppression! Betrayal! Despair! Contempt! Regret! Sadness! Anguish! Madness! And Pain, right?

Edd.Dragon

Цитата: βεερ_βooρ від 31 Травень 2009, 19:52:41Вот на это и влияет скорость пересылки данных, которая указывается при инициализации ком-порта.
Если при скорости к примеру в 1000 бит в сек, четко будет 1000 измений напряжения за секунду безо всяких там "туда-сюда", тогда нормально

greg.re1234

С какой стороны подойти к изучению программирования.
Давно хочу попробовать свои силы в этом деле.....
С какого языка начать? 
У меня есть особенность-если не вижу практического результата от работы, я быстро теряю энтузиазм.
Нужен язык, на котором реально будет делать хоть в две строчки, но работающие проги.
Я понимаю, звучит по-детски, но сами понимаете что выбор стратегии изучения чего-либо часто определяет успешность изучения...

Edd.Dragon

Цитата: greg.re1234 від 09 Липень 2009, 23:14:42Нужен язык, на котором реально будет делать хоть в две строчки, но работающие проги.
Это скучно. Это не программирование, а кладка готового кирпича. Конструирование.

А так это не зависит от языка, а зависит от современности среды разработки. Если достанешь что-то старючее под дос - это одно дело. А если нынешние, например Visual Studio 2005-2008, так там после "Создать новый проект" (Windows-приложение) ты уже получаешь формочку Windows-приложения, написав 0 строк кода самостоятельно. Жмешь Ctrl+B и получаешь рабочий exe-шник с пустой формой. Сделав ряд лишних кликов, обвешиваем форму кучей кнопок, по нажатию которых ничего не происходит. А вот дальше чтобы происходило - нужно уже писать код. Опять таки, зависит от задачи. Можно одной строчкой использовать чей-то готовый "кирпичик". Можно для обучения именно программированию написать несколько сот строк кода самостоятельно, реализуя какой-нибудь алгоритм.

Так что, берем например самоучитель по C# и обучаемся больше конструированию нежели программированию. Т.е. это обучение процессу разработки интерфейсных приложений в современной интегрированной среде разработки (язык при этом не так и важен, в Visual Studio их несколько кроме C#).

Или же берем "Язык программирования C++" и учим с нуля C++ на практической задаче. Там нет о том, как мышкой лепить формы, а именно программирование. Вторая половина книги - справочник по стандартной библиотеке STL, элементы из которой густо используются практически в любой программе на C++.


greg.re1234

WYSIWYG мне не нужен. Мне нужны принципы. И хелп. Я смотрел какуюто книгу по си++.
Со второй страницы с ходу в карьер идет описание операторов.
Вопрос в том как узнать какие из них нужны в моем проекте.

Edd.Dragon

#660
Цитата: greg.re1234 від 09 Липень 2009, 23:57:39Я смотрел какуюто книгу по си++.
Ну вот посмотри которую я предложил

Цитата: greg.re1234 від 09 Липень 2009, 23:57:39WYSIWYG мне не нужен. Мне нужны принципы. И хелп.
В таком случае строк для реализации той или иной задачи понадобиться ровно столько сколько понадобится. Ведь даже ничего не делающая функция занимает 3 строки (если следовать принципам аккуратности и удобочитаемости)  ;)
А с коментами - так все 4!


// эта функция ничего не делает!
void doNothing()
{
}


А вот еще толком ничего не делающая, но возвращающая 0 - из-за чего уже 5 строк, а толку пока нет!


// эта функция ничего не делает!
int doNothing()
{
    return 0;
}



А эта возвращает модуль переданного ей числа (хоть что-то...)


// а эта функция уже что-то делает
int abs(int value)
{
    if(value > 0)
    {
        // если число больше нуля - его и возвращаем
        return value;
    }
    else
    {
        // иначе меняем ему знак
        return -value;
    }
}


Скромно так 14 строк получилось! :%)

Хотя тоже самое можно записать так:


int abs(int value)
{
    return (value > 0 ? value : -value);
}


или нарушив корпоративные (и вообще общепринятые) стандарты оформления  - вообще в одну строку:


int abs(int value) { return (value > 0 ? value : -value); }


;D

greg.re1234

Эту книгу можно купить в Киеве?

Edd.Dragon

#662
Цитата: greg.re1234 від 09 Липень 2009, 23:13:03
Эту книгу можно купить в Киеве?
Может быть если поискать. Технические бестселлеры почему-то выпускают малыми тиражами и быстро распродают, оставляя на полках технический треш.

Хотя пролистал начало, с нуля то ее читать тоже наверное будет не совсем понятно  :-X
Так что не спеши...



Тебе надо что-то типа такого:
http://www.bespin.ru/иллюстрированный-самоучитель-по-с-дл/

У меня еще дома где-то валялась аналогичная (или эта же, только издание другое):
http://www.alians-kniga.ru/shop/UID_86.html
Не очень то. Слишком отстраненно от практики

Ну и запрос в Гугле: самоучитель C++ для начинающих много чего еще выдаст

немой

Цитата: Edd.Dragon від 10 Липень 2009, 00:09:10// а эта функция уже что-то делает
int abs(int value)
{
    if(value > 0)
    {
        // если число больше нуля - его и возвращаем
        return value;
    }
    else
    {
        // иначе меняем ему знак
        return -value;
    }
}
а так можно? оно ж вроде копирует переменные входные в памяти и после выполнения удаляется, сами переменные не должны меняться.

Добавлено: 10 Липень 2009, 15:29:33

Цитата: немой від 10 Липень 2009, 16:28:33сами переменные не должны меняться.
ну если не передавать их адрес

Edd.Dragon

#664
Цитата: немой від 10 Липень 2009, 16:28:33а так можно? оно ж вроде копирует переменные входные в памяти и после выполнения удаляется, сами переменные не должны меняться.
Ты что-то себе нафантазировал. Да, value - это локальная копия переменной, переданная функции, т.е. что хочу с ней то и делаю, ничто не испортится вне функции. Да, при выходе из функции она удалится. Но блин при чем тут return, который вернет ее значение туда, откуда abs будет вызвана? ))))

И как тогда вообще можно, если в ретурне нельзя использовать локальные переменные? Это была бы вешалка! %)))))


Если ты имел ввиду, что надо так:
// а эта функция уже что-то делает
int abs(int value)
{
    int i;

    if(value > 0)
    {
        // если число больше нуля - его и возвращаем
        i = value;
    }
    else
    {
        // иначе меняем ему знак
        i = -value;
    }

    return i;
}


так это абсолютно то же самое, только лишних 4 байта под i используется. Чем i от value отличается? Она не такая же локальная? Она не точно так же уничтожится при выходе?

βεερ_βooρ

#665
Цитата: немой від 10 Липень 2009, 16:28:33а так можно? оно ж вроде копирует переменные входные в памяти и после выполнения удаляется, сами переменные не должны меняться.
1) Никто не запрещает менять - прото они пропадут, поле выхода з ф-ции.
2) Конкретно в данном случае никто не изменял переданый параметр.
Fear is the path to the dark side. Fear leads to anger. Anger leads to hate. Hate leads to suffering.
All that's here is Fear! Suppression! Betrayal! Despair! Contempt! Regret! Sadness! Anguish! Madness! And Pain, right?

немой

Цитата: Edd.Dragon від 10 Липень 2009, 19:03:11Но блин при чем тут return, который вернет ее значение туда, откуда abs будет вызвана? ))))
угу, путаюсь. поэтому входные переменные стараюсь не возвращать.

Edd.Dragon

#667
Цитата: немой від 10 Липень 2009, 19:13:58угу, путаюсь. поэтому входные переменные стараюсь не возвращать.
Я там дописал.
Объявленная внутри переменная, точно такая же временная, как и та, что в параметрах.


немой

ого, пока писал ответ, буков стало больше  :)

Добавлено: 10 Липень 2009, 18:20:22

Цитата: Edd.Dragon від 10 Липень 2009, 19:16:44Я там дописал.
Объявленная внутри переменная, точно такая же временная, как и та, что в параметрах.
не вопрос, я понял. сказал же, что путаюсь=)

Edd.Dragon

А что ты возвратишь - это вообще побоку. Т.к. это совсем третья переменная, которую ты объявил и не в параметрах, и не внутри, а в начале объявления функции:

int someFunction(int param)
{
   int var = 5;
   
   return var + param;
}

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


Добавлено: 10 Липень 2009, 18:20:59

Цитата: немой від 10 Липень 2009, 19:19:04сказал же, что путаюсь=)
Ну теперь не будешь )))

Haker

Посоветуйте хорошую книгу по Си(не си++). Что бы можно было быстро на примерах изучить синтаксис.
Может что у эккеля есть?

Edd.Dragon



http://www.dialektika.com/books/5-8459-0810-8.html



Керниган и Риччи:
http://www.williamspublishing.com/Books/978-5-8459-0891-9.html
Книга не рекомендуется для чтения новичкам; для своего изучения она требует знания основ программирования и вычислительной техники. Книга предназначена для широкого круга программистов и компьютерных специалистов. Может использоваться как учебное пособие для вузов.

delta38

#672
Здравствуйте, хочу попросить помощи, мне нужно сделать так что бы приложение(пишется на С++) прописывало себя в автозагрузку, для этого мне нужно создать ключ в реестре в HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (для текущего пользователя) или HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (для всех пользователей)
я так понимаю для нужно использовать функции RegCreateKeyEx и RegSetValueEx
но что то видимо у меня не срослось может ли кто то привести пример кода по данному поводу

Edd.Dragon

Цитата: delta38 від 14 Липень 2009, 12:29:33но что то видимо у меня не срослось может ли кто то привести пример кода по данному поводу
Так приведи для начала свой. И текст ошибки

delta38

сделал сейчас используя 16битные функции RegCreateKey и RegSetValue, так:

HKEY Key;
if(RegCreateKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion"), &Key) == ERROR_SUCCESS) {
LPCWSTR data=TEXT("C:\\someapp1.exe");
       RegSetValue(Key, TEXT("RUN"), REG_SZ, data, sizeof(LPCWSTR));
}

правда еще не до конца разобрался имя у создаваемого ключа остается по умолчанию

Edd.Dragon

1. А в чем пишешь и где читаешь хелп по функциям?
В MSDN для начала написано "This function is provided only for compatibility with 16-bit versions of Windows. Applications should use the RegCreateKeyEx function."
Тоже касается и RegSetValue. На подобные мелочи следует обращать внимание.

Там же есть и пример использования. Правда в нем много букв.

2. У тебя написано
ЦитатаRegSetValue(Key, TEXT("RUN"), REG_SZ, data, sizeof(LPCWSTR));
И на кой ему длина типа LPCWSTR, если просят длину какой-то конкретной строки, а точнее той, что ты передаешь?

3.
Цитатаимя у создаваемого ключа остается по умолчанию
Так ты его задаешь "RUN"! Т.е. захошь в ключ CurrentVersion и в нем создаешь\открываешь параметр Run! Который там уже есть и не параметр, а подключ. Ну вот ты ему и присвоил значение. Т.е. значение папочке Run. А значение папочки Run - это и есть параметр без имени внутри нее. 


const wchar_t keyName[]   = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
const wchar_t paramName[] = L"MyApp";
const wchar_t value[]     = L"c:\\MyApp.exe";

HKEY key;
long code;

code = RegCreateKeyEx(
HKEY_CURRENT_USER,
keyName,
0,
NULL,
0,
KEY_WRITE,
NULL,
&key,
NULL
);

if(code != ERROR_SUCCESS)
{
printf("Error accessing registry key (error code %d)\n", code);
return 0;
}

code = RegSetValueEx(
key,
paramName,
0,
REG_SZ,
(byte*)value,
sizeof(value)
);

if(code != ERROR_SUCCESS)
{
printf("Error writing value to registry (error code %d)\n", code);
return 0;
}

printf("Operation success!\n");
return 0;


delta38

Цитата
1. А в чем пишешь и где читаешь хелп по функциям?
В MSDN для начала написано "This function is provided only for compatibility with 16-bit versions of Windows. Applications should use the RegCreateKeyEx function."
Тоже касается и RegSetValue. На подобные мелочи следует обращать внимание.
я знаю, я ж и написал что сначала использовал RegCreateKeyEx и RegSetValueEx
а этот пример что я написал, я писал для пробы вобщем
пишу в visual studio 2008, MSDN читал но не совсем понял по поводу этих функций просто :(
Цитата
Так ты его задаешь "RUN"! Т.е. захошь в ключ CurrentVersion и в нем создаешь\открываешь параметр Run! Который там уже есть и не параметр, а подключ. Ну вот ты ему и присвоил значение. Т.е. значение папочке Run. А значение папочки Run - это и есть параметр без имени внутри нее.
спасибо, у меня возникало подозрение что я что то такое и делаю но как сделать еще в голову не пришло потому как у меня иначе получалось что я создаю еще несколько подключей :( поэтому я и написал "Run" это было то что первое в голову пришло

Haker

Привет. Помогите разобраться с функцией.  Нужно сделать следующее задание Перепишите программу преобразования температур, выделив само преобразование в отдельную функцию.
Вот код оригинальной программы:
#include <stdio.h>
/* печать таблицы температур по Фаренгейту и Цельсию */
main()
{
    int fahr;
    for (fahr = 0; fahr <= 300; fahr = fahr + 20)
        printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}

А вот код моей:
#include <stdio.h>

int fahr (int fahr, (5.0/9.0)*(fahr-32));

main()
{
    int fahr;
         for (fahr = 0; fahr <= 300; fahr = fahr + 20)
             printf("%3d %6.1f\n", fahr);
}


Выдает ошибку вот здесь int fahr (int fahr, (5.0/9.0)*(fahr-32)) ") expected"
В чем может быть проблема? Может я не так вообще пишу ???

βεερ_βooρ

Haker, для выделения кода существует тег code(кнопка с решеточкой), в следующий раз пользуйся им.
Во-вторых:
Цитата: Haker від 28 Липень 2009, 16:08:27Выдает ошибку вот здесь int fahr (int fahr, (5.0/9.0)*(fahr-32)) ") expected"
И неудевительно, что выдает.
Так как о что у тебя написано вообще бредовое черти-что. Ты вообще читал как определять в С функции?
Fear is the path to the dark side. Fear leads to anger. Anger leads to hate. Hate leads to suffering.
All that's here is Fear! Suppression! Betrayal! Despair! Contempt! Regret! Sadness! Anguish! Madness! And Pain, right?

Haker

Цитата: βεερ_βooρ від 28 Липень 2009, 22:27:58
Haker, для выделения кода существует тег code(кнопка с решеточкой), в следующий раз пользуйся им.
Во-вторых:И неудевительно, что выдает.
Так как о что у тебя написано вообще бредовое черти-что. Ты вообще читал как определять в С функции?
Хорошо, буду. Читал)

βεερ_βooρ

Цитата: Haker від 29 Липень 2009, 00:07:03Читал)
Эм, что-то это не видно ибо ты ее даже не смог правильно определить. :-X
Fear is the path to the dark side. Fear leads to anger. Anger leads to hate. Hate leads to suffering.
All that's here is Fear! Suppression! Betrayal! Despair! Contempt! Regret! Sadness! Anguish! Madness! And Pain, right?

Edd.Dragon

Цитата: Haker від 29 Липень 2009, 00:07:03Читал)
Ану заскань и выложи пример, где

а) прямо в заголовке функции в скобках, в которых описываются типы и имена параметров, заодно впихнута сама функция (т.е. какие-то формулы)

б) функция называется it_is_function, и ее параметр ТОЖЕ называется it_is_function

Haker

#682
 :( Не могу разобраться(

#include <stdio.h>

int temp()
{
    int fahr;
    for (fahr = 0; fahr <= 300; fahr = fahr + 20)
    return 0;
}

main()
{
    printf("%3.0f %6.1f
", fahr(5.0/9.0)*(fahr-32)):
    return 0;
}


Вообще ничего немогу разобраться(
Заброшу нафиг этот Си навсегда :'(

Добавлено: 29 Липень 2009, 14:46:54

:)  А еще вот так сделал:

#include <stdio.h>

int fahr(int r, int f)
{

    for (f = 0; f <= 300; f = f + 20)
    f = 5.0/9.0 * 32;
    r = f;
    return r;
}

void main()
{
    printf("%3.0f %6.1f\n", fahr);
}


Только теперь не могу разобраться в маин. Что туда нужно вписывать, что бы выводило результат??
Пожалуйста не тюкайте меня. Я и так знаю, что я ВАЛЕНОК

Haker

Блин. Сделал вот как

#include <stdio.h>

int temp(int fahr)
{
    for (fahr = 0; fahr <= 300; fahr = fahr + 20)
    fahr = 5.0/9.0*(fahr-32);
    return fahr;
}

void main()
{
    printf("%3.0d %6.1d\n", temp);

}


Но выдает не то что надо.
706    347
А должно

0   –17
20  –6
40  4
60  15
80  26
100 37
120 48
140 60
160 71
180 82
200 93
220 104
240 115
260 126
280 137
300 148
     Что за бред?? ???

2kin

А на кой черт ты во время выполнения цикла меняешь счетчик???

int foo(int input)
{
        int res = 0;

         for(int counter = 0;counter<=300;counter+=20)
         res  = 5.0/9.0*(counter - 32);
         

         return res;
}


ну и за типами значений следи, переменная res интовая и надо следить за округелниями, кот. происходят при делении.

ЦитатаНо выдает не то что надо.

ну естественно. Выводиться только одно значение. Надо сделать вызов печати в цикле.

Edd.Dragon

#685
Цитата: Haker від 29 Липень 2009, 14:19:49Не могу разобраться(
Код:
#include <stdio.h>

int temp()
{
    int fahr;
    for (fahr = 0; fahr <= 300; fahr = fahr + 20)
    return 0;
}

main()
{
    printf("%3.0f %6.1f
", fahr(5.0/9.0)*(fahr-32)):
    return 0;
}

Вообще ничего немогу разобраться(

А что тут разбираться?
Функция temp ничего не принимает в качестве параметров, что-то делает в цикле (тупо пробегает в переменной fahr от 0 до 300 с шагом 20), и наружу всегда возвращает (по твоей указке) ноль. Странная функция. Но ничего страшного - ты ее все-равно нигде не вызываешь. Т.е. она тобой объявлена просто так и не используется тобой в последствии. Зачем ты ее объявил - не понятно.

Цитата: Haker від 29 Липень 2009, 14:19:49А еще вот так сделал:
Уже на что-то похоже.
Но объясни, если у тебя f - это счетчик, то зачем же ты его ПОРТИШЬ в процессе вычислений?! Тем более он у тебя int! Целый! А ты в него пихаешь результат вычисления 5.0/9.0 * 32, который не целый! А еще раз это счетчик, то что он делает в параметрах? Зачем он там? Ну я вызову твою функцию fahr(5, 10). Т.е. присвою в параметр f число 10. А ты потом внутри функции им не пользуешься, а присваешь туда 0. Зачем спрашивается я туда 10 передавал?

А дальше ты пишешь printf("%3.0f %6.1f\n", fahr); - ну и где же при вызове функции параметры r и f?

Как ты не понимаешь? Ты объявил функцию, точно так же как какой-то уже объявленный cos или max. Тебя же не пугает, когда ты пишешь в программе a = cos(0.33)? А когда пишешь b = min(5, k)? Так вот ты объявил точно такую же функцию, в которую потребовал передавать 2 параметра. а потом не передаешь ничего.

И третья попытка - снова черти что:
int temp(int fahr)
{
    for (fahr = 0; fahr <= 300; fahr = fahr + 20)
    fahr = 5.0/9.0*(fahr-32);
    return fahr;
}

void main()
{
    printf("%3.0d %6.1d\n", temp);

}


ты объявил функцию, значит ее вызов должен быть со скобками! temp(), а не temp. Более того, твоя функция требует чтобы ей дали один параметр - целое число! Т.е. temp(666) например.

1. Но назачем она требует параметр - непонятно. Он ей не нужен.  Она не пользуется им.
2. И в расчетах ты снова издеваешься над счетчиком, пытаясь впхнуть в целое число нецелое, т.е. округляешь!
3. И скобки надо ставить, чтобы читать было удобно и разногласий не возникало
4. А в задаче от тебя вообще просили "выделив само преобразование в отдельную функцию", так что у тебя в функции делает цикл?

Тебя просили написать банально вот такую функцию:

double FahrToCelsius(double fahr)
{
    return 5.0 / 9.0 * (fahr - 32);
}


и использовать ее в цикле вместо прямой вставки формулы в цикл.
Беру и пишу где мне надо c = FahrToCelsius(150), получаю сколько будет в цельсиях 150 по Фаренгейту.


Цитата: Haker від 29 Липень 2009, 14:19:49Заброшу нафиг этот Си навсегда
Так в других тоже самое

Ты не в язык не въедешь, а в сам принцип программирования и написания программ (последовательностей действий)

немой

Operators new and new[]
In order to request dynamic memory we use the operator new. new is followed by a data type specifier and -if a sequence of more than one element is required- the number of these within brackets []. It returns a pointer to the beginning of the new block of memory allocated.

#include <iostream>
#include <new>
using namespace std;

int main ()
{
  int i,n;
  int * p;
  cout << "How many numbers would you like to type? ";
  cin >> i;
  p= new (nothrow) int[i];
  if (p == 0)
    cout << "Error: memory could not be allocated";
  else
  {
    for (n=0; n<i; n++)
    {
      cout << "Enter number: ";
      cin >> p[n];
    }
    cout << "You have entered: ";
    for (n=0; n<i; n++)
      cout << p[n] << ", ";
    delete[] p;
  }
  return 0;
}


почему p[n], а не *(p+n)? получается с указателем на массив (первый элемент) можно работать так как и с обычным массивом? эдд, i need your help  :)

Edd.Dragon

Цитатапочему p[n], а не *(p+n)?
Потому что это одно и то же.
p - это тупо указатель на первый элемент массива.
Хочешь пиши указателями, хочешь - скобками, чтобы читать было удобнее.

int *p - это и есть обычный массив.

А
int pp[10]; - это точно такой же обычный массив, только ему выделится заранее фиксированная память. Но pp - это все так же указатель на первый int в массиве.


βεερ_βooρ

Цитата: Edd.Dragon від 30 Липень 2009, 16:27:58int *p - это и есть обычный массив.
Неточно, int *p - это указатель на int. И если он будет указывать на начало массив в памяти, с ним можно обращться как с векторной переменной.
Вобщем всякий указатель - массив, но не всякий массив - указатель :)
Fear is the path to the dark side. Fear leads to anger. Anger leads to hate. Hate leads to suffering.
All that's here is Fear! Suppression! Betrayal! Despair! Contempt! Regret! Sadness! Anguish! Madness! And Pain, right?

Edd.Dragon

Цитата: βεερ_βooρ від 30 Липень 2009, 23:02:41Неточно, int *p - это указатель на int. И если он будет указывать на начало массив в памяти, с ним можно обращться как с векторной переменной.
А если не будет указывать на начало, то нельзя? ))

Цитата: βεερ_βooρ від 30 Липень 2009, 23:02:41Вобщем всякий указатель - массив, но не всякий массив - указатель
Ну да, следовало уточнить, что оператор [] может быть определен кем-то как душе угодно.
Я же имел ввиду лишь тот функционал, который описан выше. Когда p[n], это и есть *(p + n)

βεερ_βooρ

Цитата: Edd.Dragon від 30 Липень 2009, 23:13:50А если не будет указывать на начало, то нельзя? ))
Ну если он указывает не на начало, то это будет новое начало другого массива. Так что можно всегда. А для любителей вылавливания багов даже нужно, но такие люди в природе не встречаются.
Цитата: Edd.Dragon від 30 Липень 2009, 23:13:50Я же имел ввиду лишь тот функционал, который описан выше. Когда p[n], это и есть *(p + n)
Ну я имел ввиду семантический смысл. Если указатель указывает на какой-то участок данных, то мы можем считать его массивом, а с массивом обращаться соотв. как с указателем.  Но то что мы теоретически можем обращатья с любым указателем в С как с массивом, не значит что это надо делать.  :)
Fear is the path to the dark side. Fear leads to anger. Anger leads to hate. Hate leads to suffering.
All that's here is Fear! Suppression! Betrayal! Despair! Contempt! Regret! Sadness! Anguish! Madness! And Pain, right?

Edd.Dragon

Цитата: βεερ_βooρ від 30 Липень 2009, 23:19:38Но то что мы теоретически можем обращатья с любым указателем в С как с массивом, не значит что это надо делать.
Но знать то, что это можно делать и почему так получается - нужно. Я так понял, выше этап именно получения этих знаний, иначе посоветовал бы срочно обратиться к STL или написать свой класс-обертку для работы с массивами )))

Я так я просто не касался вопроса "зачем"

Andrii

Хто може дати папку denwer від denwer-3? А то я свою випадково видалив, а заново ставити не хочу :)

Garfi

срочно нужно поставить простенькую ide с с++ на Windows 7...
нужно состряпать консольное приложение...
трафик имеет значение...
есть идейки?

βεερ_βooρ

Цитата: Garfi від 09 Вересень 2009, 16:35:24
срочно нужно поставить простенькую ide с с++ на Windows 7...
нужно состряпать консольное приложение...
трафик имеет значение...
есть идейки?
MinGW
Fear is the path to the dark side. Fear leads to anger. Anger leads to hate. Hate leads to suffering.
All that's here is Fear! Suppression! Betrayal! Despair! Contempt! Regret! Sadness! Anguish! Madness! And Pain, right?

Edd.Dragon

Задачка на сообразительность с математическим уклоном.
Учитывая, что с численными методами институтского курса мне приходится с каждым годом сталкиваться все меньше, эта задачка для меня оказалась ребусом. )))

Итак. Имеем исходник без коментов, написанный весьма неаакуратно. Нужно откоментить. Условия задачи не имеем. До этого 5 аналогичных задачек не составили труда и тут на тебе:


#include <conio.h>
#include <iostream>
#include <math.h>

using namespace std;

#pragma argsused
int main(int argc, char* argv[])
{
     double e=0.01;
     double a=-0.557;
     double b=-1.28;
     double c=0.3;
     double d=0.8;
     double x=(a+c)/2;
     double y=(b+d)/2;                                           
     double F[2]={sin(x+0.8)-2*y-1, cos(y+0.6)+0.6*x};
     double J[2][2]={
     {-2/(cos(x+0.8)*sin(y+0.6)+1), -sin(y+0.6)/(cos(x+0.8)*sin(y+0.6)+1)},
     {cos(x+0.8)/(cos(x+0.8)*sin(y+0.6)+1), 0.6/(cos(x+0.8)*sin(y+0.6)+1)}};
     double nor=0.5;
     double number=0;
     double X[2];
     double NewX, NewY;
for (;; ++number)
{
     if (nor>e)
     {
          NewX=x-(J[0][0]*F[0]+J[0][1]*F[1]);
          NewY=y-(J[1][0]*F[0]+J[1][1]*F[1]);
          X[0]=pow(NewX-x,2);
          X[1]=pow(NewY-y,2);
          nor=pow(X[0]+X[1], 0.5);

          x=NewX;
          y=NewY;

          J[0][0]=(-2/(cos(x+0.8)*sin(y+0.6)+1));
          J[0][1]=(-sin(y+0.6)/(cos(x+0.8)*sin(y+0.6)+1));
          J[1][0]=(cos(x+0.8)/(cos(x+0.8)*sin(y+0.6)+1));
          J[1][1]=(0.6/(cos(x+0.8)*sin(y+0.6)+1));

          F[0]=sin(x+0.8)-2*y-1;
          F[1]=cos(y+0.6)+0.6*x;
     }
else {
          std::cout<<"X ? ??­: " << x << endl << " ? ??­: " << y << endl;
          break;
     }}

   getch();

   return 0;
}


Проблема в том, что суть задачи я угадал, но проверить не мог, т.к. она расходится  ;D
Тем не менее, покурил Гугль во второй раз и таки нашел. Да - угадал. Да это метод *****. Но просто кой-чего в исходниках напутали. Пару раз. Грубо.

Собственно, у тех, кто знает, что это за метод, хочу спросить, что за метод в следующей задачи, его что-то не нагуглю. Задача та же, функции те же. Метод гораздо проще. И даже прога отрабатывает, но выдает не верное решение:
#include <conio.h>
#include <iostream>
#include <math.h>

using namespace std;


#pragma argsused
int main(int argc, char* argv[])
{
double e=0.001;
double x=-2.5;
double y=2;
int number=0;
double nor=1.0;
double X[2];

   for (;; ++number)
   {
      if (nor>e)
      {
         double q = x;
         double p = y;
         x = (cos(y + 0.6)) / 0.6;
         y = (sin(x + 0.8) - 1) / 2;
         X[0] = pow(x - q , 2);
         X[1] = pow(y - p , 2);
         nor = pow(X[0] + X[1], 0.5);
      }
      else
      {
         std::cout << "X ? ??­: " << x << endl << " ? ??­: " << y << endl;
         std::cout << "Џ?®?§??¤?­® " << number << " ???? ??©" << endl;
         break;
      }
   }

   getch();

   return 0;
}


Итак,
1. Каким это методом?

И еще вопрос в догонку.  Кто пишет консольные приложения в виндовых редакторах типа С++ Builder? Что-то не нашел в нем настроек кодировки исходников, т.е. русские символы в исходнике имеем в виндовой кодировке, а в консоли то досовская.

2. Есть ли способ сделать так, чтобы и в консоли, и в редакторе билдера была одна и та же кодировка? Либо дос-дос, либо вин-вин. А то неудобно в одном из мест наблюдать кракозябры. При чем в билдере неудобнее, т.к. коменты по-русски )))

Edd.Dragon

С вопросом №1 упорные медитации на формулы в программе таки помогли. Говорят, это называется метод простых итераций.
Ну вопрос №2 не шибко важен

Так что, всем спасибо )))

SA-211

#697
 :)

FalseMan

Цитата: Edd.Dragon від 13 Вересень 2009, 21:55:54
С вопросом №1 упорные медитации на формулы в программе таки помогли. Говорят, это называется метод простых итераций.
Ну вопрос №2 не шибко важен

Так что, всем спасибо )))

CharToOem?

Edd.Dragon

Цитата: FalseMan від 18 Вересень 2009, 00:11:17
CharToOem?
Можно и им, но вообще правильнее было бы исходники редактировать в нужной кодировке. Странно что Борланд не предлагает кодировку исходников задавать. Или я что-то упустил. Впрочем не важно, я им практически не пользуюсь