Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> private member declared in class std::basic_ios<_E, при передаче файловой переменной в ф-ю 
V
    Опции темы
KasMP
Дата 21.12.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(KasMP @  21.12.2008,  17:30 Найти цитируемый пост)
Соответствующий кусочек main():

esc и res - указатели на символ

Добавлено @ 17:41
Цитата(mes @  21.12.2008,  17:35 Найти цитируемый пост)
Вот тебе (не программе) сказали что надо сложить два числа. Tебе кто-то должен передавать ментал ?

Да что-то такое smile !!
Ты складываешь поразрядно (столбиком, проще говоря; перед сложением второго разряда тебе передают mental=1):
4569
 111
4680

Если тебе не передавать mental, то ты сложишь так:
4569
 111
4670

Цитата(mes @  21.12.2008,  17:35 Найти цитируемый пост)
В смысле бывает и меньше ?? Ну ка сложи мне 1 и .. не.. не так...  сложи 1.  Логично, а ?

(женская логика?)
Ну ты складываешь, скажем, 11111111111 и 1:
Конечно, можно складывать и так:
11111111111
00000000001
11111111112

Но имхо лучше сложить 1+1, потом увидеть, что во втором числе остальных разрядов нет и приложить остальные разряды первого!!

Это сообщение отредактировал(а) KasMP - 21.12.2008, 17:47
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:30 Найти цитируемый пост)
Ну, ты называешь аргументом символ, я называю указатель на символ smile ... 

нет .. я аргументом называю число, а выражено оно символом, указателем на символ или чем то другим, зависит от задачи и ее исполнения.


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:42 Найти цитируемый пост)
нет .. я аргументом называю число, а выражено оно символом, указателем на символ или чем то другим, зависит от задачи и ее исполнения. 

Ну число, какая разница smile ... Я тоже имела в виду число-символ-указатель smile ...

Добавлено через 1 минуту и 24 секунды
Цитата(mes @  21.12.2008,  17:35 Найти цитируемый пост)
Вот тебе (не программе) сказали что надо сложить два числа. Tебе кто-то должен передавать ментал ?

Ну, сначала нет... Но потом mental мне потребуется и я буду его сама себе передавать при сложении каждого разряда.
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:35 Найти цитируемый пост)
Ты складываешь поразрядно 

Ты должна сделать функцию не сложения разрядов, а сложения чисел - а как она будет считаж столбиком или по другому - это нас не касается.

Добавлено @ 17:49
Цитата(KasMP @  21.12.2008,  17:44 Найти цитируемый пост)
Но потом mental мне потребуется и я буду его сама себе передавать при сложении каждого разряда. 

Представь я вызов (клиент), ты функция (сервер) :
я тебе даю два числа.. У тебя есть листик, карандаш (а может калькулятор я ведь не вижу)  ты считаешь и отдаешь мне результат.. ничего больше никому передоваться не должно !

Это сообщение отредактировал(а) mes - 21.12.2008, 17:50


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:47 Найти цитируемый пост)
я тебе даю два числа.. У тебя есть листик, карандаш (а может калькулятор я ведь не вижу)  ты считаешь и отдаешь мне результат.. ничего больше никому передоваться не должно ! 

Так это и делает функция Addition: ей дали два числа (указатели на начала списков), она дала указатель на res (на результат).
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:50 Найти цитируемый пост)
Так это и делает функция Addition: ей дали два числа (указатели на начала списков), она дала указатель на res (на результат). 

давать надо не указатель на список! и не его элемент! а "значение" элемента списка! 

то есть вызов должен быть Add (stack->value, stack->value, res );






--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:58 Найти цитируемый пост)
и не его элемент! а "значение" элемента списка! 

А элемент списка и его значение  - не одно и то же??
Цитата(mes @  21.12.2008,  17:58 Найти цитируемый пост)
то есть вызов должен быть Add (stack->value, stack->value, res );

Ты, возможно, рассердишься, но ... куда девать то, что получится в уме smile ?
PM MAIL   Вверх
mes
Дата 21.12.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  18:02 Найти цитируемый пост)
Ты, возможно, рассердишься, но ... куда девать то, что получится в уме smile ? 

