Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 09.05.2017
Сообщений: 2
1

Программа работает по-разному на разных компах

09.05.2017, 15:34. Показов 998. Ответов 2

Дали задание на написание небольшой программы в С++, работа с массивами. На домашнем компе работает правильно, всё выполняется.

Переношу на ноут и при выполнении вылетает ошибка сегментирования (После выполнения цикла внутри zapmas). Из-за чего это может быть?
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <cmath>
 
using namespace std;
 
 
 
void Vvod(int *k, int *X, int *Y){ //Подпрограмма ввода границ и размера массива
        cout << "Введите размер массива: ";
        cin >> *k;
 
        cout << "Введите нижнюю границу Х: ";
        cin >> *X;
 
        cout << "Введите верхнюю границу Y: ";
        cin >> *Y;
 
}
 
void zapmas(int k, int B[]){ //Подпрограмма заполнения массива
        for(int i=0; i<k; i++){
                cout << "Введите B[" << i << "]: ";
                cin >> B[i];
        }
}
 
void prmas(int X, int Y, int *j, int k, int B[]){ //Подпрограмма создания массива из чисел в интервале между Х и У
        *j=0;
        for(int i=1; i<k; i++){
        if( not ((B[i] < X and B[i] > Y) or (B[i] < Y and B[i] > X)) ){
                B[i]=B[i-1];
                *j+=1;
                                                                                                                                    
        }                                                                                                                           
}                                                                                                                                   
}                                                                                                                                   
                                                                                                                                    
void findch(int B[], int k, int *indexch){ //Подпрограмма нахождения первого четного элемента в массиве                             
        int i=0;                                                                                                                    
        while(i<k){                                                                                                                 
                if((B[i]%2)==0){                                                                                                    
                        *indexch=i;                                                                                                 
                        i=k;                                                                                                        
                }                                                                                                                   
                i++;                                                                                                                                                                                                                                                         
        }                                                                                                                                                                                                                                                                    
}                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                             
void findmin(int indexch, int k, int B[], int *indexmin){ //Подпрограмма нахождения минимального элемента в массиве                                                                                                                                                          
        for(int i=indexch+1; i<=k; i++){                                                                                                                                                                                                                                     
           if(B[*indexmin] >= B[i]){                                                                                                                                                                                                                                         
                   *indexmin=i;                                                                                                                                                                                                                                              
           }                                                                                                                                                                                                                                                                 
        }                                                                                                                                                                                                                                                                    
}                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                             
void srarif(int indexch, int indexmin, int B[], float *sr, int *Err){ //Подпрограмма вычисляющая среднее арифметическое                                                                                                                                                      
        for(int i=indexch+1; i<indexmin; i++){                                                                                                                                                                                                                               
                *sr+=B[i];                                                                                                                                                                                                                                                   
        }                                                                                                                                                                                                                                                                      
 
        if(indexmin-1!=indexch){
                *sr /= (indexmin-indexch-1);
        }
 
        else{
                *Err = 2;
        }
}
 
int main(){
        int Err=0;
        int X;
        int Y;
        int k;
        int j;
 
        Vvod(&k, &X, &Y);
 
        int B[k];
 
        B[0]=X;
 
        zapmas(k, B);
 
        float sr=0;
        int indexmin;
        int indexch;
 
        findch(B, k, &indexch);
 
        findmin(indexch, k, B, &indexmin);
 
        srarif(indexch, indexmin, B, &sr, &Err);
 
        //Проверка ошибки
 
        if(Err==0){
        cout << "\nПервое четное число: " << B[indexch] << "\nМинимальное число после первого четного: " << B[indexmin] << "\nСреднее значениe: " << sr;  
        }
        if(Err==2){
                cout << "\nПервое четное число: " << B[indexch] << "\nМинимальное число после первого четного: " << B[indexmin] << "\nСреднее значениe не удалось вычислить, так как между четным и минимальным числами нет чисел"; 
        }
 
        prmas(X, Y, &j, k, B);
        findmin(0, j, B, &indexmin);
 
        cout << "\nМинимальное число: " << B[indexmin];
         
        return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2017, 15:34
Ответы с готовыми решениями:

Запрос по-разному рабоает на разных компах.
Всем привет! Вот такая проблема. Есть сайт, все работает ок, но - один из компов имеющий Win98 и...

Одна презентация на разных компах октрывается по разному
Презентация лежит на сетевом диске. если я её открываю, то графики нормальные А если её открыть...

По-разному работает на разных телефонах
Делаю программу на Android Studio. И вот такая проблема, что на моём телефоне часть программы не...

Приложение по разному работает на разных пк
Всем доброго времени суток, нужна ваша помощь. Написал программу в которой одна из функций по...

2
78 / 40 / 24
Регистрация: 03.02.2017
Сообщений: 104
09.05.2017, 16:47 2
То, что мне удалось нарыть.
Первые две ошибки - у меня программа с ними не компилировалась.
Во-первых, строка 30, операторы not, or, and, в функции prmas() заменил на стандартные:
C++
1
if (! ((B[i] < X && B[i] > Y) || (B[i] < Y && B[i] > X))) {
Во вторых, строка 80, создание массива B[k].
Раз k не константа, то массив должен быть динамическим, поэтому:
C++
1
int *B = new int[k];
В третьих, строка 82. Какой смысл присваивать нулевому элементу массива значение (B[0]=X; ), если затем в функции zapmas(), это значение будет введено с клавиатуры?

В четвёртых, переменная indexmin не инициализирована! В строке 87 её объявление, в строке 92 передача в функцию findmin(), где она используется без инициализации.

В пятых, там же в findmin(), строка 50, выход за границу массива!
C++
1
i<=k;
2
0 / 0 / 0
Регистрация: 09.05.2017
Сообщений: 2
09.05.2017, 17:09  [ТС] 3
Воу, спасибо
Вот только теперь работает неправильно... Ладно, дальше сам попробую, спасибо за помощь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2017, 17:09

Ssd работает по разному на разных материнках?
всем хаюшки преобрел ssd SanDisk Ultra II на 120 до этого стоял Kingston v300 на 120 по тестам...

Компьютер работает по разному в разных квартирах
Я знаю, что тема странная, но попробую описать свою проблему. Мой пк: Процессор: i7-8700 Кулер:...

почему в разных ОС по разному работает IntelliJ
Привет всем! собственно сабж, далее вкладываю два скриншота: 1) ОС Линукс Дебиан 8 2) ОС Винда...

На разных машинах код работает по разному
Здравствуйте. Есть вот такой фрагмент кода, который должен из строки делать число: double...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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