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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2009, 22:06   #1
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию [C++] Поменять местами наименьший и второй по величине элементы

Здравствуйте господа программисты. Помогите исправит ошибку в программе. Задание собственно следующее:Поменять местами наименьший и второй по величине элементы в каждой строке матрицы.Писал прогу с паскаля, где то закралась ошибка.. Ни как не могу ее найти.. Программа меняет местами наименьший и наибольший элементы. Вот собственно код:
Код:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

void ReadMatrix(int Line, int Column, int** Matrix, FILE *FileIn)
{
        for (int i=0; i<Line; i++)
          for (int j=0; j<Column; j++)
            fscanf(FileIn,"%3d",&Matrix[i][j]);
}

void PrintMatrix(int Line, int Column, int** Matrix)
{
        for (int i=0; i<Line; i++)
        {
          for (int j=0; j<Column; j++)
            printf("%3d",Matrix[i][j]);
          printf("\n");
        }
}

void FindMinElement(int** Matrix, int Column, int NumStr, int &JMin)
{
        int Min;
        Min=Matrix[NumStr][0];
        JMin=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]<Min)
          {
            Min=Matrix[NumStr][j];
            JMin=j;
          }
}

void FindFirstMaxElement(int** Matrix, int Column, int NumStr, int &JMax1)
{
        int Max;
        Max=Matrix[NumStr][0];
        JMax1=0;
        for (int j=0; j<Column; j++)
          if (Matrix[NumStr][j]>Max)
          {
            Max=Matrix[NumStr][j];
            JMax1=j;
          }
}

void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;
        Max=-32000;
        JMax2=0;
        for (int j=0; j<Column; j++)
          if ((Matrix[NumStr][j]>Max) || (j!=JMax1))
          {
            Max=Matrix[NumStr][j];
            JMax2=j;
          }
}

void Bubble(int** Matrix, int NumStr, int JMin, int JMax2)
{
        int Buf;
        Buf=Matrix[NumStr][JMin];
        Matrix[NumStr][JMin]=Matrix[NumStr][JMax2];
        Matrix[NumStr][JMax2]=Buf;
}

void ChargeByPlacesMinAndSecondMaxElements(int** Matrix, int Line, int Column)
{
        int JMin,JMax1,JMax2;
        for (int i=0; i<Line; i++)
        {
          FindMinElement(Matrix,Column,i,JMin);
          FindFirstMaxElement(Matrix,Column,i,JMax1);
          FindSecondMaxElement(Matrix,Column,i,JMax1,JMax2);
          Bubble(Matrix,i,JMin,JMax2);
        }
}

void WriteMatrixToFile(int** Matrix, int Line, int Column, FILE *FileOut)
{
        for (int i=0; i<Line; i++)
        {
          for (int j=0; j<Column; j++)
            fprintf(FileOut,"%3d",Matrix[i][j]);
            fprintf(FileOut,"\n");
        }
}

void main()
{
        int** Matrix;
        int Line,Column,i;
        FILE *FileIn,*FileOut;
        char NameFileIn[30],NameFileOut[30];
        printf("Введите имя входного файла ");
        scanf("%s",NameFileIn);
        printf("Введите имя выходного файла ");
        scanf("%s",NameFileOut);
        FileIn=fopen(NameFileIn,"r");
        fscanf(FileIn,"%d",&Line);
        fscanf(FileIn,"%d",&Column);
        Matrix=(int**)malloc(Line*sizeof(int*));
        for (i=0; i<Column; i++)
          Matrix[i]=(int*)malloc(Column*sizeof(int*));
        printf("\nИсходная матрица имеет следующий вид:\n");
        ReadMatrix(Line,Column,Matrix,FileIn);
        fclose(FileIn);
        PrintMatrix(Line,Column,Matrix);
        ChargeByPlacesMinAndSecondMaxElements(Matrix,Line,Column);
        printf("\nМатрица после преобразований:\n");
        PrintMatrix(Line,Column,Matrix);
        FileOut=fopen(NameFileOut,"w");
        WriteMatrixToFile(Matrix,Line,Column,FileOut);
        for (i=0; i<Line; i++)
          free(Matrix[i]);
        free(Matrix);
        fclose(FileOut);
        getch();
}
И еще вопрос. В паскале в функции FindSecondMaxElementsдля нахождения Max использовалось выражение
Код:
Max:=-maxint-1
А в Си есть что-то похожее?
Ошибка в поиске второго максимального элемента... Почему то, он вообще не ищется, и за второй по величине принимается максимальный элемент... Помогите пожалуйста...

Последний раз редактировалось StudeHt; 10.06.2009 в 23:02.
StudeHt вне форума Ответить с цитированием
Старый 10.06.2009, 23:29   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;
        Max=-32000;
        JMax2=0;
        for (int j=0; j<Column; j++)
          if ((Matrix[NumStr][j]>Max) || (j!=JMax1))
          {
            Max=Matrix[NumStr][j];
            JMax2=j;
          }
}
Насколько я понимаю здесь должно быть условие, если элемент матрицы больше заданного И его номер не равен, те д.б
Код:
void FindSecondMaxElement(int** Matrix, int Column, int NumStr, int JMax1, int &JMax2)
{
        int Max;
        Max=-32000;
        JMax2=0;
        for (int j=0; j<Column; j++)
          if ((Matrix[NumStr][j]>Max) && (j!=JMax1))
          {
            Max=Matrix[NumStr][j];
            JMax2=j;
          }
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 10.06.2009, 23:33   #3
StudeHt
Пользователь
 
Регистрация: 05.04.2009
Сообщений: 78
По умолчанию

К сожалению нет. Результат остается тем же...
StudeHt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамика. Поменять местами наименьший и второй по величине элементы StudeHt Паскаль, Turbo Pascal, PascalABC.NET 3 27.05.2009 02:20
найти наибольший и наименьший элемент матрицы B(N x M) и поменять их местами поЛотЕнчик_просТо Общие вопросы C/C++ 2 13.05.2009 12:17
В массиве Р(10) введенном с клавиатуры поменять местами наибольший и наименьший элементы. Делфи. Lerika Помощь студентам 6 23.01.2009 11:52
Задача по матрицам. Поменять местами наименьший и второй по величине элементы Иван 883 Паскаль, Turbo Pascal, PascalABC.NET 5 03.01.2009 16:04
Ввести двумерный массив и поменять в нём местами элементы Ku6ep Помощь студентам 3 23.12.2008 18:25