Дана целочисленная квадратная матрица. Определить: 1) сумму элементов в тех строках, которые не содержат отрицательных элементов; 2)минимум среди сумм элементов диагоналей,параллельных главной дтагонали матрицы.
программу нужно выполнить с использованием динамического двумерного массива,элементы которого нужно считывать с файла.
проблема в том,что у меня не получается даже начать,то есть оорганизовать массив...причина этому минимальный набор знаний по этому поводу.очень прошу помочь...с организацие массива и хотя бы один пример обращения к нему. буду очень благодарна за помощь.
volvo
8.10.2006 14:20
Цитата
проблема в том,что у меня не получается даже начать,то есть оорганизовать массив
Т.к. в заголовке указан С++, то:
std::vector < std::vector<int> > arr;
Tribunal
8.10.2006 14:27
не поняла)
а если что-то вроде
int **p; p=new(int*)[5]; for (int i=0;i<5;i++) { p[i]=new int[4]; }
??
и как насчет того,как считывать с файла элементы?)
volvo
8.10.2006 14:32
Ты думаешь, что сделаешь лучше, чем написано в STL? Тогда, извини, почему не
int **p; p = (int **)malloc(5 * sizeof(int *)); for (int i=0;i<5;i++) { p[i]=(int *)malloc(4 * sizeof(int)); }
? Ты же не пользуешься malloc? Тогда зачем самоделка, если есть очень мощное уже реализованное и протестированное средство?
Tribunal
8.10.2006 14:35
я не думаю,что сделаю лучше. мне дали задание.я его пытаюсь выполнить. но при этом я хочу еще и понять,что к чему.
что такое malloc?
klem4
8.10.2006 14:46
void *malloc(unsigned s)
Возвращает указатель на блок динамически распределенной памяти длиной s байт. При неудачном завершении возвращает NULL.
мисс_граффити
8.10.2006 17:46
вот типа того, что ты предлагаешь: далеко не оптимально, но работает и знаний требует минимум... сможешь сама объяснить, что откуда берется
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
8.10.2006 17:53
Юля, ЭТО работать не будет... double* в int* нельзя преобразовывать
мисс_граффити
8.10.2006 18:41
сорри. было все double, заменяла и одно место пропустила. исправила.
Tribunal
8.10.2006 19:23
вот то что я нахимичила по этой задаче. создание массива и чтение из файла просиходит успешно. по заданию получается какой-то бред. в чем причина?
#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;
}
volvo
8.10.2006 19:44
Может, лучше так:
// 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...
Tribunal
8.10.2006 20:10
ок,действительно так лучше) а как быть со вторым...там я вообще сильно намудрила...
ps извините,а освободить это delete?)..
volvo
8.10.2006 20:29
Цитата
а как быть со вторым
Я бы делал так:
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;
Tribunal
8.10.2006 20:58
ок...сейчас проверю а кстати это нормально,что я использую значение 10000 для удобства?,дабы выделить минимальную сумму?
volvo
8.10.2006 21:00
Можешь использовать MAXINT, только придется сделать
#include <limits.h>
если ты точно уверена, что суммы больше 10000 не будет, то можно и оставить...
Tribunal
8.10.2006 21:04
а что ознаает это запись? min_s = (min_s < s) ? min_s : s;
volvo
8.10.2006 21:10
Аналог вот этой записи:
if(min_s < s) min_s = min_s; else min_s = s;
Tribunal
8.10.2006 21:21
хммм....по части 1) части вообще ничего в файл не пишется... как так?
Цитата(volvo @ 9.10.2006 1:10)
Аналог вот этой записи:
Код
if(min_s < s) min_s = min_s; else min_s = s;
ясно) спасибо
а по второй неправильно считает((
volvo
8.10.2006 21:37
Цитата
по части 1) части вообще ничего в файл не пишется... как так?
Я что, телепат по-твоему? Мне твои исходные данные неизвестны... Может, вообще нет строк без отрицательных элементов, откуда я знаю...
Не знаю, что там у тебя неправильно, я прежде чем выложить - проверил (кстати, распечатывал эти самые диагонали полностью, так что ошибки быть не может) - проверяй как следует ВСЕ, что было ДО этого фрагмента...
Tribunal
8.10.2006 21:54
исходный файл: 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;
//освобождение памяти for(i=0;i<n;i++) delete mas[i]; delete mas;
}
volvo
8.10.2006 22:01
У меня единицу выдает...
Цитата
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;
Это как понимать?
мисс_граффити
9.10.2006 2:43
...на уровне рекомендации: может, использовать в циклах локальные переменные? то есть не
Код
int n; for (n=.......
а
Код
for (int n=....
?
Tribunal
9.10.2006 11:11
а у меня всё равно 2=(( то есть у меня упорно считается только сумма эл-тов главной диагонали
и я не могу понять,почему 1 часть не работает вообще...=( точнее нет результата или он не записывается в файл...
Цитата(мисс_граффити @ 9.10.2006 6:43)
...на уровне рекомендации: может, использовать в циклах локальные переменные? то есть не
Код
int n; for (n=.......
а
Код
for (int n=....
?
ок.можно и так)
Tribunal
9.10.2006 17:32
во 2) ошибку нашла... всё дело в моей невнимательности((
в 1) тоже была ошибка=/
большое спасибо за помощь! во всём разобралась))
arhDMC
14.12.2007 4:29
Дана целочисленная квадратная матрица. Определить: 1) сумму элементов в тех строках, которые не содержат отрицательных элементов; 2)минимум среди сумм элементов диагоналей,параллельных главной дтагонали матрицы.
У кого нибудь есть решение этих задач на С++ только без считывания из файла!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.