nikedeforest
|
|
« : 05-05-2006 07:37 » |
|
#include <conio.h> #include <iostream.h> #include <values.h> #include <limits.h>
int calc (int **mass) { for (int j=0; j<4; j++) { for (int i=0; i<3; i++) { if (mass[i][j]==0) { return j; } } } return -1; }
попробуй это вставить. Помни, что нумерация начинается с 0. А ошибки у тебя 2 было, одна: int *calc (int **mass) А возвращала ты целое число, а не указатель, т.е. return k; А другая логическая. Оператор break не спас бы тебя, из одного цикла ты выйдешь, а из другого (внешнего) нет.
|
|
« Последнее редактирование: 14-05-2006 11:16 от Алексей1153 »
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #1 : 05-05-2006 11:02 » |
|
"И раскроются все тайны и чудеса, поскольку постигнуты будут естественные причины их…" Френсис Бэкон
Ещё раз в С++ нет двумерных массивов!!! Все данные записаны в памяти последовательно. Поищи на форуме. Уже было обсуждение этого вопроса.
Вот эту 2 4 7 8 9 3 5 0 3 7 0 6 запись я могу представить, как
2 4 7 8 9 3 5 0 3 7 0 6
или как
2 4 7 8 9 3 5 0 3 7 0 6
Как видишь, в одном случае второй и четвёртый столбец содержат 0, а во втором только второй.
для наглядности - вот так расположены данные в памяти для двух массивов:
int mass[3][4]={4,7,9,1,3,0,2,4,6,8,0,5}; int mass1[12]={4,7,9,1,3,0,2,4,6,8,0,5};
0012F714 04 00 00 00 07 00 00 00 // mass 0012F71C 09 00 00 00 01 00 00 00 0012F724 03 00 00 00 00 00 00 00 0012F72C 02 00 00 00 04 00 00 00 0012F734 06 00 00 00 08 00 00 00 0012F73C 00 00 00 00 05 00 00 00 0012F744 04 00 00 00 07 00 00 00 // mass1 0012F74C 09 00 00 00 01 00 00 00 0012F754 03 00 00 00 00 00 00 00 0012F75C 02 00 00 00 04 00 00 00 0012F764 06 00 00 00 08 00 00 00 0012F76C 00 00 00 00 05 00 00 00
Как видишь - никакой разницы.
|
|
« Последнее редактирование: 05-05-2006 11:46 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #2 : 05-05-2006 15:21 » |
|
Джон, имхо ты не прав или не корректен. Двухмерные массивы есть не только в С++, но и в С. А тот момент, как элементы массива расположены в памяти не имеет значения, важно помнить лишь, что элементы массива расположены последовательно. Двухмерный массив с языке С/С++ - это массив указателей. Вспомним динамическое выделение памяти int **arr; //cоздаем массив указателей arr=new int * [4]; //а теперь от каждого указателя создаем еще массив arr[i]=new int [4];
Важно помнить, что указатель хранит в себе адрес на участок в памяти, т.е. когда мы пишим arr[ i ]=new int [4]; то на самомо деле происходит присвоение каждому элементу массива arr[] адреса на участок памяти с которого начнется еще один массив. Да в памяти элементы массива расположутся не ввиде матрицы, а полседовательно, при этом не стоит думать, что за последним элементом массива arr[0] будет находиться первый элемент массива arr[1]. Такой гарантии никто не даст, но дадут гарантию, что все элементы массива arr[0] будут расположены последовательно, не фрагментировано, тоже самое для элементов массивов arr[1], arr[2], arr[3] и т.д. В С/С++ есть не только двухмерные массивы, но и многомерные. Вот такое мое имхо, извините, если что не так.
|
|
« Последнее редактирование: 05-05-2006 15:31 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #3 : 05-05-2006 15:37 » |
|
Мне кажется, что спор об арности массивов смысла не имеет. На уровне машины (выделения памяти, работы с указателями) - многомерных массивов нет. На уровне мышления программиста такие массивы есть, и ими можно пользоваться. Проблема сращивания эти разных уровней абстракции лежит лишь в передаче массивов через указатели. Возможна передача массива в качестве параметра функции, но лишь одномерного массива. void f(int a[]) { ... } ... int a[10]; f(a);
На уровне комплиятора C передача массивов с количеством размерностей более 1 решается только при явном задании всех размерностей кроме последней. void f(int a[10][]) { ... } ... int a[10][10]; f(a);
Связано это с алгоритмом преобразования оператора [] в значение на этапе компиляции. На уровне машинного кода массивов как понятия нет вообще, есть лишь указатели и участки непрерывной памяти под массивы. Выделение памяти всегда последовательно: за последним элементом a[0][] всегда идёт первый элемент a[1][].
|
|
« Последнее редактирование: 05-05-2006 15:57 от dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #4 : 05-05-2006 15:45 » |
|
Примечание: выделение памяти последовательно лишь в статических массивах (размеры которых определены на этапе компиляции), для динамических массивов это не обязательно.
Возможны операции с динамическими структурами как с массивами, в том числе создание многомерных "массивов" с переменным количеством элементов в измерениях. Например для "массива" a[10][] количество элементов в a[0] может быть 5, в a[1] - 2 и т.д.
|
|
« Последнее редактирование: 05-05-2006 15:50 от dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #5 : 05-05-2006 15:55 » |
|
Алгоритм преобразования оператора [] в значение такой: a[x][y]...[z] => *(...*(*(a+x)+y)+...+z)
|
|
« Последнее редактирование: 05-05-2006 15:57 от dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #6 : 05-05-2006 15:59 » |
|
nikedeforest, я не буду с тобой сейчас и в этой теме спорить по поводу N-мерных массивов. Тем более, что споры уже были. Я посмотрю темку, или сам поищи. В данном случае важно понимание сути "строк" и "столбцов". Или это было не достаточно наглядно? Данные одни и те же. Каким образом ты получишь доступ к этим данным не важно. Но важно, то что ты считаешь столбцом и строкой в ОДНОМЕРНОМ массиве. ps В принципе тоже самое, что dimka сказал только "моими" словами.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #7 : 05-05-2006 16:01 » |
|
Если тема так интересна и актуальна - надо найти старую тему и перенестись туда.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #8 : 07-05-2006 13:04 » |
|
НЕ думал, что есть по этому поводу споры, ну да ладно. Спорить сейчас и мне не под силу, к тому же не тостаточно компетентности, чтобы с вами спорить. Темку как-нибудь поищу, но не сейчас. Просто мне кажется вы людей путаете такими высказываниями. Я не видел ни одной книги по С/С++ где бы не было заголовка "Двухмерные массивы" или "Многомерные массивы". Надо посмотрить есть ли этот момент в стандарте. Ну спорить не буду, да и есть ли смысл, как я понимаю этот вопрос почти что из ряда философских, типа "Что раньше - яйцо или курица?"
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 07-05-2006 13:54 » |
|
nikedeforest, совершенно не понял, о чём ты говоришь. К проблеме "курицы и яйца" описанное никакого отношения не имеет, к стандарту тоже (за исключением вопросов декларации массивов, передачи массивов как параметров и обработки оператора []). Вообще проблемы нет никакой. Всякий непрерывный кусок памяти может быть интерпретирован как массив с любым количеством измерений, лишь бы этот кусок памяти в самом деле был непрерывным, и его размер соответствовал бы размеру массива. А писать эту интерпретацию можно хоть на ассемблере - никакие стандарты языка не могут ограничить программиста в абстрагировании от конкретных языковых средств. Вот рабочий пример на Borland C++ 3.1: #include <stdio.h>
#define N 10
typedef int line_array[N * N]; typedef int square_array[N][N];
int main() { int i, j; line_array a; square_array *b;
printf("A 1D array:\n"); for(i = 0; i < N * N; ++i) { a[i] = i; printf("%4i", a[i]); } printf("\n");
b = (square_array *)&a;
printf("A 2D interpretation of the array:\n"); for(i = 0; i < N; ++i) { for(j = 0; j < N; ++j) printf("%4i", (*b)[i][j]); printf("\n"); }
return 0; }
В примере можно ввести ещё множество типов int[5][20], int[25][4] и т.д., и работать с их помощью всё с тем же массивом int[100].
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #10 : 07-05-2006 14:10 » |
|
Слово "массив" - это не понятие некоторого языка программирования, это понятие программирования. В развитых языках это понятие реализовано в виде соответствующих языковых конструкций, в неразвитых - программист сам для себя решает, как организовать массив при помощи имеющихся языковых средств.
В C/C++ понятие "массив" имеет смысл участка памяти, заполненного единицами данных одного типа. Всё остальное - размерность массивов, оператор [], динамические массивы, строки - это лишь надстройки для удобства программиста, "артефакты". Говорить, что их не существует, не имеет смысла, т.к. ими повсеместно пользуются. Говорить, что это основные языковые понятия, будет неверно.
Поэтому спор о том, существуют многомерные массивы "на самом деле" или не существуют, бессмысленен, т.к. не определено "самое дело" - смысловая область приложения этого спора.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
nikedeforest
|
|
« Ответ #11 : 07-05-2006 15:52 » |
|
Ну не знаю. Я все прекрасно понимаю, что вы мне говорите, ну не могу сказать, что я совсем согласен. Мне, например, не нравится этот момент В C/C++ понятие "массив" имеет смысл участка памяти, заполненного единицами данных одного типа. Всё остальное - размерность массивов, оператор [], динамические массивы, строки - это лишь надстройки для удобства программиста, "артефакты". Говорить, что их не существует, не имеет смысла, т.к. ими повсеместно пользуются. Говорить, что это основные языковые понятия, будет неверно.
Вот не согласен я тут. Вот как я мыслю. Если бы не было реализации этого, то можно было бы сказать, к примеру, "В С/С++ нет строк". А то, что можно самому этот механизм реализовать это дело левое. Т.е. я как считаю, язык реализовал возможность, значит в нем это есть, не реализовал - нет. А то, что программист может создать то, чего нет, об этом речи не веду. А Джон как раз и написал: "Ещё раз в С++ нет двумерных массивов!!! " Но с другой стороны, я согласен, что В C/C++ понятие "массив" имеет смысл участка памяти, заполненного единицами данных одного типа.
И я врезультате в замешательстве. И скорее всего замешательство это вызвано какой-то неопределенностью, твоими словами Поэтому спор о том, существуют многомерные массивы "на самом деле" или не существуют, бессмысленен, т.к. не определено "самое дело" - смысловая область приложения этого спора.
Решил для себя, что спор бессмыслинен , и пускай, что он не из категории "Яйцо или курица".
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 07-05-2006 16:11 » |
|
"Ах оставьте ненужные споры - я себе уже всё доказал" (с) Сразу скажу я не против термина "двумерный", как Димка правильно сказал - для программиста удобней ползоваться этим термином. Дело в следущем - по условию задания надо просканировать матрицу NxM и выдать индекс по условию. ЧТО МОЖЕТ БЫТЬ ПРОЩЕ? Практически любая операция обращения к данным в виде матрицы связана с этим. Те для меня на лицо явное непонимание основных принципов организации данных. Это не проблема языка, а проблема понимания. Поэтому и эпиграф в первом топике и провоцирующая инфа - "двумерных массивов нет". Я ожидал реакции - "да я это знаю, у меня проблема в другом". Всё-таки человек занимается програмированием и только готовыми штампами здесь не обойтись. Поэтому я и вопрос задал. И если человек затрудняется на него ответить, то значит проблема именно с пониманием внутренней организации данных. Согласись без этого понимания за функции обработки этих данных даже и браться не стоит. Исключение, конечно, если это нафиг не надо, а нужно просто готовое решение, чтобы получить зачёт. Ну а про говорится, не говорится... Яйцо, курица... Запутываем... Да нет, скорее наоборот разъясняем. Ведь на самом деле всё гораздо проще. Я не буду тебя убеждать, ты сам должен к этому прийти. Попытайся сначала ответить на пару вопросов. Тебя вообще-то запись обращения к элементу не смущает? Например m[2][3]. Ведь если это многомерный массив, то логичней к нему было бы обращаться m[2,3]? Или? А дело в том, что "многомерные" массивы в С++ есть не что иное как массивы массивов. Явная формула записи существует, обращение к элементу m[ i ] [ j ] можно записать в виде *(*(m+i)+j). Те просто вычисление указателя на нужный блок памяти. Хотя про это тоже говорили. К чему я это? А вот к чему - попробуй передать в функцию в качестве параметра двумерный массив, ну хотя бы m[2][3] - интересно как ты это сделаешь? А темка тут - только вроде какие-то траблы с базой были или не совместимость с новым движком - там форматирование нарушено: https://forum.shelek.ru/index.php/topic,1374.msg21182.html#msg21182Там кстати на живом примере показано, как важно понимание сути. зы Я потом эти топики туда перенесу. Ща со временем напряжёнка. Да и там заодно флуд подчистить надо. ИМХО тема заслуживает присутствия в FAQ.
|
|
« Последнее редактирование: 07-05-2006 16:13 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #13 : 07-05-2006 16:15 » |
|
Я в топик m[ i ] [ j ] специально записал иначе просто i в квадратных скобках воспринимается как тег для курсива
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #14 : 07-05-2006 16:42 » |
|
Да, Джон, ты прав. Но меня интересует такой момент, а в каком же языке программирования тогда есть такое понятие "двухмерные массивы"? Запись m[2,3] не показатель на двухмерность, имхо. Насколько я помню в Паскале так пишится, но если выделять память динамически, то там кажется суть такая же как в С. Значит в Паскале этого термина тоже нет. А где тогда (интересно же)? Дело в том, что как ни крути, в памяти это будет записано последовательно (так сказать "в строку"), а не ввиде матрицы (имхо, это беспредел уже какой-то был бы). Или я тут ошибаюсь? Просто у меня пока, следуя вашим выводам, получается, что такого понятия и нет ни в каком языке. Те для меня на лицо явное непонимание основных принципов организации данных. Это не проблема языка, а проблема понимания. Поэтому и эпиграф в первом топике и провоцирующая инфа - "двумерных массивов нет". Я ожидал реакции - "да я это знаю, у меня проблема в другом". Всё-таки человек занимается програмированием и только готовыми штампами здесь не обойтись. Поэтому я и вопрос задал.
Я согласен, что твой вопрос поставил Carrie Bradshaw в тупик и этот момент надо было проработать. Но как мне показалось у нее проблема была еще и в том, что она не совсем осмыслила свое решение. Вот этот момент но вообще хотела, чтоб матрица считывалась не построчно, а по столбцам. как только найдет первый нулевой элемент, просто запоминает его второй индекс. вот и всё.
Тут дело в том, что какая разница как пробегать матрицу по строке - столбцам или по столбцам - строке (ой, витеевато, наверное, написал), если один фиг посмотреть надо все элементы матрицы. А может я ее не правильно понял.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #15 : 07-05-2006 16:58 » |
|
К чему я это? А вот к чему - попробуй передать в функцию в качестве параметра двумерный массив, ну хотя бы m[2][3] - интересно как ты это сделаешь? Пожалуйста (для Borland C++ 3.1): #include <stdio.h>
#define N 2 #define M 3
void f(int m[N][M]) { int i, j; for(i = 0; i < N; ++i) { for(j = 0; j < M; ++j) printf("%2i", m[i][j]); printf("\n"); } }
int main() { int m[N][M]; int i, j, k = 0; for(i = 0; i < N; ++i) for(j = 0; j < M; ++j) m[i][j] = k++; f(m); return 0; }
Об этом выше уже писалось - о правиле указания размерностей при передаче массива в качестве параметра.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #16 : 07-05-2006 17:08 » |
|
Ха, весельчак. "Эт и я так могу" (с) Промокашка
Это разрешено делать, если на этапе трансляции известен размер массива. А ты попробуй с динамическим массивом - N и M переменные. Я имел ввиду конечно же двумерный массив - 2 и 3 были просто для примера.
Слабо записать void f(int m[][])? А?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #17 : 07-05-2006 17:24 » |
|
Слабо записать void f(int m[][])? А? Может, несмотря на пыл споров, всё же будем внимательно читать, что друг другу пишем? Об этом выше уже писалось - о правиле указания размерностей при передаче массива в качестве параметра. См. пост #102.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #18 : 07-05-2006 17:34 » |
|
дана матрица. указать первый столбец, в котором встречается нулевой элемент Как это ещё можно по другому понять? Какое ещё решение может быть, кроме цикла в цикле? Что тут может быть сложного? Всё это так, если бы это была действительно математическая матрица. Но мы имеем дело с программированием и сложность заключается в след. Ещё раз, не важно как это называется. Но если программист, работая с С++, представляет себе только прямоугольник с цифрами и ничего другого, то он уже не понимает, что делает. Прямоугольные скобки в данном случае скорее сбивают с толку, чем помогают. Тк несут другую смысловую нагрузку - а именно левая показывает не столбец и не строку, а номер блока, который в свою очередь является массивом (хотя это и не обязательно). Что это? Строка? Столбец? Я не знаю. Да и компилятору по барабану. Это для него альтернативная запись доступа к блоку памяти и всё. Те наше "математическое" обращение к элементам матрицы превращается в хитрую запись указателей. В этом и заключается сложность и проблематика. Именно к этому ты и должен был бы прийти. Поэтому это ИМХО очень важный вопрос. ПРАВИЛЬНО ПОЛЬЗОВАТЬСЯ УКАЗАТЕЛЯМИ. Как показывает опыт проблемы кроются именно в этом. Конечно я не могу тебе ответить как это реализовано в других языках. Для этого я должен их знать, хотя бы так же хорошо, как С++, который, честно говоря, я тоже желал бы знать лучше. Я не теоретик программирования. Подобные вещи я усвоил на своём опыте (не всегда сладком) и всегда об этом говорю. Ещё раз сошлюсь на темку - ведь тоже простая ошибка. А сколько людей не знают о нашем форуме и ковыряются с подобными ошибками, только потому, что некий нерадивый препод по инфораматике в своё время привил уверенность к тому, что в С++ есть двумерные массивы типа m[строка][столбец]
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #19 : 07-05-2006 17:42 » |
|
Может, несмотря на пыл споров, всё же будем внимательно читать, что друг другу пишем?
Давай - начнём с того, что мой вопрос про передачу в ф-ю массива я адресовал nikedeforest, а не тебе. Ок? Потом, то что ты написал отвлекает от темы, если ты внимательно читаешь мои топики. Тем более строго говоря твои примеры содержат ошибки. Но я опять таки не обращаю на них внимание, потому, что к пониманию вопроса это не относится Вот так должно быть записано правильное решение (int** m, int N, int M) Разобраться почему - оставляю как домашнее задание. зы Конечно я не знаток именно Borland C++, но если он такое позоволяет, то это не говорит в его пользу.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 07-05-2006 17:46 » |
|
Джон, dimka, спорить, НО только не ссориться!
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #21 : 07-05-2006 18:00 » |
|
А мы и не соримся. Или? Димка, если я тебя чем обидел - сорри. Не со зла я это. В моём #115 конечно не хватает смайлков. Это был не наезд, я просто прикололся. Тк ты предложил частное решение. Ещё раз - я просто пытаюсь объяснить nikedeforest в чём поблема. Да и спора собственно быть не может, мы с Димкой в принципе говорим об одном и том же. Повода для спора я не вижу.
Кстати, Лёшка ты очень к стати - если время есть - перекинь эти топики в темку линк на которую я дал. И в Чаво её родимую.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #22 : 07-05-2006 18:02 » |
|
Что-то и вправду как-то мы все друг друга не совсем понимаем, имхо . Прямоугольные скобки в данном случае скорее сбивают с толку, чем помогают. Тк несут другую смысловую нагрузку - а именно левая показывает не столбец и не строку, а номер блока, который в свою очередь является массивом (хотя это и не обязательно). Что это? Строка? Столбец? Я не знаю. Да и компилятору по барабану. Это для него альтернативная запись доступа к блоку памяти и всё. Те наше "математическое" обращение к элементам матрицы превращается в хитрую запись указателей. В этом и заключается сложность и проблематика. Именно к этому ты и должен был бы прийти. Поэтому это ИМХО очень важный вопрос. ПРАВИЛЬНО ПОЛЬЗОВАТЬСЯ УКАЗАТЕЛЯМИ. Как показывает опыт проблемы кроются именно в этом.
Я пришел к тому, что человек не совсем понимает решение задачи. что некий нерадивый препод по инфораматике в своё время привил уверенность к тому, что в С++ есть двумерные массивы типа m[строка][столбец]
Кхе, кхе. Не кипятись, Джон . В руках держу чУдную книгу (имхо и без рекламы) "Полный справочник по С++ 4-е издание" автор Г. Шилдт. Стоит отметить, что этот товарищ авторитетная личность, но я думаю ты знаешь . Ну так вот, у него есть заголовок "Двухмерные массивы". начинается он так В языке С/С++ предусмотрены многомерные массивы. Простейшим из них является двухмерный. По существу, двухмерный массив - это массив одномерных массивов. ... ... В некоторых языках программирования размерности массивов отделяются запятыми. В отличие от них в языке С/С++ размерности массива заключаются в квадратные скобки.
Думаю, не стоит считать шарлатаном каждого, кто использовал термин "Двухмерный массив" применительно к С/С++ в частности. А то что студент(ка) не въехал в курс дела, это не всегда вина преподавателя. Человек не в состоянии поддерживать сконцетрированное внимание 45 мин. подряд, к тому же если лекция монотонна. Поэтому фраза "двухмерный массив - это массив массивов" могла быть банально упущена студентом (даже при чтении написанного). Ну и бывает, что и препод косячит, но не так это часто случается, особенно на таких этапах.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #23 : 07-05-2006 18:12 » |
|
... перекинь эти топики в темку линк на которую я дал. И в Чаво её родимую.
если бы я знал, как перекинуть отдельные посты (пока жду, когда расскажешь как, взял на заметку тему)
|
|
« Последнее редактирование: 07-05-2006 18:17 от Алексей1153 »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #24 : 07-05-2006 18:18 » |
|
Джон, Кстати. Давно пора данный спор вывести за рамки данного топика и Borrland С++. (голос из-за угла) В Обшение его, в обшение. А лучше всего в тему "ФЛУД 2006"
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #25 : 07-05-2006 18:23 » |
|
Потом, то что ты написал отвлекает от темы А, мешаю. Хорошо, могу подождать, пока до конца не изложат "правду жизни". Тем более строго говоря твои примеры содержат ошибки. Я не позволяю себе публиковать код, который не проверял на работоспособность. А если таковой код всё же публикую, всегда пишу в примечании, что не проверял. Вышеприведённый код гарантированно работает в Borland C++ 3.1, и работает без ошибок, утечек памяти и т.п. вещей. Поэтому давай без наездов - невежливо. Если строго говоря - сперва представь доказательства. Вот так должно быть записано правильное решение
(int** m, int N, int M) Это "традиционная" запись - не отрицаю, но утверждать её как единственную абсолютную истину в последней инстанции несколько... самонадеянно, извини. Такая запись лишь более универсальна для функции, обрабатывающей массивы разных размеров. Лично у меня нет никаких религиозных причин отрицать альтернативные решения, если они уместны при решении задачи.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
nikedeforest
|
|
« Ответ #26 : 07-05-2006 18:28 » |
|
Джон, ты не совсе прав, передавать надо по-разному, смотря что передавать будешь. К примеру void func1(int arr[][4], int n) { ... ... } void main() { int arr[4][4]; func1(arr,4); }
Но если массив динамический, то так уже нельзя передавать. Справделиво и обратное утверждение, т.е. //Как правильно void func1(int **arr, int n, int m) { ... ... } void main() { int **arr; arr=new int *[4]; for(int i=0;i<4;i++) arr[i]=new int [4]; func1(arr,4,4); }
,А вот палево //Как неправильно, здесь мы пАлимся void func1(int arr[4][4]) { ... ... } void main() { int **arr; arr=new int *[4]; for(int i=0;i<4;i++) arr[i]=new int [4]; func1(arr);//компилятор нас ругает
}
И здесь пАлево //Как неправильно, здесь мы пАлимся void func1(int **arr) { ... ... } void main() { int arr[4][4];
func1(arr);//компилятор нас ругает агтс1((int **)arr);//компилятор нас не ругает, но за это мы пАлимся еще круче:) // незаметно для себя :)
}
Думаю смысл понятен.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #27 : 07-05-2006 18:35 » |
|
Все пишут код в меру своего богатого воображения. Только я не совсем уловил сути спора. Объясните хоть, о чем спорим. Может мне тоже понравится. Ох я скажу, скажу........
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
nikedeforest
|
|
« Ответ #28 : 07-05-2006 18:36 » |
|
Сейчас в принципе спора-то и нет, просто мне интересно, следуя такой лдогике, получается что наверное и нет языков, где можно употребить термин "Двухмерные массивы".
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #29 : 07-05-2006 19:01 » |
|
и нет языков, где можно употребить термин "Двухмерные массивы". Не знаю... смотрю книжки по С/С++ - везде говорится о "многомерных массивах". Иные книжки авторитетов, типа Страуструпа, иные - учебники с грифом "Рекомендовано министерством образования". Похоже, отрицание многомерных массивов - это местное частное изобретение, озвученное в этой теме. Вот у Страуструпа в разделе "B.7.3 Передача многомерных массивов" сказано, что, опускать можно лишь первую размерность (так что выше моё утверждение о последней размерности несправедливо). Оно и логично, ибо по смыслу int[][]...[] интерпретируется как массив массивов (...((int[])[])...[]) - где скобки условно обозначают порядок "приложения" размерностей.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #30 : 07-05-2006 19:40 » |
|
Ок, ребят. Вижу желание поспорить. У меня ща времени нет. У меня нет цели доказывать свою правоту - мне это нафиг не надо. Кто хочет моего совета и опыта пожалуйста. Поэтому коротко. Димка зря обижаешься. Где логика? Зачем МНЕ на ТЕБЯ наезжать. Я же сказал, что не хочу никого обижать. И если я говорю ошибка, то значит я вижу ошибку. А доказательства ты бы увидел сам если бы в 102 написал тело ф-ций. Ты не передал в ф-ю размерность массива. В этом ошибка. И дело не в том, что твои решения альтернативны, а в том, что они содержат ошибку. Я понимаю, есть люди, которым это очень тяжело признавать (сам такой). Тем более сам грешу, когда привожу ошибочные примеры (случаи были). Но исправляться никогда не поздно. Твой код в 102 содержит эти ошибки: void f(int a[]) { ... } ... int a[10]; f(a);
void f(int a[10][]) { ... } ... int a[10][10]; f(a);
В ф-ю надо передать размерность, которую потом проверить. Или не так? Как ты собираешься проверить границы массива? Это же элементарно. Об это споткнёшся сразу как только напишешь тело ф-ции - ты этого не сделал. В 110 и 114 ты ловко вывернулся объявив константы. Поэтому был мой 115. Ну и поскольку ты не можешь нормально разговаривать как взрослый человек, а хочешь пообижаться, и видишь в замечаниях только попытку тебя обидеть, я тебе больше отвечать не буду, дабы дальше не обижать. Сорри. Я не обиделся, просто не хочется обижать кого-то вольно, или невольно. Кхе, кхе. Не кипятись, Джон . Может быть и прав. Меня тут аллергия сильно придавила. Уже неделю таблетки принимаю. Башка не работает на 100% - отсюда раздражённость. nikedeforest, ты всё-таки не хочешь понять о чём я говорю? Или просто ещё не до конца представил себе ситуёвину? Я не против термина двумерный многомерный. Тем более, что первое предложение - копия Страуструпа. Ок, раз уж на то пошло - для меня библия С++ - Страуструп. Кто может лучше папы знать своё дитятко? Итак раз уж хочется цитат титанов, их есть у меня. Кстати "почти по Джону" - это тоже шутка. Тем не менее рекомендую прочитать всё: из пункта 2.3.6 Массивы: Многомерные массивы представлены как массивы массивов.
...
Ниже описывается массив из двух элементов, каждый из которых является, в свою очередь, массивом из 5 элементов типа char:
char v[2][5];
Про передачу в ф-ю массива - целый топик: 4.6.5 Параметр-массив Если в качестве параметра функции указан массив, то передается указатель на его первый элемент. Например: int strlen(const char*);
void f() { char v[] = "массив"; strlen(v); strlen("Николай"); }
Это означает, что фактический параметр типа T[] преобразуется к типу T*, и затем передается. Поэтому присваивание элементу формального параметра-массива изменяет этот элемент. Иными словами, массивы отличаются от других типов тем, что они не передаются и не могут передаваться по значению. В вызываемой функции размер передаваемого массива неизвестен. Это неприятно, но есть несколько способов обойти данную трудность. Прежде всего, все строки оканчиваются нулевым символом, и значит их размер легко вычислить. Можно передавать еще один параметр, задающий размер массива. Другой способ: определить структуру, содержащую указатель на массив и размер массива, и передавать ее как параметр (см. также $1.2.5). Например: void compute1(int* vec_ptr, int vec_size); // 1-ый способ
struct vec { // 2-ой способ int* ptr; int size; };
void compute2(vec v);
Сложнее с многомерными массивами, но часто вместо них можно использовать массив указателей, сведя эти случаи к одномерным массивам. Например: char* day[] = { "mon", "tue", "wed", "thu", "fri", "sat", "sun" };
Теперь рассмотрим функцию, работающую с двумерным массивом - матрицей. Если размеры обоих индексов известны на этапе трансляции, то проблем нет: void print_m34(int m[3][4]) { for (int i = 0; i<3; i++) { for (int j = 0; j<4; J++) cout << ' ' << m[i][j]; cout << '\n'; } }
Конечно, матрица по-прежнему передается как указатель, а размерности приведены просто для полноты описания. Первая размерность для вычисления адреса элемента неважна ($R.8.2.4), поэтому ее можно передавать как параметр: void print_mi4(int m[][4], int dim1) { for ( int i = 0; i<dim1; i++) { for ( int j = 0; j<4; j++) cout << ' ' << m[i][j]; cout << '\n'; } }
Самый сложный случай - когда надо передавать обе размерности. Здесь "очевидное" решение просто непригодно: void print_mij(int m[][], int dim1, int dim2) // ошибка { for ( int i = 0; i<dim1; i++) { for ( int j = 0; j<dim2; j++) cout << ' ' << m[i][j]; cout << '\n'; } }
Во-первых, описание параметра m[][] недопустимо, поскольку для вычисления адреса элемента многомерного массива нужно знать вторую размерность. Во-вторых, выражение m[i ][j] вычисляется как *(*(m+i)+j), а это, по всей видимости, не то, что имел в виду программист. Приведем правильное решение: void print_mij(int** m, int dim1, int dim2) { for (int i = 0; i< dim1; i++) { for (int j = 0; j<dim2; j++) cout << ' ' << ((int*)m)[i*dim2+j]; // запутано cout << '\n'; } }
Выражение, используемое для выбора элемента матрицы, эквивалентно тому, которое создает для этой же цели транслятор, когда известна последняя размерность. Можно ввести дополнительную переменную, чтобы это выражение стало понятнее: int* v = (int*)m; // ... v[i*dim2+j]
Топика "Многомерные массивы" я не нашёл. Наверно Страуструп не читал Шилдта (ЭТО ШУТКА!!!) Кстати ф-я print_mij это практически то, что надо Carrie Bradshaw. Ещё одно доказательство. Только судя по всему это нафиг никому не надо. Лёш, в иконках самая правая - разделить тему. Там выберешь - "выбрать топики". Перекидываешь в правое которые надо. Потом выбираешь цель-тему. Ну соответственно параметры название темы, известить и тд - разберёшься Лучше потренируйся на парочке тестовых тем, "Чтобы не было мучительно больно" Вить, согласен, но споров больше не будет. Во всяком случае с моей стороны. Я уже сказал - я не теоретик, красиво говорить не умею (может в этом всё проблема?), а своим опытом поделюсь с каждым кто в нём нуждается. Если руки дойдут я сам всё перенесу, кстати там в той теме тоже надо флуд подчистить.
|
|
« Последнее редактирование: 04-12-2007 19:39 от Алексей1153++ »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #31 : 07-05-2006 19:47 » |
|
nikedeforest, я думаю на твой "не совсем прав" - я уже ответил.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #32 : 07-05-2006 20:07 » |
|
Твой код в 102 содержит эти ошибки: Какой же это код? Это схема кода - концепция. Там лишь ошибка в не той неопределённой размерности для двумерного массива. Твои слова про код я отнёс к последнему коду - пост #114. Вот там код. В ф-ю надо передать размерность, которую потом проверить. Или не так? Как ты собираешься проверить границы массива? Это же элементарно. Об это споткнёшся сразу как только напишешь тело ф-ции - ты этого не сделал. Размерности могут передаваться через глобальные переменные или константы, определяться в define'ах. Так что не стоит устраивать "охоты на ведьм" и ловить "ловкачей" за руки. Будто тебя здесь кто-то намеренно пытается обмануть. Смотри лишь на то, что написано, и не "додумывай" от себя. Приведённая в #102 схема отнюдь не преследовала цель продемонстрировать готовое и предназначенное к компиляции, да ещё ко всему прочему элегантное и универсальное решение, а просто описание массива как параметра функции.
|
|
« Последнее редактирование: 06-12-2007 18:08 от Алексей1153++ »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #33 : 04-06-2008 15:34 » |
|
Здравствуйте уважаемые программисты завис над задачей в двух файлах содержатся матрицы в третий файл записать результат умножения этих матриц, первая матрица размерность m*n , вторая n*k массивы выделить динамически
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #34 : 04-06-2008 16:18 » |
|
щас подумаем
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #35 : 04-06-2008 16:44 » |
|
примерно так у меня вышло (компилировал, но не отлаживал, предоставляю тебе ) //структура для временного массива struct s_Buffer { double* m_pBuf; DWORD m_xmax; DWORD m_ymax;
s_Buffer(DWORD xmax,DWORD ymax) { m_pBuf=0; m_xmax=0; m_ymax=0;
DWORD dwdLen=xmax*ymax; if(!dwdLen)return;
m_pBuf=new double[dwdLen];
if(!m_pBuf)return;
m_xmax=xmax; m_ymax=ymax; }
~s_Buffer() { if(m_pBuf) { delete [] m_pBuf; m_pBuf=0; } }
inline double* get_x_y(DWORD x_zb,DWORD y_zb) { if(x_zb<m_xmax && y_zb<m_ymax) { return &m_pBuf[y_zb*m_xmax+x_zb]; } else { return 0; }
}
};
int main() { DWORD m=10; DWORD n=5; DWORD k=30;
//M1 .---n----- // m| // | //
//M2 .---k-- // n| // | //
//M3 .---m-- // k| // | //
s_Buffer M1(m,n); s_Buffer M2(n,k); s_Buffer M3(k,m);
DWORD dwdm; DWORD dwdk; DWORD dwdn; if(M1.m_pBuf && M2.m_pBuf && M3.m_pBuf) { for(dwdm=0;dwdm<m;dwdm++) { for(dwdk=0;dwdk<m;dwdk++) { double dSum=0;
for(dwdn=0;dwdn<n;dwdn++) { dSum+= *M1.get_x_y(m,n) * *M2.get_x_y(n,k); }
*M3.get_x_y(m,k)=dSum; } } } }
|
|
« Последнее редактирование: 04-06-2008 16:46 от Алексей1153++ »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #36 : 04-06-2008 17:02 » |
|
Алексей1153++, ужас какой... надо так require 'mathn'
def loadMatrix(fileName) rows = Array.new for line in File.open(fileName) do row = line.split.map do | item | item.to_i end rows.push(row) end return Matrix.rows(rows) end
def saveMatrix(matrix, fileName) File.open(fileName, 'w') do | stream | for row in matrix.to_a do stream.puts(row.join(' ')) end end end
saveMatrix(loadMatrix(ARGV[0]) * loadMatrix(ARGV[1]), ARGV[2])
|
|
« Последнее редактирование: 04-06-2008 17:32 от dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #37 : 04-06-2008 17:05 » |
|
dimka,
|
|
|
Записан
|
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #39 : 05-06-2008 16:03 » |
|
в общем алгоритм знаю, но у меня загвоздка, нужно из файла считать в линейный массив целые числа матрицы, количество чисел заранее неизвестно, он мне почемуто через одно число считывает можнте подсказать, где ошибка б, вот код :
#include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdio.h> void main () { FILE *f1;//,*f2,*f3; int i=0,j=0,ch=0,b=0,k=0,**str1,**str2,a1[100]={0},*a2; clrscr(); if ((f1=fopen("c:/1.dat","r"))==NULL) { perror("1.dat");
} //f2=fopen("d:\2.txt","r"); //f3=fopen("d:\3.txt","w");
//ch=getc(f1); while(fscanf(f1,"%d",&ch)!=EOF) //for(b=0;b<10;b++) { fscanf(f1,"%d",&ch);
a1=ch; i++; } //cout<<i; for(b=0;b<i;b++) cout<<a1; fclose(f1); getch(); }
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #40 : 05-06-2008 16:04 » |
|
код помятый, но все же
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #41 : 05-06-2008 16:06 » |
|
alliance, так ты его отредактируй - оберни код тегами [code]....[/code].
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #42 : 05-06-2008 16:12 » |
|
#include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdio.h> void main () { FILE *f1; int i=0,j=0,ch=0,b=0,k=0,**str1,**str2,*a1={0},*a2; clrscr(); if ((f1=fopen("c:/1.dat","r"))==NULL) { perror("1.dat"); }
while(fscanf(f1,"%d",&ch)!=EOF) { fscanf(f1,"%d",&ch); a1[i]=ch; i++; } for(b=0;b<i;b++) cout<<a1[b]; fclose(f1); getch(); }
|
|
« Последнее редактирование: 05-06-2008 16:19 от alliance »
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #43 : 05-06-2008 17:29 » |
|
alliance, Проблема в том, что ты один раз читаеш числа для проверки конца файла, а второй раз внутри цикла, вот там твое "через одно" и возникает.
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #44 : 05-06-2008 17:42 » |
|
а как нужно ? исправь пожалуйста
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #45 : 05-06-2008 17:59 » |
|
ну как-то так #include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdio.h> void main () { FILE *f1; int i=0,j=0,ch=0,b=0,k=0,**str1,**str2,a1[ 100 ]={0},*a2; clrscr(); if ((f1=fopen("c:/1.dat","r"))==NULL) { perror("1.dat"); return; }
while(!feof(f1)) { fscanf(f1,"%d",&ch); a1[i]=ch; i++; } for(b=0;b<i;b++) cout<<a1[b]; fclose(f1); getch(); }
Да и вообще с такими задачами тебе либо надо основательно разбирать работу с памятью, потому что сейчас у тебя все будет работать до того момента пока количество чисел не перевалит за 100, либо изучай стандартные STL-евские контейнеры типа vector
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #46 : 05-06-2008 18:25 » |
|
#include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdio.h> #include <math.h> #include <stdlib.h> void main () { FILE *f1,*f2; int i=0,j=0,ch1=0,ch2=0,b=0,k=0,c=0,**str1,**str2,*a1={0},*a2={0},**str3={0},sum=0,i1=0,j1=0; clrscr();
if ((f1=fopen("c:/1.dat","r"))==NULL) { perror("1.dat"); }
if ((f2=fopen("c:/2.dat","r"))==NULL) { perror("2.dat"); }
while(!feof(f1)) { fscanf(f1,"%d",&ch1); a1[i1]=ch1; i1++; } i=i1-1;
str1=new *[i]; for(b=0;b<i;b++) str1[b]=new [i]; cout<<"perwaya matrica : \n";
for(b=0;b<sqrt(i);b++) for(k=0;k<sqrt(i);k++) { str1[b][k]=a1[c]; c++; } for(b=0;b<sqrt(i);b++) { cout<<"\n"; for(k=0;k<sqrt(i);k++) cout<<str1[b][k]<<" "; }
cout<<"\n";
while(!feof(f2)) { fscanf(f2,"%d",&ch2); a2[j1]=ch2; j1++; } j=j1-1;
if(i!= j) { cout<<" fatal error "; exit(0); }
str2=new *[j]; for(b=0;b<j;b++) str2[b]=new [j]; c=0; cout<<"\n"; cout<<"wtoraya matrica : \n"; for(b=0;b<sqrt(j);b++) for(k=0;k<sqrt(j);k++) { str2[b][k]=a2[c]; c++; }
for(b=0;b<sqrt(j);b++) { cout<<"\n"; for(k=0;k<sqrt(j);k++) cout<<str2[b][k]<<" "; }
str3=new* [j]; for(b=0;b<j;b++) str3[b]=new [j]; c=0;
for(i=0;i<3;i++) { sum=0; for(k=0;k<3;k++) { sum=0; for(j=0;j<3;j++) { sum=sum+(str1[i][j]*str2[j][k]); } str3[i][k]=sum; } } cout<<"\n";
cout<<"\n"; cout<<"proiswedenie matric : \n"; for(i=0;i<3;i++) { cout<<"\n"; for(k=0;k<3;k++) cout<<str3[i][k]<<" "; }
fclose(f1); fclose(f2);
getch(); }
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #47 : 05-06-2008 18:26 » |
|
Доделал, спасибо за подсказки
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #48 : 05-06-2008 20:24 » |
|
str2=new *[j]; for(b=0;b<j;b++) str2[b]=new [j]; подскажите, как память освободить
|
|
« Последнее редактирование: 06-06-2008 06:34 от alliance »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #49 : 06-06-2008 05:49 » |
|
Осторожнее с feof() !!! Эта ф-ия возвращает корректное значение только после операции чтения. Т.е., если ниодной операции не было и файл пустой, то будет ошибочное чтение.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #50 : 06-06-2008 06:37 » |
|
у меня например 9 чисел фйле, он их выводит, но счетчик показывает 10 чисел
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #51 : 06-06-2008 06:39 » |
|
#include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdio.h> #include <math.h> #include <stdlib.h> void main () { FILE *f1,*f2; int i=0,j=0,ch1=0,ch2=0,b=0,k=0,c=0,**str1={0},**str2={0},*a12={0},*a22={0},**str3={0},sum=0,i1=0,j1=0; int symbol; float a1,b1,c1,a2,b2,c2; double x,y; m1:
clrscr(); cout<<" 1 - SYSTEM OF LINE EQUATIONS \n 2 - MULTIPLICATION OF MATRIXES \n 0 - EXIT"; cout<<"\nINSERT MENU ITEM: "; cin>>symbol; switch (symbol) { case 2 :
if ((f1=fopen("c:/1.dat","r"))==NULL) { perror("1.dat"); }
if ((f2=fopen("c:/2.dat","r"))==NULL) { perror("2.dat"); }
while(!feof(f1)) { fscanf(f1,"%d",&ch1); a12[i1]=ch1; i1++; } i=i1-1;
str1=new *[i]; for(b=0;b<i;b++) str1[b]=new [i]; cout<<"FIRST MATRIX (A): \n";
for(b=0;b<sqrt(i);b++) for(k=0;k<sqrt(i);k++) { str1[b][k]=a12[c]; c++; } for(b=0;b<sqrt(i);b++) { cout<<"\n"; for(k=0;k<sqrt(i);k++) cout<<str1[b][k]<<" "; }
cout<<"\n";
while(!feof(f2)) { fscanf(f2,"%d",&ch2); a22[j1]=ch2; j1++; } j=j1-1;
if(i!= j) { cout<<" FATAL ERROR!\n"; cout<<"\nPRESS ANY KEY FROM BACK TO MAIN MENU!"; getch(); goto m1; }
str2=new *[j]; for(b=0;b<j;b++) str2[b]=new [j]; c=0; cout<<"\n"; cout<<"SECOND MATRIX (B): \n"; for(b=0;b<sqrt(j);b++) for(k=0;k<sqrt(j);k++) { str2[b][k]=a22[c]; c++; }
for(b=0;b<sqrt(j);b++) { cout<<"\n"; for(k=0;k<sqrt(j);k++) cout<<str2[b][k]<<" "; }
str3=new* [j]; for(b=0;b<j;b++) str3[b]=new [j]; c=0;
for(i=0;i<sqrt(j);i++) { sum=0; for(k=0;k<sqrt(j);k++) { sum=0; for(b=0;b<sqrt(j);b++) { sum=sum+(str1[i][b]*str2[b][k]); } str3[i][k]=sum; } } cout<<"\n";
cout<<"\n"; cout<<"RESULT MATRIX (A*B): \n"; for(i=0;i<sqrt(j);i++) { cout<<"\n"; for(k=0;k<sqrt(j);k++) cout<<str3[i][k]<<" "; }
fclose(f1); fclose(f2); cout<<"\n"; cout<<"\nPRESS ANY KEY FROM BACK TO MAIN MENU!"; getch(); goto m1; break;
case 1:
cout<<"DESCRIBE THE FIRST EQUATION OF SYSTEM:\n"; cout<<"\nA1="; cin>>a1; cout<<"B1="; cin>>b1; cout<<"C1="; cin>>c1; cout<<"\nDECRIBE THE SECOND EQUATION OF SYSTEM:"<<endl; cout<<"\nA2="; cin>>a2; cout<<"B2="; cin>>b2; cout<<"C2="; cin>>c2;
if ((a1*b2-b1*a2)!=0) { x=(c1*b2-b1*c2)/(a1*b2-b1*a2); y=(a1*c2-c1*a2)/(a1*b2-b1*a2); cout<<endl<<"THE EQUATION HAS ONE DECISION:\n"; cout<<"\nX="<<x; cout<<"\nY="<<y;
} else { if (((c1*b2-b1*c2)==0)&&((a1*c2-c1*a2)==0))
cout<<endl<<"THE SYSTEM HAS INFINITE SET OF DECISIONS!";
if ((((c1*b2-b1*c2)!=0)&&((a1*c2-c1*a2)==0))||(((c1*b2-b1*c2)==0)&&((a1*c2-c1*a2)!=0))||(((c1*b2-b1*c2)!=0)&&((a1*c2-c1*a2)!=0)))
cout<<"THE SYSTEM HAS NOT DECISIONS!\n"; } cout<<endl<<endl<<"PRESS ANY KEY FROM BACK TO MAIN MENU!"; getch(); goto m1;
break; case 0: exit(0); }
getch(); }
как мне освободить память ? а то если жму 2 раза 2 он выделяет вхолостую и выводит мусор
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #52 : 06-06-2008 08:58 » |
|
alliance, А етот код вообще компилируется? Ато меня не очень впечатляют конструкции типа хотя может по стандарту он заменяет такие "пустоты" на int... Но ето надо спросить у знатоков стандарта... а вот тут while(!feof(f1)) { fscanf(f1,"%d",&ch1); a12[i1]=ch1; i1++; }
программа, по-моему, вообще должна была упасть, причем весьма красиво.
|
|
« Последнее редактирование: 06-06-2008 09:03 от Sands »
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #53 : 08-06-2008 17:38 » |
|
Все компилируется и работает прекрасно )
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #54 : 08-06-2008 17:39 » |
|
а как тогда написать выделение памяти для двумерного массива и ее освобождение с помощью new\delete ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #55 : 08-06-2008 17:43 » |
|
а как тогда написать выделение памяти для двумерного массива и ее освобождение с помощью new\delete ?
//выделение int* array=new int[Xdim*Ydim];
......
//удаление if(array) { delete [] array; array=0; }
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #56 : 08-06-2008 20:01 » |
|
вопрос тогда как через указатель обращаться к двумерному массиву ?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #57 : 09-06-2008 01:27 » |
|
alliance, а может всё-таки уже откроешь книжку и почитаешь теорию? Или хотя бы внмательно сообщения в этой теме. Там есть все ответы на твои вопросы. Тем более, что эта формула приведена на этой странице как минимум два раза, причём один раз в ответе тебе. Будть внимательней.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #58 : 09-06-2008 03:34 » |
|
alliance, да, кстати, пост №35 , метод get_x_y() )))
|
|
|
Записан
|
|
|
|
alliance
Постоялец
Offline
|
|
« Ответ #59 : 09-06-2008 08:09 » |
|
автора не подскажете для начинающего ? Подбельский о си пишет, я по Лафорье читал , но там нету такого, Дейтел слишком много непонятной воды.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #60 : 09-06-2008 08:13 » |
|
Я изучал по Дейтелам. Нормально пишут. Да они много раз повторяют некоторые веши, но это нужно.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #61 : 09-06-2008 08:50 » |
|
автора не подскажете для начинающего ? ... и продолжающего - Страуструп.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|