вот декларация функции :
void lvAdd (const char * a1, const char * a2, char * res);
реализовывай  smile

Добавлено через 4 минуты и 36 секунд
Цитата(KasMP @  21.12.2008,  18:02 Найти цитируемый пост)
А элемент списка и его значение  - не одно и то же??

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

У нас есть число, оно представлено как си-строка , больше ничего нам не нужно.



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  18:35 Найти цитируемый пост)
У нас есть число, оно представлено как си-строка

Я так же буду размещать цифры это супер-длинного числа в списке, потом складывать столбиком.

Вообще говоря, довольно интересен ответ на вопрос о том,почему не работает уже написанная программа?
Что такого необычного в 
Код
t=int(present1->c-'0')+int(present2->c-'0')+mental;

PM MAIL   Вверх
mes
Дата 21.12.2008, 20:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  19:44 Найти цитируемый пост)
Что такого необычного в 

я в принципе хотел, чтоб Вы сами ее нашли, к чему бы Вы пришли, если послушались совета. 
но раз уж так сильно хотите оставаться при своем коде - пожалуйста.. 

Цитата(KasMP @  21.12.2008,  16:49 Найти цитируемый пост)
    while (present2!=NULL) {
         t=int(present1->c)+int(present2->c)+mental-96; // сложили разряд
         *(res+len-1)=t%10+48; // добавили разряд к результату
         
         len--; mental=t/10; // 
                                                   //А где операции с другими разрядами ?! (1)

         present1=present1->next; delete h1; h1=present1; // перешли к следующему числу , a к какому? вы его разве загрузили или пометили последний указатель нулем? (2)
                                                                                         // и удалили старое
         present2=present2->next; delete h2; h2=present2;
         }


Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
int main()
{
    stack    *h1, *h2;
    ifstream f1(path1); ifstream f2(path2); ofstream fout(pathout);
    
    int i;
    char *s1, *s2, *res;
    
    s1=new char[]; s2=new char[];
    char *esc=new char[];
    //while ((!f1.eof()) && (!f2.eof()))
    {
        f1.getline(s1,MAX,' '); f2.getline(s2,MAX,' ');  // загрузили строки с файла в s1 и s2
        printf("s1=%s.\n", s1); printf("s2=%s.\n", s2); // вывод
        int len1=strlen(s1), len2=strlen(s2); // взяли длину от s1 и s2
        if (len1>len2) {                  // сравнили
            res=new char[len1+1]; // выделили место
            esc=Addition(h1,h2,res); // и вызвали передав в параметрах h1 и h2 - a где собстевенно заполнение этих структур ?? (3)
        } else {
            res=new char[len2+1];
            esc=Addition(h2,h1,res);
        }
    }

Вылетаeт из за (3), но (2) тоже могла бы явиться причиной, ну а из за (1) у вас результат сложения неправильный..

P.S. 
в этом посте обращение на "Вы" намерянное  smile  


Это сообщение отредактировал(а) mes - 21.12.2008, 20:41


--------------------
PM MAIL WWW   Вверх
mes
Дата 21.12.2008, 20:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  19:44 Найти цитируемый пост)
Я так же буду размещать цифры это супер-длинного числа в списке, потом складывать столбиком.

в список эти числа будут загружаться и выгружаться.. а операции над числами должны производится без участия стека!


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
А где операции с другими разрядами ?! (1)

При следующем проходе цикла while smile  smile !
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
перешли к следующему числу , a к какому?

Мы перешли не к след.числу, а к след.разряду smile !
Элемент списка - не число, а разряд smile.
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
вы его разве загрузили или пометили последний указатель нулем? 

Разумеется smile  smile !
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
и удалили старое

Ну, по-моему, логично как можно раньше избавиться от ненужного smile ...
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
и вызвали передав в параметрах h1 и h2 - a где собстевенно заполнение этих структур ?? (3)

Ой!!! Я забыла вызвать CreationStack smile  smile !

Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
но раз уж так сильно хотите оставаться при своем коде - пожалуйста.. 

