Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2013, 18:33   #1
Sergey_gorobets
Пользователь
 
Регистрация: 08.02.2013
Сообщений: 69
По умолчанию Производные классы С#

Запутался что то вообще...(((
фот фрагмент кода...может не корректно записано, но результат достигнут(все работает).
Код:
....
class C : B
{
    public int h;
    public void CC()
    {
        B jj = new B();
        jj.BB();//в методе определяется переменная d
        h = 3 *jj.d ;
        Console.WriteLine("d в классе B=  "+jj.d);
Console.WriteLine("h= "+h);
    }
}
вот второй фрагмент второго кода..все вроде бы идентично и принцип тот же, но второй не работает..Почему?И как лучше обратиться к jj.As ?

......
Код:
class PodborDiametra:raschetu
{
    public void podbor_diam()
    {
        raschetu jj=new raschetu();
        jj.armatura();// в методе определяется переменная As
        Console.WriteLine("As= "+jj.As);//не работает и выдает ноль.((
    }
}
Заранее спасибо.
Sergey_gorobets вне форума Ответить с цитированием
Старый 29.03.2013, 22:26   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

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

Последний раз редактировалось phomm; 29.03.2013 в 23:05.
phomm вне форума Ответить с цитированием
Старый 29.03.2013, 22:53   #3
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Может всё таки описание классов выложите? Как другим узнать почему As не изменяется, если не видно где она вообще должна изменятся.
RomiKon вне форума Ответить с цитированием
Старый 29.03.2013, 23:10   #4
Sergey_gorobets
Пользователь
 
Регистрация: 08.02.2013
Сообщений: 69
По умолчанию Код очень длинный...Скучно будет разбираться

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

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

Код:
,,,,,,,

class raschetu : danue//клас raschetu производный от класса dannue
,,,,,,
    public double armatura()//Метод подсчитывает площадь арматуры;
    {
        if (fff)//fff-значение, которое определяет нужна ли верхняя арматура
        {
            Console.Write("Площадь нижнего армирования балки ");
            As = (M * 10000000) / (365 * z2 * h_o);
        }
        else
        {
            //Console.WriteLine("Расчет нижней арматуры с учетом верхнейї");
            As = ((0.55 * B * h_o * Rb) / 365) + Asv;
        }

// теперь создаю класс подбора диаметра арматуры
class PodborDiametra:raschetu
{
    public void podbor_diam()
    {
        raschetu jj=new raschetu();
        jj.armatura();// в методе определяется переменная As
        Console.WriteLine("As= "+jj.As);//не работает и выдает ноль.(( а требуется получить одно из значений As определенных в методе armatura()
// как в етом класе получить значение As ???
    }
}
Sergey_gorobets вне форума Ответить с цитированием
Старый 30.03.2013, 10:53   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Нет слов.
Вы ВООБЩЕ ПОНИМАЕТЕ, что надо весь код обоих классов, или , ещё лучше - проект весь. Проблема может быть в совершенно другом месте, Вы же показываете лишь крохотную часть - вызов кода.
phomm вне форума Ответить с цитированием
Старый 30.03.2013, 11:01   #6
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Изумительно, у вас проблема с получением jj.As, только вы нигде не показали что из себя представляет As.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 30.03.2013, 13:28   #7
Sergey_gorobets
Пользователь
 
Регистрация: 08.02.2013
Сообщений: 69
По умолчанию первая часть

Код:
using System;

class danue  //вводим табличные данные (константы);
{
    public string[] klassbetona = { "B15", "B20", "B25", "B30"}; // клас бетона;
    public double[] prochnostbetona = { 7.7, 10.5, 13.0, 15.5 }; // прочность бетона в МПа;
    public double[] Ar = { 0.44, 0.43, 0.422, 0.413 }; // коеф. Ar по т. 18 по СП;
    public double[] Am = { .....}; //таблица 20 СП;
    public double[] z = {.....}; //таблица 20 СП;
    public int[] D = { 4,5,6,8,10,12,14,16,18,20,22,25,28,32,36,40};//Диаметры арматуры
    public int[] S_d = { 10,20,30,50,80,110,150,200,250,310,380,490,620,800,1020,1260};//площадь скчения одного стержня
}
class raschetu : danue 
{
    public double M, q, L, H, B, a, am1, am2, a1;
    public double a_m, Rb, h_o, ar, z1, z2, As, Asv, z3;// обьявляю As
    public bool fff, ddd;

    public int d, i, qwe;
    public double As_od;
    public double proch()//метод визначення міцності по класу бетона;
    {
    loop:
        Console.Write(" Введите клас бетона балки ( В15,В20...) и нажмите ентер (английская розкладка клавиатуры): ");
        string name = Console.ReadLine();
        for (int i = 0; i < klassbetona.Length; i++)
        {
            if (name == klassbetona[i])
            {
                ddd = true;
                Rb = prochnostbetona[i];
                ar = Ar[i];
                //Console.WriteLine("прочность бетона"+" "+ Rb);
                break;
            }
        }
        if (!ddd)
        {
            Console.WriteLine("Такого нету. Бетон от В15 до В30");
            goto loop;
        }
        return Rb;
    }
    public void nagruzka()//Метод ввода нагрузки;
    {
    loop1:
        Console.Write(" Введите равномернораспределенную нагрузку  в т/м. (q) и нажмите ентер: ");
        bool result_q = double.TryParse(Console.ReadLine(), out q);
        if (!result_q)
        {
            Console.WriteLine("Не коректно введены данные нагрузки");
            goto loop1;
        }
        q = Math.Abs(q);
    }
    public void dlina()//Метод вводу длины;
    {
    loop2:
        Console.Write(" Введите длину прольота в метрах (L) и нажмите ентер: ");
        bool result_L = double.TryParse(Console.ReadLine(), out L);
        if (!result_L)
        {
            Console.WriteLine("Не коректно введены данные прольота");
            goto loop2;
        }
        L = Math.Abs(L);
    }
    public void vusota()// Метод вводу высоты балки;
    {
    loop3:
        Console.Write(" Ведите высоту балки в милиметрах (H)и нажмите ентер: ");
        bool result_H = double.TryParse(Console.ReadLine(), out H);
        if (!result_H)
        {
            Console.WriteLine("Не коректно введены данные висоты балки");
            goto loop3;
        }
        H = Math.Abs(H);
        //Console.WriteLine("H= " + H);
    }
    public void wuruna()//Метод вводу ширини балки;
    {
    loop4:
        Console.Write(" Введите ширину балки в милиметрах (B) i нажмите ентер: ");
        bool result_B = double.TryParse(Console.ReadLine(), out B);
        if (!result_B)
        {
            Console.WriteLine("Не коректно введены данные ширины балки");
            goto loop4;
        }
        B = Math.Abs(B);
        //Console.WriteLine("B= "+B);
    }
    public void robvusota()//Метод вводу защитного слоя;
    {
    loop5:
        Console.Write(" Введiте защитный слой нижней арматуры балки в милиметрах (a) i нажмите ентер: ");
        bool result_a = double.TryParse(Console.ReadLine(), out a);
        if (!result_a)
        {
            Console.WriteLine("Не коректно введены данные защитного слоя нижней арматуры балки");
            goto loop5;
        }
        h_o = H - Math.Abs(a);
    }
    public void moment()//Метод определения моменту;
    {
        double g = B * H * 2.5 * 1.1 / 1000000;
        //Console.WriteLine("g="+g);
        M = (q + g) * L * L / 8;
        //Console.WriteLine("M= "+M);
    }
    public void kof_Am()//метод определения коефіцієнта Аm
    {
        a_m = M * 10000000 / (Rb * B * h_o * h_o);
        // Console.WriteLine("am= "+"{0:#.###}",a_m);
    }
    public void porivn()//Метод определеяет необходимость верхней арматуры
    {
        if (a_m < ar)
        {
            fff = true;
        }
        else
        {
            fff = false;
            Console.WriteLine();
            Console.WriteLine("По расчету необходима верхняя арматура");
        loop6:
Sergey_gorobets вне форума Ответить с цитированием
Старый 30.03.2013, 13:29   #8
Sergey_gorobets
Пользователь
 
Регистрация: 08.02.2013
Сообщений: 69
По умолчанию вторая часть

Код:
 Console.Write(" Введите защитный слой верхней арматуры балки в милиметрах (a1)и нажмите ентер: ");
            bool result_a1 = double.TryParse(Console.ReadLine(), out a1);
            if (!result_a1)
            {
                Console.WriteLine("Не коректно введены данные защитного слоя верхней арматуры балки");
                goto loop6;
            }
            a1 = Math.Abs(a1);
            Asv = (M * 10000000 - 0.4 * Rb * B * h_o * h_o) / (365 * (h_o - a1));//площaдь верхней арматуры
        }
    }
    public void realz()//Метод определяет (интерполирует) и возвращает необходимое значение зет;
    {
        for (int i = 0; i < Am.Length; i++)
        {
            if (a_m < Am[i])
            {
                am1 = Am[i - 1];
                am2 = Am[i];
                z1 = z[i - 1];
                z3 = z[i];
                z2 = z1 - ((a_m - am1) / (am2 - am1)) * (z1 - z3);
                break;
            }
        }
        //Console.WriteLine("дзета "+z2);
    }
    public double armatura()//Метод возвращает площадь арматуры;
    {
        if (fff)
        {
            Console.Write("Площа нижней арматуры балки ");
            As = (M * 10000000) / (365 * z2 * h_o);
        }
        else
        {
            //Console.WriteLine("Расчет нижней арматуры с учетом верхней");
            As = ((0.55 * B * h_o * Rb) / 365) + Asv;
        }
        return As;
    }
//вот следующий метод я хочу выделить в отдельный клас
    public void podarm()
    {
        As_od = As / 3;
        for (i = 0; i < S_d.Length; i++)
            if (As_od < S_d[i]){
                Console.WriteLine("Принимаем 3 " + " стержня диаметром " + D[i]); break;}
        Console.WriteLine("Фактическая площадь арматуры "+3*S_d[i]+" мм.кв.");
    }
}
class rabota
{
    public static void Main()
    {
        beck:
        string a = "yes";
        Console.WriteLine("Расчет арматури однопрольотной з/б балки, з шарнирным опираннием, с равномернораспределенной нагрузкой i арматурой класу А400С");

        Console.WriteLine();
        raschetu ob = new raschetu();
        ob.proch();
        ob.nagruzka();
        ob.dlina();
        ob.vusota();
        ob.wuruna();
        ob.robvusota(); 
        ob.moment();
        ob.kof_Am();
        ob.porivn();
        ob.realz();
        ob.armatura();
        if (!ob.fff)
        {
            Console.Write("Площадь верхней арматуры балки ");
            Console.WriteLine("Asv= " + "{0:#.###}" + " мм.кв", (int)ob.Asv);
            Console.Write("Площадь нижней арматуры с цчетом верхней ");
            Console.WriteLine("As= " + "{0:#.###}" + " мм.кв", (int)ob.As);
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine("As= " + "{0:#.###}" + " мм.кв", (int)ob.As);
            ob.podarm();
            //Console.Write("Нижнее армирование "+ob1.n);
            
        }
        Console.WriteLine();
        Console.WriteLine("Посчитать еще раз?");
        Console.WriteLine("Если да, то введите (yes),если нет, то (no)");
        string s = Console.ReadLine();
        if (s == a) goto beck;
        else return;
        Console.ReadKey();
    }
}
Sergey_gorobets вне форума Ответить с цитированием
Старый 30.03.2013, 22:03   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я не вижу криминала, кроме приведения к int , зачем оно Вам, в начале же темы его и не было. Вообще надо трассировать (отладка по шагам, f11 в вижуал студии) расчёт, есть вероятность что всё считается нормально, но ответ получается близкий к 0 приведение к инт его как раз и делает 0. А почему получается близкий к 0 - надо формулы перепроверять, либо в них напортачили, либо размерностей каких не учли, метры миллиметры например спутаны )

Ну а сам код вообще плохо написан, немудрено, что идут ошибки. Хоть Вы и начинающий, но нужно всё же стремиться писать в хорошем стиле. Ну и орфографию тоже подтянуть бы.

Повеселило:
Цитата:
нажмите ентер (английская розкладка клавиатуры)
phomm вне форума Ответить с цитированием
Старый 30.03.2013, 23:34   #10
Sergey_gorobets
Пользователь
 
Регистрация: 08.02.2013
Сообщений: 69
По умолчанию

Спасибо за то что уделили время и разбирались в скучной теме, для умеющего человека. На счет увеселительных елементов, так в задании требуется разработать максимально детализированную пошаговую инструкцию)).
А на счет плохо написанного кода: какие премудрости и приемы использовать для "доведения его до ума"?
Просто учусь по книге Шилдт Герберт. Полный справочник 2003 г. и там рекомендуется выделять в отбедльные методы, так сказать, отдельные расчеты..по-етому все разделял и расписывал. так же старался обработать разного рода исключительные ситуации, которые будут предотвращать аварийное закрытие программы, в случае некоректно введенных данных.
пока что всю до конца не прочитал.

Так вот, если можно в общих словах, или, если будет время, желание и вдохновение учить)), более подробно , порекомендовать на что обратить внимание и какими приемами пользоваться в данной ситуации?
Sergey_gorobets вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив указателей на производные классы number0ne Общие вопросы C/C++ 10 17.06.2012 21:32
производные классы missg C++ Builder 15 10.04.2012 18:16
класс employee и производные классы olik83 Общие вопросы C/C++ 7 21.09.2009 22:44
С++ Производные классы (Ошибка) Sweta Помощь студентам 9 23.04.2008 12:58
базовые и производные классы (В чём моя ошибка) umnix Общие вопросы C/C++ 5 01.12.2007 17:26