Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Не сортируются элементы массива структур

Автор: dima154 24.10.2009 2:52

Здравствуйте! Есть программа на FreePaskal.
Возникла следующая проблема: при сортировке двумерного массива структур по ключу sum элементы массива не сортируются. Но если сортировать не элементами массива, а только полями структуры, например sum, то тогда сортировка проходит нормально. Но сортируются только значения поля sum структуры , а не структуры целиком.
Что самое интересное, в случае сортировки элементами массива, поcле сортировки переменные str и stolb становятся равными 0, хотя они должны иметь значение 5.
Заранее большое спасибо всем ответившим за помощь и оказанное внимание!

type Value = record
a,b,i,j,sum:integer;
end;

const A = 5;
const B = 5;

var
temp: Value;
v : array[1..A,1..B] of Value;
temp: Value;
i,j,k,m,n,c,z,x,temp_1:Integer;
str, stolb : Integer;

{Сортируем двумерный массив. Сортируем элементы массива структур.}
writeln();
writeln();
writeln(str);
for c:=1 to str*stolb do
begin
{Упорядочиваем в строках}
for i:=1 to str do
begin
for j:=1 to stolb do
begin
if v[i][j].sum > v[i][j+1].sum then
begin
temp:=v[i][j];
v[i][j] := v[i][j+1];
v[i][j+1] := temp;
end;
end;
end;
{Упорядочиваем в столбцах}
for x:=1 to stolb do
begin
for z:=0 to str do
begin
if v[z][x].sum > v[z][x+1].sum then
begin
temp := v[z][x];
v[z][x] := v[z][x+1];
v[z][x+1] := temp;
end;
end;
end;
writeln(str);
end;

{Сортируем двумерный массив. Сортируем поля структуры массива структур.}
const A = 5;
const B = 5;

var
temp: Value;
i,j,k,m,n,c,z,x,temp_1:Integer;
str, stolb : Integer;
x0:Char;
{Создаем массив записей типа Value}
v : array[1..A,1..B] of Value;
{Сортируем двумерный массив}
writeln();
writeln();
writeln(str);
for c:=1 to str*stolb do
begin
{Упорядочиваем в строках}
for i:=1 to str do
begin
for j:=1 to stolb do
begin
if v[i][j].sum > v[i][j+1].sum then
begin
temp_1:=v[i][j].sum;
v[i][j].sum := v[i][j+1].sum;
v[i][j+1].sum := temp_1;
end;
end;
end;
{Упорядочиваем в столбцах}
for x:=1 to stolb do
begin
for z:=0 to str do
begin
if v[z][x].sum > v[z][x+1].sum then
begin
temp_1 := v[z][x].sum;
v[z][x].sum := v[z][x+1].sum;
v[z][x+1].sum :=temp_1;
end;
end;
end;
end;



Прикрепленные файлы
Прикрепленный файл  Lab7_element.pas ( 2.64 килобайт ) Кол-во скачиваний: 281
Прикрепленный файл  Lab7.pas ( 2.72 килобайт ) Кол-во скачиваний: 272

Автор: volvo 24.10.2009 3:48

Ну, давай начнем с того, что твоя программа (в обоих случаях, кстати) вообще аварийно вылетает:

               for j:=1 to stolb do
begin
if v[i][j].sum > v[i][j+1].sum then // <--- Вот тут ...
, ибо stolb = 5, и попытка обратиться к элементу v[i][6] - недопустима. Включи в настройках Range Check и запусти программу еще раз...

Автор: Lapp 24.10.2009 3:56

А еще - по поводу сортировки посмотри FAQ (красная ссылка повыше). Алгоритм, который ты пытался воплотить - неверен.

Автор: dima154 24.10.2009 14:32

Спасибо за совет.
Поставим вопрос по другому.
Есть прога на С++. Она работает правильно и выдает нужный мне результат. Нужно реализовать эту прогу на Paskal. В частности, у меня не работает вот эта часть написанная на Paskal.

temp := v[z][x];
v[z][x] := v[z][x+1];
v[z][x+1] := temp;


т.е. элементы массива не обмениваются.

Вот прога на C++.

// Lab7.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

struct Value{
int a;
int b;
int i;
int j;
int sum;
};
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0,"");//чтоб консоль писала по русски
const int N = 5;
const int M = 5;
char mas[N][M]={
{'A', 'B', 'C', 'D', 'V'},
{'F', 'Q', 'C', 'C', 'V'},
{'F', 'B', 'C', 'D', 'H'},
{'S', 'S', 'D', 'V', 'H'},
{'S', 'X', 'D', 'B', 'H'},
};

Value value[N][M];
memset(value,0x00,sizeof(value));
char x0;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){

x0 = mas[i][j];
for(int k=0;k<N;k++){
if(mas[i][k]==x0)
value[i][j].a++;
}
for(int n=0;n<M;n++){
if(mas[n][j]==x0)
value[i][j].b++;
}
value[i][j].i = i;
value[i][j].j = j;
value[i][j].sum = value[i][j].a + value[i][j].b;
}
}
const int str=5;
const int stolb=5;
int i,j,a,c,e=1,d=100,x,z;
Value temp;
printf("До сортировки""\n\n");
for(i=0;i<str;i++)
{
for(j=0;j<stolb;j++)
{
printf("%i\t",value[i][j].sum);
}
printf("\n\n\n\n");
}
printf("\n\n");
//Сортируем массив
//_______________________________________________________________________________
for(c=0;c<=(str*stolb);c++)//колличество проходов
{
//в строках упорядочиваем
//____________________________________________
for(i=0;i<str;i++)
{
for(j=0;j<stolb-1;j++)
{
if(value[i][j].sum>value[i][j+1].sum)
{
temp=value[i][j];
value[i][j]=value[i][j+1];
value[i][j+1]=temp;
}
}
}
//в столбах упорядочиваем
//_____________________________________________
for(x=0;x<stolb;x++)
{
for(z=0;z<str-1;z++)
{
if(value[z][x].sum>value[z][x+1].sum)
{
temp=value[z][x];
value[z][x]=value[z][x+1];
value[z][x+1]=temp;
}
}
}
}
//вывод на экран после сортировки
//__________________________________________________________

printf("После сортировки по возрастанию""\n\n\n\n");
for(i=0;i<str;i++)
{
for(j=0;j<stolb;j++)
{
printf("%i\t",value[i][j].sum);
}
printf("\n\n\n\n");
}
printf("i = %i, j = %i, sum = %i",value[4][4].i,value[4][4].j,value[4][4].sum);
return 0;
}

Кто что может подсказать. Я в Paskale не особо силен. Поэтому и интересуюсь. Заранее спасибо.


Прикрепленные файлы
Прикрепленный файл  Lab7.cpp ( 2.25 килобайт ) Кол-во скачиваний: 253

Автор: Lapp 24.10.2009 15:34

Цитата(dima154 @ 24.10.2009 11:32) *

Спасибо за совет.
Поставим вопрос по другому.
Есть прога на С++. Она работает правильно и выдает нужный мне результат. Нужно реализовать эту прогу на Paskal. В частности, у меня не работает вот эта часть написанная на Paskal.

temp := v[z][x];
v[z][x] := v[z][x+1];
v[z][x+1] := temp;


т.е. элементы массива не обмениваются.

Вот прога на C++.
...
Кто что может подсказать. Я в Paskale не особо силен. Поэтому и интересуюсь. Заранее спасибо.

Все могут все подсказать. Правила нарушать не надо..
1. Все коды заключать в соответствующие тэги.
2. В этом разделе - ТОЛЬКО Паскаль. Никакого С.
Прочти Правила, будь добр.

Далее.. Переводить код с С на Паскаль - есть программы переводчики. Лично меня этот процесс никаким боком не беспокоит. Если ты таким странным методом решил обучаться Паскалю - дело твое, конечно..

Твой приведенный паскалевский фрагмент РАБОТАЕТ. Потому что не работать НЕ МОЖЕТ. Точка.
Ошибку ищи в другом месте. Мне же, например, для того, чтобы разобраться в программе нужно знать, ЧТО она должна делать. Ты это не сказал. Если не сортировка - то что?

Вот, давай, исправляй свои ошибки)). Если ПОСТАВИШЬ ЗАДАЧУ нормально, то на присутствие кода на С в разделе Паскаль я готов закрыть глаза.. cool.gif

PS
вечно так: вместо того, чтоб программировать, понатаскают чужих решений - а ты им еще и исправляй, переводи.. Терпеть этого не могу.. norespect.gif