Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2017, 17:10   #1
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию Найдите ошибку в программе

В файле содержится двумерный массив размерностью n × n. В новый файл вывести отсортированный массив.
Отсортировать диагонали, параллельные побочной по возрастанию с помощью сортировки вставками.
Код:
#include "stdafx.h"
#include <fstream>
#include <iomanip>
#include <iostream>
 
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
void sort(int *a, int n)
{
    int temp;
    int i, j;
    for (i = 1; i<n; i++)
    j = i;
        while (j>0 && a[j]<a[j - 1])
        {
            temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
            j--;
        }
    
}
 
int main()
{
    int n, i, j;
    in >> n;
    int **a = new int*[n];
    for (i = 0; i < n; i++)
    {
        a[i] = new int [n];
        for (int i = 0; i<n; i++)
            for (int j = 0; j<n; j++)
                in >> a[i][j];
    }
    int *diag1;
    diag1 = new int[n + 1];
    for (i = n - 2; i >= 0; i--)
    {
        for (j = 0; j<n - i; j++) diag1[j] = a[j][i + j];
 
        sort(diag1, n - i);
        for (j = 0; j<n - i; j++) a[j][i + j] = diag1[j];
    }
    int *diag2;
    diag2 = new int[n + 1];
    for (i = 1; i<n - 1; i++)
    {
        for (j = i; j <= n - 1; j++) diag2[j] = a[j][j - i];
        sort(diag2, n - i);
        for (j = i; j <= n - 1; j++) a[j][j - i] = diag2[j];
    }
    delete diag1;
    delete diag2;
    out << n;
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<n; j++)
            out << setw(5) << a[i][j];
        out << '\n';
        delete a;
    }
    in.close();
    out.close();
    return 0;
}
Изображения
Тип файла: jpg BPF2cgevwSA.jpg (107.5 Кб, 123 просмотров)
Тип файла: jpg mCrJNK7SKEE.jpg (88.3 Кб, 132 просмотров)
Вложения
Тип файла: txt input.txt (56 байт, 114 просмотров)
ggjgj вне форума Ответить с цитированием
Старый 11.04.2017, 17:22   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Вы обращаетесь к удаленной (delete) памяти.
Там внизу есть "call stack" - откройте панельку и увидите на какой строке вашего кода это происходит.
waleri вне форума Ответить с цитированием
Старый 11.04.2017, 18:04   #3
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию

Как это исправить?если убрать все удаления delete, ничего не меняется, и выдает те же ошибки

Код:
{
        a[i] = new int [n];
        for (int i = 0; i<n; i++)
            for (int j = 0; j<n; j++)
                in >> a[i][j];//показывает,что ошибка в этой строке
    }
ggjgj вне форума Ответить с цитированием
Старый 12.04.2017, 15:45   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Начнем с этого:

Код:
int n, i, j;
    in >> n;
    int **a = new int*[n];
    for (i = 0; i < n; i++)
    {
        a[i] = new int [n];
        for (int i = 0; i<n; i++)
            for (int j = 0; j<n; j++)
                in >> a[i][j];
    }
Здесь все i, j это разные переменные, причем внутренняя i перекрывает внешнюю, вообщем это легкий способ создать себе проблемы. Вам алфавита мало назвать их по разному?

Дальше, у вас тройной вложенный цикл, вы создаете 1 строку (внешний цикл), и потом в одну строку вчитываете весь файл (двойной вложеный цикл) и так повторяете вчитывание файла для каждой строки. Здесь двойной косяк
1. У вас не выделено столько памяти, что бы уместить весь файл.
2. После первого чтения файла, он "закончится" (т.к. последовательный), и если, вы хотите реально повторное чтение - его нада бы еще и "перемотать" в начало.

Исправляется разделением циклов:

Код:
for (i = 0; i < n; i++)
        a[i] = new int [n];

 for (int i = 0; i<n; i++)
     for (int j = 0; j<n; j++)
                in >> a[i][j];
....все остальное не вникал.
...ах да, т.к. вы делаете
a[i] = new int [n];

(т.е. выделяете МАССИВ), то и удалять нада массив (т.к. у вас двумерный, сначала каждую строку, как массив, потом массив строк)
Код:
 for (i = 0; i < n; i++)
    delete [] a[i]
delete [] a;

При не верном использовании (без [])ошибки не будет, но память утечет, в итоге, со временем, у вас тупо кончится оператива.

Дальше,

ifstream in("input.txt");
ofstream out("output.txt");

нужно перенести внутрь мейн. Потому что в вашем варианте - это глобальные переменные, они существуют до старта мейн, а закрываете вы их внутри мейн. Вобщем в большой программе это будет логический косяк, который будете искать год.

дальше,

Код:
for (i = 0; i<n; i++)
    {
        for (j = 0; j<n; j++)
            out << setw(5) << a[i][j];
        out << '\n';
        delete a;
    }
вот здесь вы прибили (точнее, сделали не доступным их корень, а данные, кроме корня, остались и жрут память до перезагрузки в самом плохом случае) все исходные a, сразу после обработки 1 строки. Как верно сделать см. выше (можно delete [] a[i])

Последний раз редактировалось alexzk; 12.04.2017 в 17:27.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найдите ошибку в программе ggjgj Помощь студентам 1 06.04.2017 15:56
Найдите ошибку в программе АнтонКурышов Паскаль, Turbo Pascal, PascalABC.NET 1 08.03.2016 16:44
Найдите ошибку в программе Proger16 Помощь студентам 11 31.03.2013 16:34
НАЙДИТЕ ОШИБКУ В ПРОГРАММЕ svetah Помощь студентам 8 03.12.2008 15:19