Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите пожалуйста устранить ошибку в программе


Автор: kirkakirya 6.7.2009, 17:30
дана матрица A[n][m] и массив B[m]. Элементы первого столбца матрицы A[n][m] упорядочены по убыванию. Включить массив В в качестве новой строки в матрицу, с сохранением упорядоченности последней по элементам первого столбца.
_______________________________________________________________________

Сортировка по убыванию у меня точно правильная. Дело в том, что одна строка "съедается" по ходу выполнения, не пойму почему так происходит.
Если непонятно, то переменная (men) выявляет индекс той строки вместо которой нужно вписать ту строчку. Остальные потом должны по идее сдвигаться, но как я говорю, все строки сдвигаются кроме одной, она затирается.

Код

#include <stdio.h>
#include <conio.h>

void main(void)
{
 int i,j,y,n,m,A[50][50],b,B[50],men=0;
 clrscr();
 printf("Vvedite visotu matricy\n");
 scanf("%d",&n);

 printf ("Vvedite shirinu matricy\n");
 scanf ("%d",&m);
 printf("Zapolnite matricu A\n");

 for (i=0;i<n;i++)
    {
 for (j=0;j<m;j++)
    scanf("%d",&A[i][j]);
    }

    printf ("Zapolnite vector B\n");
    for (i=0;i<m;i++)
     scanf ("%d",&B[i]);


 //Uporyadochivanie
 for (i=0;i<n-1;i++)
    {
        if (A[i+1][0]>A[i][0])
         {
             y=i+1;
             while ((A[y][0]>A[y-1][0])&&(y!=0))
    {
     b=A[y][0];
     A[y][0]=A[y-1][0];
     A[y-1][0]=b;
     --y;   //Konec uporyadochivaniya
    }
         }
    }

    printf("\nMatrica, uporyadochennaya iznachal'no");
    for (i=0;i<n;i++)
        {
        printf("\n");
    for (j=0;j<m;j++)
        printf("%d ",A[i][j]);
        }

        //Serdce

        for (j=0;j<m;j++)
        A[n][j]=0;


        if (B[0]<A[n-1][0])
    {
        for (j=0;j<m;j++)
        A[n][j]=B[j];
    }
        else
{

        i=-1;

        do
        {
        i++;
        men=i;
        }
        while (A[i][0]>B[0]);

        for (i=n;i<men;i--)
    {
        for (j=0;j<m;j++)
        A[i][j]=A[i-1][j];
    }

        for (j=0;j<m;j++)
        A[men][j]=B[j];


}


            printf("\n\nRezul'tat:");
    for (i=0;i<=n;i++)
        {
        printf("\n");
    for (j=0;j<m;j++)
        printf("%d ",A[i][j]);
        }

    getch();
}

Автор: Hacknslash 7.7.2009, 14:47
Тааак... Это легче с нуля переписать, чем разбираться...
Старайся писать названия переменных так, чтобы по ним сразу было понятно, за что переменная отвечает. Это раз.
Когда упорядочиваешь матрицу по первому столбцу, логично было бы переставлять не только элементы столбца, а строки целиком. Чисто с точки зрения математики матрицы, у которых поменяли местами два элемента - совершенно разные матрицы. А матрицы, у которых поменяли местами две строки, во многих задачах (например решение СЛУ) можно считать одинаковыми.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)