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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BkmzCvjktd
0 / 0 / 0
Регистрация: 23.07.2012
Сообщений: 3
#1

Почему не работает программа при некоторых входных данных - C++

23.07.2012, 17:43. Просмотров 399. Ответов 8
Метки нет (Все метки)

Задание найти первый и последний неотрицательные эллементы массива.

и вывести их индексы

если значение size указать 20 то всё работает, а если к примеру 19, то выводит только массив, а индексы уже не выводит, программа просто останавливается и всё.

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
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main()
{
    int size = 10;
    int arr[size];
    int n,a,z;
    int *max, *min;
    a = 0;
    z = size - 1;
    
    min = arr;
    max = &arr[size-1];
    
    for (n = 0; n < size; n++) {
        arr[n] = rand() % 10 - 5;
        cout << arr[n] << "  ";
    }
    cout << " \n ";
    cout << " \n ";
    while (*min < 0) {
        min++;
        a++;
    }
    
    while (*max < 0) {
        min--;
        z--;
    }
    
    cout << a << " " << z << "\n";
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2012, 17:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не работает программа при некоторых входных данных (C++):

Почему при инициализации данных программа работает быстрей? - C++
Почему при инициализации данных программа работает быстрей?

Почему вылетает программа при 32768, а при 20 все работает нормально? - C++
Помогите исправить, почему программа вылетает при больших числах, а если поставить маленькие то все норм. то есть если 32768 заменить на...

Почему при умножении на 0, программа работает правильно? - C++
Операции ввода, такие, как cin, должны уметь преобразовывать последо- вательность символов в число. Напишите программу, которая позволяет...

Почему работает программа при выходе за пределы массива? - C++
Добрый день, возникла проблема. Я задал одномерный массив из 10 элементов, однако, когда в я цикле пытаюсь присвоить значения большему...

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? - C++
void mainmenu() { cout &lt;&lt; &quot;Введи число&quot; &lt;&lt; endl; cin &gt;&gt; choice; if (choice == 1) { cout &lt;&lt; &quot;Hello&quot; &lt;&lt; endl; } ...

Почему программа выдает ошибку при первом запуске, а дальше работает нормально? Код C - C++
Подскажите почему программа выдает ошибку при первом запуске, а дальше работает нормально? #include &lt;iostream&gt; #include &lt;cstdlib&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
David Sylva
1285 / 947 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
23.07.2012, 18:01 #2
Задачу можно решить вот так
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
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
 
int main()
{   
    srand((unsigned) time(0));
    const int size = 10;
    int array[size]; 
    int i; 
    int first_min, last_min; 
 
    for ( i = 0; i < size; i++) 
        array[i] = -10 + rand() % 21; 
 
    for ( i = 0; i < size; i++) 
        cout << array[i] << " "; 
    cout << endl; 
 
    for ( i = 0; i < size; i++) 
        if(array[i] < 0) 
        {
            first_min = i;  
            break; 
        }
 
    for ( i = size - 1; i > 0; i--) 
        if(array[i] < 0)  
        {
          last_min = i; 
          break;
        }
 
    cout << "First min element indeks " << first_min << endl;  
    cout << "Last min element indeks " << last_min << endl;
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.07.2012, 18:04 #3
BkmzCvjktd,
C++
1
2
 int size = 10;
    int arr[size];
А как это вообще компилируется?

Или это компилятор умный и приводит к const?
Catstail
Модератор
22547 / 10952 / 1776
Регистрация: 12.02.2012
Сообщений: 18,087
23.07.2012, 18:07 #4
David Sylva - Вы нашли первые отрицательные элементы, а надо был - неотрицательные...
David Sylva
1285 / 947 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
23.07.2012, 18:10 #5
Исправлено благодаря советам более внимательных людей
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
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
 
int main()
{   
    srand((unsigned) time(0));
    const int size = 10;
    int array[size]; 
    int i; 
    int first_min, last_min; 
 
    for ( i = 0; i < size; i++) 
        array[i] = -10 + rand() % 21; 
 
    for ( i = 0; i < size; i++) 
        cout << array[i] << " "; 
    cout << endl; 
 
    for ( i = 0; i < size; i++) 
        if(array[i] > 0) 
        {
            first_min = i;  
            break; 
        }
 
    for ( i = size - 1; i > 0; i--) 
        if(array[i] > 0)  
        {
          last_min = i; 
          break;
        }
 
    cout << "First min element indeks " << first_min << endl;  
    cout << "Last min element indeks " << last_min << endl;
}
BkmzCvjktd
0 / 0 / 0
Регистрация: 23.07.2012
Сообщений: 3
23.07.2012, 18:29  [ТС] #6
Такое решение у меня было, но сейчас пытаюсь разобраться с указателями и хотел эту же задачу решить используя их.

Но она работает как то странно.

Заметил такую закономерность, если массив чисел заканчивается положительным числом то всё работает как нужно, а если отрицательным то выдаётся только массив и работа программы останавливается.
Catstail
Модератор
22547 / 10952 / 1776
Регистрация: 12.02.2012
Сообщений: 18,087
23.07.2012, 18:30 #7
Кстати, для самого поиска достаточно одного цикла:

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
#include <iostream.h>
 
int main(int argc, char* argv[])
{
 
    int Arr[]={-7,-5,0,7,-7,-10,-8};
    int n=sizeof(Arr)/sizeof(int);
    int i,j,i_f=-1,i_l=-1;
 
    j=n-1;
    for (i=0; i<n; i++)
    {
        if (j < i) break;
        if ((i_f < 0) && (Arr[i] >= 0)) i_f=i;
        if ((i_l < 0) && (Arr[j] >= 0)) i_l=j;
        j--;
    }
 
    if ((i_l < 0) && (i_f < 0))
        cout << "all elements are negative";
    else
        if (i_l < 0) cout << "single element =" << Arr[i_f]  << endl;
        if (i_f < 0) cout << "single element =" << Arr[i_l]  << endl;
        if ((i_f >=0) && (i_l >= 0)) cout << "first el=" << Arr[i_f] << " last el=" << Arr[i_l] << endl;
 
    return 0;
}
BkmzCvjktd
0 / 0 / 0
Регистрация: 23.07.2012
Сообщений: 3
23.07.2012, 18:38  [ТС] #8
Я понимаю, но что не так именно в моей версии, почему программа не сабатывает при последнем отрицательном числе?

Если важно то использую компилятор geany в ubunu 12.04

Добавлено через 4 минуты
Всё, спасибо, разобрался сам, спасибо всем откликнувшимся, особенно Catstail, обязательно изучу ваш вариант
Endiff
31 / 31 / 1
Регистрация: 19.05.2012
Сообщений: 67
23.07.2012, 18:39 #9
Была ошибочка в цикле с *max, ты сбавлял адрес у min. И еще проверочки не было на выход за пределы.
Насчет ошибки в цикле - из-за неё вся проблема. Представь что первое неотрицательное число - первое значение. А последнее неотрицательное - не последнее число. В цикле ты сбавлял адрес минимального, а оно уже выходило за пределы массива. И хрен знает, что оно там проверяло.
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    const int size = 10;
    int arr[size];
    int n, a, z;
    int *max, *min;
    
    a = 0;
    z = size - 1;
    
    min = arr;
    max = &arr[z];
    
    srand((unsigned)time(NULL)); rand(); rand();
    
for (n = 0; n < size; n++) {
        arr[n] = rand() % 10 - 5;
        cout << arr[n] << ", ";
    }
 
    cout << endl << endl;
 
    while (*min < 0) {
        if(a >= size) break;
        min++;
        a++;
    }
    
    while (*max < 0) {
        if(z == 0) break;
        max--;
        z--;
    }
    
    cout << a + 1 << " " << z + 1 << "\n";
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2012, 18:39
Привет! Вот еще темы с ответами:

Почему в некоторых случаях используется массив для хранения стека, а в некоторых нет? - C++
Почему в некоторых случаях используется массив для хранения стека ,а в некоторых нет

Почему при вводе элементов массива, программа прекращает работу или работает не так, как ожидается? - C++
При вводе элементов массива, программа прекращает работу или не правильно работает. Например если указать размер массива 10 , то ввод...

При некоторых компиляциях программа медленно исполняется - C++
Крестики-нолики очень странно себя ведут. Иногда при компиляции все работает нормально, а иногда программа очень медленно выполняется и...

Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает - C++
почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает. Имею в ввиду что сделал прогу которая меняет...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.07.2012, 18:39
Ответ Создать тему
Опции темы

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