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

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> задача на динамические двумерные массивы, С++
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


Дана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех строках, которые не содержат отрицательных элементов;
2)минимум среди сумм элементов диагоналей,параллельных главной дтагонали матрицы.

программу нужно выполнить с использованием динамического двумерного массива,элементы которого нужно считывать с файла.

проблема в том,что у меня не получается даже начать,то есть оорганизовать массив...причина этому минимальный набор знаний по этому поводу.очень прошу помочь...с организацие массива и хотя бы один пример обращения к нему.
буду очень благодарна за помощь.


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
проблема в том,что у меня не получается даже начать,то есть оорганизовать массив
Т.к. в заголовке указан С++, то:

std::vector < std::vector<int> > arr;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


не поняла)

а если что-то вроде
int **p;
p=new(int*)[5];
for (int i=0;i<5;i++)
{
p[i]=new int[4];
}

??

и как насчет того,как считывать с файла элементы?)


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ты думаешь, что сделаешь лучше, чем написано в STL? Тогда, извини, почему не

int **p;
p = (int **)malloc(5 * sizeof(int *));
for (int i=0;i<5;i++) {
p[i]=(int *)malloc(4 * sizeof(int));
}

?
Ты же не пользуешься malloc? Тогда зачем самоделка, если есть очень мощное уже реализованное и протестированное средство?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


я не думаю,что сделаю лучше.
мне дали задание.я его пытаюсь выполнить.
но при этом я хочу еще и понять,что к чему.

что такое malloc?


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Perl. Just code it!
******

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

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


void *malloc(unsigned s)


Возвращает указатель на блок динамически распределенной памяти длиной s байт. При неудачном завершении возвращает NULL.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


просто человек
******

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

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


вот типа того, что ты предлагаешь:
далеко не оптимально, но работает smile.gif
и знаний требует минимум... сможешь сама объяснить, что откуда берется
int **mas=new int*[m];
for (int i=0;i<m;i++)
{
mas[i]=new int[n];
for (int j=0;j<n;j++)
{
//чтение из файла или другой вариант заполнения
}
}



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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Юля, ЭТО работать не будет... double* в int* нельзя преобразовывать smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


просто человек
******

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

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


сорри.
было все double, заменяла и одно место пропустила.
исправила.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


вот то что я нахимичила по этой задаче.
создание массива и чтение из файла просиходит успешно.
по заданию получается какой-то бред.
в чем причина?

#include <iostream.h>
#include <fstream.h>


int main()
{
ifstream fin ("input.txt");
if (!fin)
{
cout << "Файл input.txt не доступен." << endl;
return 1;
}
ofstream fout("output.txt");
if (!fout)
{
cout << "Невозможно открыть файл для записи." << endl;
return 1;
}

int n;
fin >> n;
int i,j,s;
int **mas=new int *[n];
for (i=0;i<n;i++) mas[i]=new int [n];
for (i=0;i<n;i++)
for (j=0;j<n;j++) fin >> mas[i][j];
for (i=0;i<n;i++)
{
for (j=0;j<n;j++) fout << mas[i][j] << " ";
fout <<endl;
}

//1)
i=0;
for (j=0;j<n;j++)
{
s=0;
if (mas[i][j]<0) i++;
else
{
for (j=0;j<n;j++) s+=mas[i][j];
fout << i << " - " << s << endl;
i++;
}
}

//2)
int k,m;
int smin=100000;
for (k=1;k<n;k++)
for (m=n;m>1;m--)
{
s=0;
for (i=0;i<k;i++)
for (j=n;j<m;j++)
{
s+=mas[i][j];
fout << s;
if (s<smin) smin=s;
}
}
fout << "Минимум среди сумм эл-тов диагоналей: " << smin;

}


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Может, лучше так:
// 1)
for(i = 0; i < n; ++i) {
s = 0;

int count = 0;
for(j = 0; j < n; j++) {
s += mas[i][j];
if(mas[i][j] < 0) count++;
}
if(!count)
fout << i << " - " << s << endl;
}


P.S. Освободить память не забудь, у тебя пока что leak...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


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

ps извините,а освободить это delete?)..


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
а как быть со вторым
Я бы делал так:
  int min_s = 10000;
for(j = 0; j < n; ++j) {
s = 0;
for(i = 0; i < n - j; ++i) s += mas[i][j + i];
min_s = (min_s < s) ? min_s : s;

s = 0;
for(i = 0; i < n - j; ++i) s += mas[j + i][i];
min_s = (min_s < s) ? min_s : s;
}
fout << "Минимум среди сумм эл-тов диагоналей: " << min_s;


А освободить - это:
for(i = 0; i < n; i++) delete mas[i];
delete mas;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


ок...сейчас проверю
а кстати это нормально,что я использую значение 10000 для удобства?,дабы выделить минимальную сумму?


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Можешь использовать MAXINT, только придется сделать
#include <limits.h>


если ты точно уверена, что суммы больше 10000 не будет, то можно и оставить...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


а что ознаает это запись?
min_s = (min_s < s) ? min_s : s;


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Аналог вот этой записи:
if(min_s < s) min_s = min_s; else min_s = s;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


хммм....по части 1) части вообще ничего в файл не пишется...
как так?

Цитата(volvo @ 9.10.2006 1:10) *

Аналог вот этой записи:
Код
if(min_s < s) min_s = min_s; else min_s = s;


ясно)
спасибо

а по второй неправильно считает((

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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Цитата
по части 1) части вообще ничего в файл не пишется...
как так?
Я что, телепат по-твоему? Мне твои исходные данные неизвестны... Может, вообще нет строк без отрицательных элементов, откуда я знаю...

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


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


исходный файл:
2 1 1 2 1

файл вывода:
1 1
2 1
Минимум среди сумм эл-тов диагоналей: 2

полный текст программы
#include <iostream.h>
#include <fstream.h>


int main()
{

//организация файлов ввода-вывода
ifstream fin ("input.txt");
if (!fin)
{
cout << "Файл input.txt не найден." << endl;
return 1;
}
ofstream fout("output.txt");
if (!fout)
{
cout << "Невозможно открыть файл для записи." << endl;
return 1;
}

//организация массива
int n;
fin >> n;
int i,j,s;
int **mas=new int *[n];
for (i=0;i<n;i++) mas[i]=new int [n];
for (i=0;i<n;i++)
for (j=0;j<n;j++) fin >> mas[i][j];
for (i=0;i<n;i++)
{
for (j=0;j<n;j++) fout << mas[i][j] << " ";
fout <<endl;
}

//1)
for (i=0;j<n;j++)
{
s=0;
int count=0;
for (j=0;j<n;j++)
{
s+=mas[i][j];
if (mas[i][j]<0) count++;
}
if (!count) fout << "Сумма эл-тов в строке№" << i << " : " << s << endl;
}

//2)
int min_s=10000;
for (j=0;i<n;j++)
{
s=0;
for (i=0;i<n-j;i++) s+=mas[i][j+i];
if(min_s < s) min_s = min_s;
else min_s = s;

s=0;
for (i=0;i<n-j;i++) s+=mas[j+1][i];
if(min_s < s) min_s = min_s;
else min_s = s;
}
fout << "Минимум среди сумм эл-тов диагоналей: " << min_s;

//освобождение памяти
for(i=0;i<n;i++) delete mas[i];
delete mas;

}


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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