К сожалению, хочу, потому что время поджимает. Но в зимние каникулы с радостью сделаю все идеально smile .
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
в этом посте обращение на "Вы" намерянное 

Становится все интереснее smile . Интересно, что же это "Вы" значит smile ...
Цитата(mes @  21.12.2008,  20:53 Найти цитируемый пост)
а операции над числами должны производится без участия стека! 

Я согласна с этим, но ... не сейчас smile.


Добавлено через 2 минуты и 47 секунд
Вот, я добавила в соответствующее место в main два CreationStack. Вылетает та же ошибка smile .
Попробовала сначала все-таки инициализировать h1 и h2, потом вызывать создание "стека". То же самое smile.
"Стеки" заполняются правильно, а потом после входа в Addition на этой магической строчке все вылетает... Странно. 
PM MAIL   Вверх
mes
Дата 21.12.2008, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
К сожалению, хочу, потому что время поджимает. Но в зимние каникулы с радостью сделаю все идеально smile .

Так сделать понормальному уйдет час, а Вы день потратили на переборку кода )

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
Становится все интереснее smile . Интересно, что же это "Вы" значит smile ...

догадайся )

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
Элемент списка - не число, а разряд smile.

То есть число представлено стеком, так еше на основе списка ?? a кто то говорил, что она экономная  smile 
а массив чисел загружаемых с файла чем является ?

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
Ой!!! Я забыла вызвать CreationStack smile  smile !

боюсь что не только.

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
Попробовала сначала все-таки инициализировать h1 и h2, потом вызывать создание "стека". То же самое smile.

Не вижу  smile 

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
"Стеки" заполняются правильно,

не верю  smile 






--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
Так сделать понормальному уйдет час, а Вы день потратили на переборку кода )

Было уже поздно что-то менять.
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
догадайся )

Теряюсь в догадках smile .
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
То есть число представлено стеком, так еше на основе списка ??

Ну да... smile
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
a кто то говорил, что она экономная

??
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
а массив чисел загружаемых с файла чем является ?

Прочитали в строку число. Каждый символ строки - элемент списка.
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
боюсь что не только.


Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
Не вижу 

Зачем каждый мизерный кусочек кода сюда вставлять?
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
не верю

Я дополнила CreationStack строчкой вывода:
Код
printf("%c ", *(s+i));

В итоге у меня цифры 1) выводились; 2) в правильном порядке.
Код

void CreationStack (stack *h, char *s)
{
    int i, n=strlen(s);
    stack *present;

    //h=new stack;
    present=h;
    for (i=n-1; i>-1; i--) {
        present->c=*(s+i);
        printf("%c ", *(s+i));
        present->next=new stack;
        present=present->next;
    }
    present=NULL;
}


Добавлено через 11 минут и 25 секунд
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
не верю

не знаю, она работает так: получает инициализированный указатель на структуру и символ, внутри себя создает текущий указатель, для начала приравнивает его к указателю на голову списка, потом первому "c" присваивает последний символ строки, инициализирует следующий за текущим указатель, сдвигает текущий указатель и т.д. по кругу, последний текущий указаетль приравнивает у нулю
PM MAIL   Вверх
mes
Дата 22.12.2008, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:59 Найти цитируемый пост)
Реализовать стек на основе динамических списков. С помощью него решить следующую задачу: в двух файлах записаны длинные натуральные числа (количество знаков больше 20). Найти их сумму и выписать ее в третий файл.

и все таки стек надо реализовывать для чисел, а не для цифр.

вот длинная арифметика  :
Код

#include <iostream>

bool isDigit (char c) { return c>='0' && c<='9'; }

struct lv_value 
{
// никогда не изменяйте содержимое, кроме как в предназначенных для этого функциях с префиксом lv_
    char *begin;
    char *end;
};
void lv_create (lv_value& lv) // конструктор 1
{
    lv.begin = NULL;
    lv.end   = NULL;
}

void lv_create (lv_value& lv, const char * str) // конструктор 2
{
    const char * p = str;
    for (;isDigit(*p); ++p) ;   // ищем первый не символ,

    lv.begin = new char[p-str];  // создаем внутренний массив
    char * p1 = lv.begin;
    for (;str<p; ++str, ++p1) *p1 = *str; // копирование нужных символов
    *(p1) = 0;
    lv.end =p1;
}

void lv_create (lv_value& dst, const lv_value& src) // конструктор копий
{
    dst.begin = new char[src.end-src.begin];  // создаем внутренний массив

    char * p  = src.begin;
    char * p1 = dst.begin;

    for (;p<=src.end; ++p, ++p1) *p1 = *p; // копирование нужных символов
    dst.end =p1-1;
}

void lv_destroy (lv_value& lv)   // деструктор
{
    if (lv.begin!=NULL) delete[] lv.begin;
    lv.begin = NULL; // не обязательные строчки
    lv.end   = NULL; // но оставим их .. для красоты )
}

std::ostream& operator << (std::ostream& o, const lv_value& lv)
{
    if (lv.begin) o << lv.begin;
    else o<<"lv_empty";
    return o;
}

size_t lv_length (const lv_value& lv)
{
    return (lv.begin)? lv.end-lv.begin : 0;
}

void lv_add (const lv_value& lv1, const lv_value& lv2, lv_value& res)
{
     lv_destroy(res);

     size_t len1 = lv_length(lv1);
     size_t len2 = lv_length(lv2);

     if (len1 && !len2) { lv_create (res, lv1); return; }  // если одно из чисел пустое
     if (len2 && !len1) { lv_create (res, lv2); return; } // то результат равен другому

     if (!len1 && !len2) { lv_create(res, "0"); return; } // если оба пустые, то 0

     size_t len = (len1>len2)? len1 : len2;
     ++len; // увеличиваем про запас

     char str[len+1]; // временный буффер
     for (int i=0; i<=len; ++i) str[i] = 0; // обнуляем

     for (int i=0; i<lv1.end-lv1.begin; ++i) str[len-1-i] = *(lv1.end-1-i); // накладываем на буфер первое число

     int mental=0;
     for (int i=0; i<lv2.end-lv2.begin; ++i)
     {     // прибавляем второе :
          int t =  str[len-1-i]-'0' + *(lv1.end-1-i)-'0' + mental;
          str[len-1-i]=(t%10)+'0';
          mental = t/10;
    }

    if (!mental) lv_create(res, str+1);
    else {
             str[0]='0'+mental;
             lv_create(res, str);
         }

}

const char * lv_test_str = "5432132a4";

int main()
{
    lv_value lv1;   // не забывать после каждой инициализации новой перемнной
    lv_create(lv1); // вызывать конструктор (на cpp это делается автоматически)
    std::cout<<"test constructor : "<<lv1<<" length="<<lv_length(lv1)<< std::endl;

    lv_value lv2;
    lv_create(lv2,lv_test_str);// формирование длиного_числа из си-строки
    std::cout<<"test constructor from string : "<<lv_test_str<<" " <<lv2<<" length="<<lv_length(lv2)<< std::endl;

    lv_value lv3;
    lv_create (lv3, lv2); // формирование длиного_числа по образу другого
    std::cout<<"test copy-constructor : "<<lv3<<" length="<<lv_length(lv3)<< std::endl;

    lv_value lv4;    // после создания переменной
    lv_create (lv4); // вызываем конструктор прежде, чем
    lv_add(lv2, lv3, lv4);  // отправить lv4 как аргумент
    std::cout<<"test add : "<<lv4<<" length="<<lv_length(lv4)<< std::endl;

    lv_add(lv2, lv1, lv4);
    std::cout<<"test add : "<<lv4<<" length="<<lv_length(lv4)<< std::endl;

    lv_add(lv1, lv2, lv4);
    std::cout<<"test add : "<<lv4<<" length="<<lv_length(lv4)<< std::endl;

    lv_destroy(lv4); // а также не забывать удалять
    lv_destroy(lv3); // перед выходом за границу блока
    lv_destroy(lv2);
    lv_destroy(lv1);

    getchar();
    return(0);
}

осталось загрузить числа в стек, сложить их и отправить результат в файл.  smile 

Это сообщение отредактировал(а) mes - 22.12.2008, 17:40


--------------------
PM MAIL WWW   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.