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

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

Войти
Регистрация
Восстановить пароль
 
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
#1

Отследить ошибку - C++

01.12.2013, 21:47. Просмотров 315. Ответов 12
Метки нет (Все метки)

Помогите найти ошибку в программе.
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 <cstdlib>
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{   
    int n = 0, k = 0, i, r, j = 0, q1, q2, *a; a = new int [n]; double p;
    
    for(k = 10; k<100; k++){
        q1 = k%10;
        r = k/10;
        q2 = r%10;
        if((((q1*q1)+(q2*q2))%13) == 0){
            n++;
            a[j] = k;
            j++;
            }
        }
        
    for(i = 0; i < n; i++){
        cout<<a[i]<<"  ";
        }
    
    system("pause");
    return EXIT_SUCCESS;
}
Требуется найти все двузначные числа, сумма квадратов цифр которых делится на 13. Программа всё считает, но вылетает ошибка.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.12.2013, 21:53     Отследить ошибку #2
C++
1
int n = 0 ... a = new int [n];...
Массив нулевого размера?
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
01.12.2013, 21:56  [ТС]     Отследить ошибку #3
Ясно, спасибо. А вы не подскажете как удалять элементы из массива? По индексам, либо максимальный(минимальный) элемент, если он уже найден.

Добавлено через 1 минуту
И еще, как тогда быть с массивом? Ведь размерность надо в любом случае указывать, но мне не нужно чтобы были лишние, пустые элементы.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.12.2013, 22:08     Отследить ошибку #4
Цитата Сообщение от Relike Посмотреть сообщение
И еще, как тогда быть с массивом? Ведь размерность надо в любом случае указывать, но мне не нужно чтобы были лишние, пустые элементы.
Или вектор, или перевыделять память под новый размер и копировать старый массив в новый, с освобождением памяти под старым.

Добавлено через 2 минуты
Цитата Сообщение от Relike Посмотреть сообщение
А вы не подскажете как удалять элементы из массива? По индексам, либо максимальный(минимальный) элемент, если он уже найден.
Если без пустых элементов, то копировать нужное в новый массив, память под старым освобождать.
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
01.12.2013, 22:08  [ТС]     Отследить ошибку #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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{   
    int v = 0, n = 89, k = 0, i, r, j = 0, q1, q2, *a; a = new int [n];
    
    for(k = 10; k<100; k++){
        q1 = k%10;
        r = k/10;
        q2 = r%10;
        if((((q1*q1)+(q2*q2))%13) == 0){
            n++;
            a[j] = k;
            j++;
            v++;
            }
        }
    n = v;
    for(i = 0; i < n; i++){
        cout<<a[i]<<"  ";
        }
    
    
    system("pause");
    return EXIT_SUCCESS;
}
Решил проблему. Вот моё решение. Потянет?
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.12.2013, 22:10     Отследить ошибку #6
А как же это?
Цитата Сообщение от Relike Посмотреть сообщение
но мне не нужно чтобы были лишние, пустые элементы.
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
01.12.2013, 22:13  [ТС]     Отследить ошибку #7
Я имел ввиду в отображении. Видите ли, делаю не себе УВП. Мы на втором курсе, только начали изучение. Думаю никто и слова не скажет. Программа выполняется правильно. Всё равно спасибо вам, огромное.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.12.2013, 22:15     Отследить ошибку #8
Цитата Сообщение от Relike Посмотреть сообщение
Я имел ввиду в отображении.
С этим проще. n++ и v++ там тогда не нужны, просто значение j использовать для вывода.
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
01.12.2013, 22:23  [ТС]     Отследить ошибку #9
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    float *a, min, max; int n, i;
    a = new float [n];
    cout<<"Vvedite razmernost' massiva : "; cin>>n; cout<<"\n";
    cout<<"Vvodim elementy massiva : \n";
    for (i = 0; i<n; i++){
        cout<<"a["<<i+1<<"] = "; cin>>a[i]; cout<<"\n";
        }
    
    min = a[0];
    for (i = 1; i<n; i++) {
        if (a[i]<min) min = a[i];
        }
    max = a[0];
    for (i = 1; i<n; i++) {
        if (a[i]>max) max = a[i];
        }
    
    cout<<"Soderjanie massiva : ";
    for(i = 0; i<n; i++){
        cout<<a[i]<<"  ";
        }
    cout<<"\nMinimal'nyi element massiva : "<<min<<"\tMaximal'nyi element massiva : "<<max<<"\n";
    
    
    for(i = 0; i < n; i++) {
        if(a[i] == min || a[i] == max ){
            for(int j = i; j<n-1; j++){
                a[j] = a[j+1];
                n--; i--;
                }
            }
        }
        
        
    cout<<"Itogovoe soderjanie massiva : ";
    for(i = 0; i<n; i++){
        cout<<a[i]<<"  ";
        }
    cout<<"\n";
    system("PAUSE");
    return EXIT_SUCCESS;
}
Вот, на счет удаления. Нужно удалить все вхождения максимального и минимально элементов. А получается вот такая штукуёвина.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.12.2013, 22:27     Отследить ошибку #10
Массив нужно создавать после того, как размерность введена, а не до.
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
01.12.2013, 22:30  [ТС]     Отследить ошибку #11
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    float *a, min, max; int n, i;
    cout<<"Vvedite razmernost' massiva : "; cin>>n; cout<<"\n";
    a = new float [n];
    cout<<"Vvodim elementy massiva : \n";
    for (i = 0; i<n; i++){
        cout<<"a["<<i+1<<"] = "; cin>>a[i]; cout<<"\n";
        }
    
    min = a[0];
    for (i = 1; i<n; i++) {
        if (a[i]<min) min = a[i];
        }
    max = a[0];
    for (i = 1; i<n; i++) {
        if (a[i]>max) max = a[i];
        }
    
    cout<<"Soderjanie massiva : ";
    for(i = 0; i<n; i++){
        cout<<a[i]<<"  ";
        }
    cout<<"\nMinimal'nyi element massiva : "<<min<<"\tMaximal'nyi element massiva : "<<max<<"\n";
    
    
    for(i = 0; i < n; i++) {
        if(a[i] == min || a[i] == max ){
            for(int j = i; j<n-1; j++){
                a[j] = a[j+1];
                n--; i--;
                }
            }
        }
        
        
    cout<<"Itogovoe soderjanie massiva : ";
    for(i = 0; i<n; i++){
        cout<<a[i]<<"  ";
        }
    cout<<"\n";
    system("PAUSE");
    return EXIT_SUCCESS;
}
Ничем результат не изменился....((( Он стирает нужные элементы, и оставляет ненужные..
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.12.2013, 22:35     Отследить ошибку #12
Цитата Сообщение от Relike Посмотреть сообщение
Ничем результат не изменился....
Я и не писал, что он изменится, но создавать массив нужно правильно.

C++
1
2
3
4
5
6
7
8
9
for(i = 0; i < n; i++) {
        if(a[i] == min || a[i] == max ){
            for(int j = i; j<n-1; j++){
                a[j] = a[j+1];
                
                }
                n--; i--;
            }
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2013, 07:45     Отследить ошибку
Еще ссылки по теме:

C++ Отследить изменение реестра
Как отследить утечку памяти? C++
C++ Отследить изменение области экрана
C++ Крестики-нолики (не могу отследить ошибку)
C++ Как отследить простой системы?

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

Или воспользуйтесь поиском по форуму:
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
02.12.2013, 07:45  [ТС]     Отследить ошибку #13
Всё отлично. Спасибо вам огромное за помощь!

Добавлено через 9 часов 7 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Я и не писал, что он изменится, но создавать массив нужно правильно.
Учту на будущее! Спасибо.
Yandex
Объявления
02.12.2013, 07:45     Отследить ошибку
Ответ Создать тему
Опции темы

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