Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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


Ответ
 
Опции темы
Старый 07.05.2009, 22:17   #1
_grusha_
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 21
По умолчанию помогите исправить код в задаче

Здравствуйте.
Есть задачка: В матрице расположить строки по возрастанию( или убыванию, не столь важно) сумм их элементов. Задачка с динамическими массивами, и количество элеметов в строках НЕ ОБЯЗТЕЛЬНО одинаково.
В конце вывести счетчик какая строка поменяла свое место.

Попыхтел над кодом.. вышло вот что( :


Код:
#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[]);
void main()
{
int i,j,n,m,k,l,min,imin,sum,x,c[100],b[100],y,vrem,op,po,pp;
char **a;
int z[100];
cout<<"vvedite kl strok = ";
cin>>m;
a = new char*[m];
for(i=0;i<m;i++)
{
cout<<endl<<i<<" dlinna = ";
cin>>n;
a[i] = new char[n];
z[i] = n;
}

printf("\n vvedite matricy:\n");
for(i=0;i<m;i++)
  for(j=0;j<z[i];j++)
    scanf(" %d",&a[i][j]);
printf("\n");
sum=0;
for(i=0;i<m;i++)
  {
	  for(j=0;j<z[i];j++)
      sum=sum+a[i][j];
    a[i][z[i]]=sum;
    sum=0;
  }
printf("\n\n");
for(i=0;i<m;i++)
 { printf("\n");
  for(j=0;j<z[i]+1;j++)
    printf(" %d",a[i][j]);
 }

printf("\n\n");
for (x=0; x<m; x++)
{
c[x]=a[x][z[x]];
}
for (y=0; y<m; y++)
{
if (c[y]<c[y+1])
{ 
	vrem=c[y];
	c[y]=c[y+1];
	c[y+1]=vrem;
}
}
for (i=0; i<m; i++)
cout<<c[i];
cout<<endl;
for (op=0; op<m; op++)
{
for (po=0; po<m;po++)
{
if (c[op]==a[po][z[po]])
{
	cout<<endl;
for (pp=0;pp<z[op];pp++)
{
	printf(" %d",a[po][pp]);;
 
}
}
}
}
Почему то работает через раз.. И никак не могу придумать как поставить счетчик...
Помогите, пожалуйста...

Ps. Начало задачи было взято вот отсюда http://programmersforum.ru/showthread.php?t=43560.

Код корявый, знаю...Поэтому обращаюсь к вам за помощью

Последний раз редактировалось _grusha_; 07.05.2009 в 22:49.
_grusha_ вне форума Ответить с цитированием
Старый 08.05.2009, 13:03   #2
_grusha_
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 21
По умолчанию

хоть подскажите что и как...
_grusha_ вне форума Ответить с цитированием
Старый 08.05.2009, 13:12   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
и количество элеметов в строках НЕ ОБЯЗТЕЛЬНО одинаково.
Что сие значит?
Цитата:
Сообщение от Википедия
Ма́трица — математический объект, записываемый в виде прямоугольной таблицы чисел
То есть количество элементов в строках должно быть одинаково. Иначе это уже не матрица.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 13:21   #4
_grusha_
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 21
По умолчанию

НУ, значит это не совсем матрица, а просто строки...

"Счетчик" может даже и не счетчик... не знаю как назвать..
Просто после пограммы нужно показать какие строки поменяли свои места.

Принцип то ясен, пытался написать.. вверху код - то, что получилось...

Проблема с сортировкой и выводом.
_grusha_ вне форума Ответить с цитированием
Старый 08.05.2009, 13:31   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от _grusha_
НУ, значит это не совсем матрица, а просто строки...
В условии написано:
Цитата:
В матрице расположить строки
Значит, все-таки матрица? Или это условие в вашем вольном изложении?
Все-таки одно дело менять строки матрицы, а другое - динамического массива строк разной длины.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 13:34   #6
_grusha_
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 21
По умолчанию

Изначально это было задание с матрицой и без динамический массивов.
Потом попросили написать тоже но с динамическими массивами и разным кол-вом элементов в строке... Получается что это уже не матрица, а массив строк.
_grusha_ вне форума Ответить с цитированием
Старый 08.05.2009, 14:06   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
#include <iostream>
#include <conio.h>
#include <string.h>
#include <stdio.h>
using namespace std;

int main()
{
int **mas;
int M,*raz,*sum,*por,**tmpmas;
int i,j,k,tmp;

cout<<"Vvedite kolichestvo strok: ";
cin>>M;
mas = new int*[M];
raz = new int[M];
por = new int[M];
sum = new int[M];

for(i=0; i<M; i++)
 {
  cout<<"Vvedite kolichestvo elementov v stroke "<<i<<": ";
  cin>>raz[i];
  mas[i] = new int[raz[i]];
  por[i] = i;
  sum[i] = 0;
  for(j=0; j<raz[i]; j++)
   {
    cout<<"Vvedite element mas["<<i<<"]["<<j<<"]: ";
    cin>>mas[i][j];
    sum[i] += mas[i][j];
   }
 }
//-----------
// выводим
cout<<"-------------------------\n\n";
for(i=0; i<M; i++)
 {
  for(j=0; j<raz[por[i]]; j++)
   {
    cout.width(4);
    cout<<mas[i][j];
   }
   cout<<endl;
 }
cout<<endl<<endl;

// сортируем массив сумм и порядков
for(i=0; i<M-1; i++)
 {
  k = i;
  for(j=i+1; j<M; j++)
   if(sum[j]<sum[k]) k = j;
  tmp = por[i];
  por[i] = por[k];
  por[k] = tmp;
  tmp = sum[i];
  sum[i] = sum[k];
  sum[k] = tmp;
 }
//--------
tmpmas = mas;
mas = NULL;
mas = new int*[M];
for(i=0; i<M; i++)
 {
  mas[i] = new int[raz[por[i]]];
  for(j=0; j<raz[por[i]]; j++)
   mas[i][j] = tmpmas[por[i]][j];
 }
for(i=0; i<M; i++)
 delete[] tmpmas[i];
delete[] tmpmas;

//------------
for(i=0; i<M; i++)
 {
  for(j=0; j<raz[por[i]]; j++)
   {
    cout.width(4);
    cout<<mas[i][j];
   }
  cout<<endl;
 }
//-----------
cout<<"Konechnyj poryadok: "<<endl;
for(i=0; i<M; i++)
 cout<<por[i]<<" ";

delete[] sum;
delete[] raz;
delete[] por;
for(i=0; i<M; i++)
 delete[] mas[i];
delete[] mas;

getch();
return 0;
}
Пример ввода:
Код:
Vvedite kolichestvo strok: 5
Vvedite kolichestvo elementov v stroke 0: 3
Vvedite element mas[0][0]: 1
Vvedite element mas[0][1]: 2
Vvedite element mas[0][2]: 3
Vvedite kolichestvo elementov v stroke 1: 4
Vvedite element mas[1][0]: 3
Vvedite element mas[1][1]: 5
Vvedite element mas[1][2]: 6
Vvedite element mas[1][3]: 7
Vvedite kolichestvo elementov v stroke 2: 2
Vvedite element mas[2][0]: 1
Vvedite element mas[2][1]: 2
Vvedite kolichestvo elementov v stroke 3: 3
Vvedite element mas[3][0]: 1
Vvedite element mas[3][1]: 4
Vvedite element mas[3][2]: 7
Vvedite kolichestvo elementov v stroke 4: 3
Vvedite element mas[4][0]: 1
Vvedite element mas[4][1]: 3
Vvedite element mas[4][2]: 4
-------------------------

   1   2   3
   3   5   6   7
   1   2
   1   4   7
   1   3   4


   1   2
   1   2   3
   1   3   4
   1   4   7
   3   5   6   7
Konechnyj poryadok:
2 0 4 3 1
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.05.2009, 18:21   #8
_grusha_
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 21
По умолчанию

спасибо большое)
Но нужен не конечный порядок, а номера строк, которые поменяли свои места.

Последний раз редактировалось _grusha_; 08.05.2009 в 18:26.
_grusha_ вне форума Ответить с цитированием
Старый 09.05.2009, 10:53   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Но нужен не конечный порядок, а номера строк, которые поменяли свои места.
Ну тогда просто пройдите по массиву por. Если por[i] != i, то элемент por[i] сменил свое место.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.05.2009, 20:51   #10
_grusha_
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 21
По умолчанию

:cry:

Уважаемый Sazary, понимаю, что это элементарщина... Но моск отказывается понять как сделать вывод этого элемента...
Помогите пожалуйста, эту задачу сдам и прощай С++...
_grusha_ вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить ошибку в задаче! Игорь777 Помощь студентам 4 26.04.2009 17:31
помогите исправить ошибки в задаче на С++ Wia Помощь студентам 4 14.12.2008 16:09
Помогите исправить ошибку в задаче Vladislav_87 Паскаль, Turbo Pascal, PascalABC.NET 4 04.07.2008 11:27
Помогите дописать и исправить ошибку в задаче Vladislav_87 Паскаль, Turbo Pascal, PascalABC.NET 5 29.05.2008 23:14
Помогите исправить ошибку в задаче VANOLORD Паскаль, Turbo Pascal, PascalABC.NET 9 19.05.2008 21:16


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS