Форум 3DNews

Форум 3DNews (http://forum.3dnews.ru/index.php)
-   Программирование (http://forum.3dnews.ru/forumdisplay.php?f=44)
-   -   Вылетает консольная программа на Си (http://forum.3dnews.ru/showthread.php?t=135733)

chajnik 04.11.2015 04:28

Вылетает консольная программа на Си
 
Учусь программированию на Си. Пишу в среде dev-cpp.

Задание следующее:
Для значений i=1, 2,..,n вычислить число сочетаний из n по
i и занести результаты в массив С={С1,С2,..,Сn}, используя
Ci= n!/(i!(n - i)!). Число n>0 ввести с клавиатуры. Полученный массив вывести на экран.

Написал следующее:

PHP код:

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

int main()
{
//    Определяем переменные и массив.
    
int ins;
    
float A[n], f1f2f3;

//    Ввод n с клавиатуры.
    
printf(" Укажите размерность массива А[n], введя n с клавиатуры (n > 0): ");
    
scanf("%d",&n);

//    Вычисляем факториал (n)! (const).
    
f1=1;

    for(
i=0s=0<= ni++, s++)
    {
        if    (
i==0)
        {
            
i=1;
        }

        
f1*=i;

        
i=s;    //    Возвращаем i значение s для дальнейшего цикла.
    
}


//    Вычисляем факториалы    f2=(i)!    и    f3=(n - i)!        Спомощью факториалов f1, f2, f3 находим значения элементов массива A[i].
    
f2=1;

    for    (
i=0s=0;    n;    i++, s++)
    {
        if    (
i==0)
        {
            
i=1;
        }

        
f2*=i;    //    Вычисляем факториал f2.

        
i=s;    //    Возвращаем i значение s во внешнем цикле.

    //    Вычисляем факториал f3.
        
f3=1;

        for    (    ;    
<= n;    i++)
        {
            if    (
i==n)
            {
                
i1;
                
f3=f3*(n  i);
                
in;
            }
            else
            {
                
f3=f3*(n  i);
            }
        }

        
i=s;    //    Возвращаем i значение s во внешнем цикле.

        
A[i]=f1/(f2*f3);    //    Формула нахождения значения элементов массива A[i].

        
printf(" %.1f\n",A[i]);
    }
system("pause");


Программа работает, даже правильные ответы выдает, но когда ввожу n=10, то почему-то она начинает вылетать, хотя все 10 элементов считает и выводит. Не могу никак понять в чем ошибка.

garniv 04.11.2015 08:22

Вложений: 1
chajnik
http://habrahabr.ru/post/131412/
http://galiego710.blogspot.ru/2011/1...lt-sigfpe.html

chajnik 04.11.2015 11:58

garniv
Боюсь это не для моего уровня знаний. Как связан обычный Си с фичами С++?

garniv 04.11.2015 13:34

Цитата:

Сообщение от chajnik (Сообщение 2506925)
Боюсь это не для моего уровня знаний

Дорогу осилит идущий :) Начианй с более простых задач. Наставь "алертов" чтобы видеть промежуточные результаты и значения всех переменных после каждого действия. Или используй возможности дебага dev-cpp:

http://www.cyberforum.ru/cpp-beginners/thread49951.html
http://forum.developing.ru/showthrea...0-%D0%B2-Dev-C

https://www.youtube.com/watch?v=kHFpzxMFB3E
http://www.youtube.com/watch?v=Jq1WTkOlk3w
http://cboard.cprogramming.com/cplus...cplusplus.html
http://eilat.sci.brooklyn.cuny.edu/c...HowToDebug.htm

Цитата:

Сообщение от chajnik (Сообщение 2506925)
Как связан обычный Си с фичами С++?

Как я понимаю, это не фичи, а методы отлова ошибок, а они примерно одинаковые. Если программа не работает как ожидается - это занчит что в ее коде ошибка(и).
Кстати, попробуй не только значения 1-10, а что-то побольше, например 99 - в результатах выводится что-то непонятное.

chajnik 04.11.2015 14:29

garniv
Задачи мне ставит вуз. На лекциях нам объясняют только принцип работы массивов, методы сортировки этих массивов и тому подобное никак не связанное с грамотной структурой кода. Что такое дебаг я представляю, но как он работает нет. Насчет алертов (впервые слышу что это), я так понял это printf внутри цикла, например внутри цикла каждого факториала. Делал я так, значения получаются нормальные, проверял свой код вручную несколько раз, записывая на листочке результаты, тоже все нормально работает, а программа не хочет.

chajnik 04.11.2015 14:46

Вложений: 2
Вот. Получается, что цифры выходят большие, можно сделать вывод, что сама формула не подходит для большого количества элементов.

garniv 04.11.2015 19:44

В общем, методом проб: ошибка в том что не определяется размерность массива, т.к. его объявление происходит до присвоения значения переменной n.

А вот если сделать так, то программа считает вплоть до n=34:
PHP код:

.......
//    Определяем переменные.
    
int ins;
    
float f1f2f3;

//    Ввод n с клавиатуры.
    
printf(" Укажите размерность массива А[n], введя n с клавиатуры (n > 0): ");
    
scanf("%d",&n);
    
//    Определяем массив.
    
float A[n];
...... 

Если увеличить все
PHP код:

float 

до
PHP код:

double 

то будет считать и большие значения n.

Кстати, после n=59 значения A[i] почему-то начинают округляться.
СПОЙЛЕР »
Укажите размерность массива А[n], введя n с клавиатуры (n > 0): 140
1.0
140.0
9730.0
447580.0
15329615.0
416965528.0
9381724380.0
179593009560.0
2985733783935.0
43790762164380.0
573658984353377.9
6779606178721738.0
72880766421258608.0
717595238609315580.0
6509613950241650700.0
54680757182029898000.0
427193415484608540000.0
3115999030593615000000.0
21292660042389705000000.0
136721290798502310000000.0
827163809330938050000000.0
4726650339033936900000000.0
25566881379319941000000000.0
131169217511293600000000000.0
639449935367556050000000000.0
2967047700105462200000000000.0
13123480212004927000000000000.0
55410249784020779000000000000.0
223619936628369500000000000000.0
863635617323357910000000000000.0
3195451784096427800000000000000.0
11338699879051828000000000000000.0
38622446463020312000000000000000.0
126400733878975650000000000000000.0
397790544854422980000000000000000.0
1204737078701966900000000000000000.0
3513816479547402900000000000000000.0
9876673347917031800000000000000000.0
26770983021985635000000000000000000.0
70016417134423956000000000000000000.0
176791453264420430000000000000000000.0
431198666498586590000000000000000000.0
1016396856746668200000000000000000000.0
2316439347934266000000000000000000000.0
5106695835218727900000000000000000000.0
10894284448466612000000000000000000000.0
22499065708789757000000000000000000000.0
44998131417579515000000000000000000000.0
87183879621560277000000000000000000000.0
163692182146602900000000000000000000000.0
297919771506817620000000000000000000000.0
525740773247324590000000000000000000000.0
899825554211767560000000000000000000000.0
1494049976804444600000000000000000000000.0
2407080518184936100000000000000000000000.0
3763798628434630400000000000000000000000.0
5712908632445418600000000000000000000000.0
8419023247814298600000000000000000000000.0
12047912578768738000000000000000000000000.0
16744556465407399000000000000000000000000.0
22605151228299995000000000000000000000000.0
29646099971540965000000000000000000000000.0
37774869318576422000000000000000000000000.0
46768885822999352000000000000000000000000.0
56268815755796099000000000000000000000000.0
65791230729853892000000000000000000000000.0
74762762193015795000000000000000000000000.0
82573797049002513000000000000000000000000.0
88645399773193853000000000000000000000000.0
92499547589419727000000000000000000000000.0
93820969697840016000000000000000000000000.0
92499547589419765000000000000000000000000.0
88645399773193950000000000000000000000000.0
82573797049002513000000000000000000000000.0
74762762193015814000000000000000000000000.0
65791230729853930000000000000000000000000.0
56268815755796138000000000000000000000000.0
46768885822999381000000000000000000000000.0
37774869318576422000000000000000000000000.0
29646099971540999000000000000000000000000.0
22605151228300005000000000000000000000000.0
16744556465407416000000000000000000000000.0
12047912578768745000000000000000000000000.0
8419023247814304600000000000000000000000.0
5712908632445423400000000000000000000000.0
3763798628434634100000000000000000000000.0
2407080518184939500000000000000000000000.0
1494049976804444900000000000000000000000.0
899825554211767560000000000000000000000.0
525740773247325270000000000000000000000.0
297919771506817540000000000000000000000.0
163692182146602940000000000000000000000.0
87183879621560352000000000000000000000.0
44998131417579505000000000000000000000.0
22499065708789757000000000000000000000.0
10894284448466619000000000000000000000.0
5106695835218726800000000000000000000.0
2316439347934267800000000000000000000.0
1016396856746668800000000000000000000.0
431198666498586880000000000000000000.0
176791453264420510000000000000000000.0
70016417134423984000000000000000000.0
26770983021985649000000000000000000.0
9876673347917031800000000000000000.0
3513816479547405200000000000000000.0
1204737078701967600000000000000000.0
397790544854423410000000000000000.0
126400733878975580000000000000000.0
38622446463020321000000000000000.0
11338699879051840000000000000000.0
3195451784096426700000000000000.0
863635617323359030000000000000.0
223619936628369780000000000000.0
55410249784020823000000000000.0
13123480212004925000000000000.0
2967047700105462800000000000.0
639449935367556460000000000.0
131169217511293620000000000.0
25566881379319950000000000.0
4726650339033939000000000.0
827163809330939530000000.0
136721290798502390000000.0
21292660042389713000000.0
3115999030593616600000.0
427193415484608680000.0
54680757182029922000.0
6509613950241656800.0
717595238609316480.0
72880766421258704.0
6779606178721740.0
573658984353378.0
43790762164380.0
2985733783935.0
179593009560.0
9381724380.0
416965528.0
15329615.0
447580.0
9730.0
140.0
Для продолжения нажмите любую клавишу . . .
Но думаю с этим ты разберешься уже самостоятельно :)

chajnik 04.11.2015 21:29

garniv
Благодарю, никогда бы не посетила мысль, что не заданная переменная, определяющая размерность массива, может так отразиться на работе программы.

skibidi 14.11.2018 18:01

Надеюсь это не сарказм сейчас был. Потому что размер массива это основная его состовляющая, что оно должно было выделить, код ASCII буквы n?

Полковник Исаев 14.11.2018 19:11

skibidi
Это "сейчас" произошло 3 года назад :gigi:


Текущее время: 09:44. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot