IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Не сортируются элементы массива структур, Не сортируются элементы массива структур
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Здравствуйте! Есть программа на 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;


Сообщение отредактировано: volvo -


Прикрепленные файлы
Прикрепленный файл  Lab7_element.pas ( 2.64 килобайт ) Кол-во скачиваний: 168
Прикрепленный файл  Lab7.pas ( 2.72 килобайт ) Кол-во скачиваний: 165
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ну, давай начнем с того, что твоя программа (в обоих случаях, кстати) вообще аварийно вылетает:
               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 и запусти программу еще раз...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 3
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Спасибо за совет.
Поставим вопрос по другому.
Есть прога на С++. Она работает правильно и выдает нужный мне результат. Нужно реализовать эту прогу на 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 не особо силен. Поэтому и интересуюсь. Заранее спасибо.

Сообщение отредактировано: Lapp -


Прикрепленные файлы
Прикрепленный файл  Lab7.cpp ( 2.25 килобайт ) Кол-во скачиваний: 152
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.10.2020 17:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name