Форум программистов, компьютерный форум CyberForum.ru

Функция вычисления сопротивления ( С++) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Юля_Гу
0 / 0 / 0
Регистрация: 06.01.2012
Сообщений: 6
06.01.2012, 15:00     Функция вычисления сопротивления ( С++) #1
Добрый день! Работа на тему "Расчет сопротивления резисторов электрической цепи".
для последовательных резисторов: R=R1+R2+Rn;
для параллельно соединенных проводников: 1/R=1/R1+1/R2+1/Rn.
По сути, задача 6 класса, НО в самой функции сложения сопротивления, иногда вылетает ошибка:
"Необработанное исключение типа "System.Runtime.InteropServices.SEH Exception" произошло в Курсовая Юля.exe

Дополнительные сведения: Внешний компонент создал исключение."
Она вылетает, только если создаешь цепь и резисторы в ней соединяешь параллельно, затем последовательно и снова параллельно. или просто используешь 2 раза подряд параллельное соединение. указывает на строку: r=new float[n];
в остальных случаях все ок!
в чем может быть ошибка? Почему ему не нравитсЯ такое выделение памяти?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private: System::Void Calc(float *a){
     R=0; //переменная результата вычисления сопротивления
    float Rn=0; //Переменная-накопитель промежуточных результатов 
     int i1=0,kol1=0,i2=0;
     n=0; //Переменная количества разветвлений на участке цепи
     for(int i=0;i<kol;i++)
     if(a[i]>0)R+=a[i];  //к подсчитанному сопротивленю добавляем положительные элементы массива
    else{ //если элемент отрицательный начинается обработка элементов, описывающих параллельное соединение
 
     for(i1=i+1;a[i1]>-20;i1++) //(a[i+1];a[i]=-20) – диапазон элементов параллельного соединения
    if(a[i1]==-1){n++;kol1++;} //a[i1]=-1 –переход на следующ. лиию
     else kol1++;
 
            float *r;
     kol1++;
     n++;
     r=new float[n]; //создаем массив, каждый элемент которого – сумма сопротивлений одной линии
     for(i1=0;i1<n;i1++)r[i1]=0;
     for(i1=i+1;a[i1]>-20;i1++) //цикл подсчета значений элементов массива *r
     { 
    if(a[i1]!=-1)
    r[i2]+=a[i1];
    else i2++;
     }
     for(i2=0;i2<n;i2++)Rn+=1/r[i2]; //промежуточный подсчет
     R+=1/Rn; //прибавление к ранее подсчитанному сопротивлению величины сопротивления участка параллельного соединения
     i+=kol1; //в дальнейшем просмотре результирующего массива пропускаем элементы, сопротивление которых только что посчитано
     n=0;
     kol1=0;
     i1=0;
     i2=0;
     Rn=0;
 
    delete r;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2012, 15:00     Функция вычисления сопротивления ( С++)
Посмотрите здесь:

Создать программу вычисления сопротивления электрической цепи по известным значениям напряжения и силы тока C++
Рекурсивная функция вычисления факториала C++
Написать программу вычисления сопротивления электрической цепи C++
C++ Написать программу вычисления сопротивления электрической цепи
Написать программу вычисления сопротивления электрической цепи, со-стоящей из двух параллельно соединенных сопротивлений C++
Рекурсивная функция вычисления C++
C++ Запишите в виде инструкции присваивания формулу вычисления сопротивления электрической цепи
Написать программу вычисления сопротивления электрической цепи C++
Функция вычисления факториала C++
Написать программу вычисления сопротивления электрической цепи,состоящей из двух сопротивлений C++
Рекурсивная функция вычисления выражения C++
C++ Рекурсивная функция вычисления факториала

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nicky
3 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 10
07.01.2012, 02:42     Функция вычисления сопротивления ( С++) #2
Юля,

дайте примеры "нормальных" и "глюкогенных" входных данных: есть подозрение, что глючит при любом n, отличном от нуля.
Юля_Гу
0 / 0 / 0
Регистрация: 06.01.2012
Сообщений: 6
07.01.2012, 15:58  [ТС]     Функция вычисления сопротивления ( С++) #3
вот примеры "нормальных" массивов, которые он в силах рассчитать:
n - кол-во строк при параллельном соединении
1 1 -2 1 -1 1 -20
-2 - означает параллельное ветвление на 2 строки
-1 - переход на строку вниз в параллельном ветвлении
-20 - закрыть ветвление
ответ: R=1+1+0.5=2.5


глючный пример:
1 -2 1 -1 1 -20 1 -2 1 -1 1 -20

ответ должен быть: R=1+0.5+1+0.5=3


Добавлено через 15 минут
может не совсем понятно...хотела кинуть скрин, но он не отправляется(
Nicky
3 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 10
09.01.2012, 00:38     Функция вычисления сопротивления ( С++) #4
Нет, все понятно.
Но вернусь к Вам, к сожалению, уже завтра.

Добавлено через 20 часов 1 минуту
Здравствуйте, Юля.

Априорных идей не возникло, поэтому я оформил данный Вами кусок как программу (смотрите ниже) и запустил в Visual C++ 2010 Express (и, на всякий случай, в Dev-C++). Пришлось сделать предположене о значении kol, которое Вы используете. Я использовал kol = размер_массива - 1.

Ни в одной из этих IDE ошибки времени исполнения не возникает.

(Ответ для первого случая входных данных совпадает с правильным, для второго - нет (1.51351; при kol = размер_массива получается 9.51351)).

Одно замечание по управлению памятью: поскольку r - указатель на массив, освобождайте память под ним командой delete[] r. Хотя никто не заругался и на Вашу delete r.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
 
int main() {
//       int a[] = {1, 1, -2, 1, -1, 1, -20};
//       int kol = 7-1;
 
       int a[] = {1, -2, 1, -1, 1 -20, 1, -2, 1, -1, 1, -20};
       int kol = 12-1;
 
       float R=0; //...
       float Rn=0; //... 
       int i1=0, kol1=0, i2=0;
       int n=0; //...
       for(int i=0; i<kol; i++)
              if(a[i] > 0)  R += a[i];  //...
              else{ //...
 
                     for(i1 = i+1; a[i1] > -20; i1++) //(a[i+1];a[i]=-20) – ...
                            if(a[i1] == -1)  { n++; kol1++; } //a[i1]=-1 – ...
                            else kol1++;
 
                     float *r;
                     kol1++;
                     n++;
                     r = new float[n]; //...
                     for(i1=0; i1<n; i1++)  r[i1] = 0;
                            for(i1=i+1; a[i1] > -20; i1++)  { //...
                                   if(a[i1] != -1)  r[i2] += a[i1];
                                   else  i2++;
                            }
                            for(i2=0; i2<n; i2++)  Rn += 1 / r[i2]; //...
                            R += 1 / Rn; //...
                            i += kol1; //...
                            n = 0;
                            kol1 = 0;
                            i1 = 0;
                            i2 = 0;
                            Rn = 0;
                            delete[] r;
                }
 
       std::cout << "R = " << R << '\n';
 
       system("pause");       return 0;
}
Юля_Гу
0 / 0 / 0
Регистрация: 06.01.2012
Сообщений: 6
12.01.2012, 13:32  [ТС]     Функция вычисления сопротивления ( С++) #5
Спасибо большое!!! убедилась, что проблема все-таки не в коде) в другой студии все работало
Yandex
Объявления
12.01.2012, 13:32     Функция вычисления сопротивления ( С++)
Ответ Создать тему
Опции темы

Текущее время: 05:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru