Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Важная информация

Ответ Создать новую тему
 
Опции темы Опции просмотра
Старый 04.11.2015, 04:28   [включить плавающее окно]   #1
chajnik
Мужской Продвинутый
Автор темы
 
Регистрация: 02.03.2011
Вылетает консольная программа на Си

Учусь программированию на Си. Пишу в среде 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 элементов считает и выводит. Не могу никак понять в чем ошибка.

Последний раз редактировалось chajnik; 04.11.2015 в 12:07.
chajnik вне форума  
Конфигурация ПК
Ответить с цитированием
Старый 04.11.2015, 08:22   [включить плавающее окно]   #2
garniv
Мужской Модератор
 
Аватар для garniv
 
Регистрация: 29.06.2004
chajnik
http://habrahabr.ru/post/131412/
http://galiego710.blogspot.ru/2011/1...lt-sigfpe.html
Миниатюры
Нажмите на изображение для увеличения
Название: SIGSEGV.PNG
Просмотров: 107
Размер:	72.8 Кб
ID:	47361  

Последний раз редактировалось garniv; 04.11.2015 в 13:23.
garniv вне форума  
Конфигурация ПК
Ответить с цитированием
Старый 04.11.2015, 11:58   [включить плавающее окно]   #3
chajnik
Мужской Продвинутый
Автор темы
 
Регистрация: 02.03.2011
garniv
Боюсь это не для моего уровня знаний. Как связан обычный Си с фичами С++?
chajnik вне форума  
Конфигурация ПК
Ответить с цитированием
Старый 04.11.2015, 13:34   [включить плавающее окно]   #4
garniv
Мужской Модератор
 
Аватар для garniv
 
Регистрация: 29.06.2004
Цитата (chajnik) »
Боюсь это не для моего уровня знаний
Дорогу осилит идущий Начианй с более простых задач. Наставь "алертов" чтобы видеть промежуточные результаты и значения всех переменных после каждого действия. Или используй возможности дебага 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) »
Как связан обычный Си с фичами С++?
Как я понимаю, это не фичи, а методы отлова ошибок, а они примерно одинаковые. Если программа не работает как ожидается - это занчит что в ее коде ошибка(и).
Кстати, попробуй не только значения 1-10, а что-то побольше, например 99 - в результатах выводится что-то непонятное.

Последний раз редактировалось garniv; 04.11.2015 в 14:49.
garniv вне форума  
Конфигурация ПК
Ответить с цитированием
Старый 04.11.2015, 14:29   [включить плавающее окно]   #5
chajnik
Мужской Продвинутый
Автор темы
 
Регистрация: 02.03.2011
garniv
Задачи мне ставит вуз. На лекциях нам объясняют только принцип работы массивов, методы сортировки этих массивов и тому подобное никак не связанное с грамотной структурой кода. Что такое дебаг я представляю, но как он работает нет. Насчет алертов (впервые слышу что это), я так понял это printf внутри цикла, например внутри цикла каждого факториала. Делал я так, значения получаются нормальные, проверял свой код вручную несколько раз, записывая на листочке результаты, тоже все нормально работает, а программа не хочет.
chajnik вне форума  
Конфигурация ПК
Ответить с цитированием
Старый 04.11.2015, 14:46   [включить плавающее окно]   #6
chajnik
Мужской Продвинутый
Автор темы
 
Регистрация: 02.03.2011
Вот. Получается, что цифры выходят большие, можно сделать вывод, что сама формула не подходит для большого количества элементов.
Миниатюры
Нажмите на изображение для увеличения
Название: 5.png
Просмотров: 169
Размер:	14.6 Кб
ID:	47363   Нажмите на изображение для увеличения
Название: 20.png
Просмотров: 114
Размер:	32.8 Кб
ID:	47364  
chajnik вне форума  
Конфигурация ПК
Ответить с цитированием
Старый 04.11.2015, 19:44   [включить плавающее окно]   #7
garniv
Мужской Модератор
 
Аватар для garniv
 
Регистрация: 29.06.2004
В общем, методом проб: ошибка в том что не определяется размерность массива, т.к. его объявление происходит до присвоения значения переменной 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
Для продолжения нажмите любую клавишу . . .
Но думаю с этим ты разберешься уже самостоятельно

Последний раз редактировалось garniv; 04.11.2015 в 20:11.
garniv вне форума  
Конфигурация ПК
Ответить с цитированием
Старый 04.11.2015, 21:29   [включить плавающее окно]   #8
chajnik
Мужской Продвинутый
Автор темы
 
Регистрация: 02.03.2011
garniv
Благодарю, никогда бы не посетила мысль, что не заданная переменная, определяющая размерность массива, может так отразиться на работе программы.
chajnik вне форума  
Конфигурация ПК
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey