Xianor Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 (изменено) #include "stdafx.h" #include <iostream> #include <time.h> using namespace std; int i,j; int l; void rmatr(int **mas,int p) // хочу забивать матрицу рандомом, правильно я написал? и растолкуйте как работает srand {srand(time(NULL)); l=0+rand()%20; for (i=0; i<p; i++) {for(j=0;j<p;j++) {mas[i][j]=l;};};} void vershini(double p) {cout<<"Vvedite k-vo vershin"; cin>>p;} void main () { const int n=100; int S,k,q; int D [n][n]; cout<<"Esli hotite random graf vvedite 1\n"; cin>>q; if(q==1) {vershini(S); rmatr(D[n][n],S);}; // как записывать рандом матрицу в D[n][n] ? cout<<"Znaete li vi pravila vvoda grafa? Esli da, vvedite 1 "; cin>>q; vershini(S); if (q==1) {for (i=0; i<S; i++) {for (j=0; j<S; j++) {cout << "Vvedite D [" << i <<"][" << j <<"] element="; cin >> D [i][j];};};} else {cout<<"rassto9nie ot vershini k samoi sebe = 0 \n"; for (i=0; i<S; i++) {for (j=0; j<S; j++) {cout << "Vvedite D [" << i <<"][" << j <<"],\ngde rassto9nie ot versini[" << i <<"] k vershine[" << j <<"] "; cin >> D [i][j];};};} cout<<"\n\n"; cout<<"Graf imeet vid:\n"; for (i=0; i<S; i++) { for (j=0; j<S; j++) {cout<<D[i][j]<<" ";} cout<<"\n\n";}; for (i=0; i<S; i++) {for (j=0; j<S; j++) {if (D[i][j]==D[i][i]) {D[i][j]=0;};};} cout<<"\n\n"; for (i=0; i<S; i++) {for (j=0; j<S; j++) {cout<<D[i][j]<<" ";} cout<<"\n\n";}; cout<<"\n\n"; cout<<"Graf posle vi4islenii"; for (i=0; i<S; i++) {for (j=0; j<S; j++) {cout<<D[i][j]<<" ";} cout<<"\n\n";}; cin>>S; }; Изменено 1 мая, 2011 пользователем Honor Ссылка на комментарий Поделиться на другие сайты Поделиться
Su Suum Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 [head] [front=456] [size=1357] моск >.< [/size] [/front] [/head] Ссылка на комментарий Поделиться на другие сайты Поделиться
Нагибатор_из_Сибири Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 немного флуда,но язык c# по мойму намного лучше и легче Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 1 мая, 2011 Автор Поделиться Опубликовано 1 мая, 2011 Ля... Пхп проще, а курсач нужно писать на с++ ) а у меня проблема с ф-ями и массивамиПрошу помощи.ПС. Плз только без передачи двумерного массива с помощью указателей в одномерном, ибо это мне не дано понять вообще наверн ) Ссылка на комментарий Поделиться на другие сайты Поделиться
Нагибатор_из_Сибири Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 когда у меня похожие проблему я иду на кафедру свою или чужую и прошу помощу у преподов,которых хорошо знают сходи лучше на консультацию,там тебе больше помогут чем тут Ссылка на комментарий Поделиться на другие сайты Поделиться
Zine Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 Обратись к ПИ они помогут) Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 ща сидр и пиво допью, помогу. Че на кафедры ходить, у нас чтоль прогеров на плюсах нету?)) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 1 мая, 2011 Автор Поделиться Опубликовано 1 мая, 2011 Жду ) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 1 мая, 2011 Автор Поделиться Опубликовано 1 мая, 2011 где великие программеры на с++? -_- или хотя бы кто то Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 Было много пива и еще сидр. Такшта начинаю курить твою проблему. Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 немного флуда,но язык c# по мойму намного лучше и легчеНе надо провоцировать на холивар. Один язык для одного, другой для другого. Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 (изменено) Как этот код должен был выглядеть#include "stdafx.h" #include <iostream> #include <time.h> using namespace std; int i,j, l; void rmatr(int **mas, int p) // хочу забивать матрицу рандомом, правильно я написал? и растолкуйте как работает srand { srand( time(NULL) ); l = 0 + rand()%20; for (i = 0; i < p; i++) for(j = 0; j < p; j++) mas[i][j]=l; } void vershini(double p) { cout << "Vvedite k-vo vershin"; cin >> p; } void main () { const int n = 100; int S, k, q; int D[n][n]; cout << "Esli hotite random graf vvedite 1\n"; cin >> q; if (q == 1) { vershini(S); rmatr( D[n][n], S); } // как записывать рандом матрицу в D[n][n] ? cout<<"Znaete li vi pravila vvoda grafa? Esli da, vvedite 1 "; cin>>q; vershini(S); if (q == 1) for (i = 0; i < S; i++) for (j = 0; j < S; j++) { cout << "Vvedite D [" << i <<"][" << j <<"] element="; cin >> D [i][j]; } else { cout<<"rassto9nie ot vershini k samoi sebe = 0 \n"; for (i = 0; i < S; i++) for (j = 0; j < S; j++) { cout << "Vvedite D [" << i <<"][" << j <<"],\ngde rassto9nie ot versini[" << i <<"] k vershine[" << j <<"] "; cin >> D [i][j]; } } cout << "\n\n"; cout << "Graf imeet vid:\n"; for (i = 0; i < S; i++) { for (j = 0; j < S; j++) cout<<D[i][j]<<" "; cout<<"\n\n"; } for (i = 0; i < S; i++) for (j = 0; j < S; j++) if (D[i][j] == D[i][i]) D[i][j] = 0; cout << "\n\n"; for (i = 0; i < S; i++) { for (j = 0; j < S; j++) cout << D[i][j] << " "; cout << "\n\n"; }; cout << "\n\n"; cout << "Graf posle vi4islenii"; for (i = 0; i < S; i++) { for (j = 0; j < S; j++) cout << D[i][j] << " "; cout << "\n\n"; } cin >> S; }1. Первое - код пишется красиво. Не для того, чтобы на него по вечерам дрочить, а чтобы его можно было понять. Я твой код 10 минут приводил в порядок(тупо форматировал отступы), чтобы его можно было спокойно прочитать. Сам когда собственные коды годичной давности откроешь - охуеешь. Учись СРАЗУ писать нормально. Я тебе выше привел пример того, как этот код будет выглядеть в GNU-стиле(форум может гробить размер отступов, каждый отступ 4 символа(1 таб)).2. После закрывающей скобки блока(фигурной) не ставится точка с запятой - это пустой операнд получается, он нахер не нужен.3. Если цикл for или условный оператор if состоит только из 1 операнда, не стоит всегда делать блок фигурных скобок - такое "явное" обозначение куска кода должно быть обосновано. 4. Давай переменным говорящие имена. Не S, p, b, k l, а Matrix, Size, temp и т.д. Не знаешь английского - учи и делай их транслитом пока не знаешь. Но учить обязательно. 5. Что делает функция void vershini(double p)? Я так понимаю, что ты хотел, что бы эта функция давала пользователю возможность ввести количество вершин. При твоем объявлении функции переменная передается по значению, т.е. создается ее копия и ее значение передается в функцию. Все, что происходит с переменной double p внутри функции НИКАК не отразится на переменной S, значение которой в функцию передается. Если ты хотел, чтобы в S оказалось то, что вводит пользователь в функции, тебе надо было или возвращать это значение функцией, или передавать переменную по ссылке, чтобы можно было ее менять. В твоем случае получается, что объявляется переменная S, которая остается неинициализированной, и ее значение(случайное, т.к. она не инилиацлизирована) передается в функицю rmatr(). 6. Зачем при задании случайного числа ты прибавляешь его к нулю? В чем логика? l = 0 + rand()%20; эквивалентно l = rand()%20;Работу функции rand(); курить тут: http://www.cplusplus.com/reference/clibrary/cstdlib/rand/srand(); генерирует стартовое случайное число основываясь на передаваемом ей параметре. О мелких деталях курить по ссылке что я дал выше. У тебя неправильно заполняется матрица - она заполняется одним случайным числом, а не каждая ячейка своим. Если ты хотел каждую чейку случайным числом заполнить, то присваивание переменной l случайного числа надо было в цикл пихать.7. Дальнейший смысл вычислений от меня ускользнул, ибо отсутствие комментариев или постановки задачи превращает понимание этого в мазохизм, чем я не увлекаюсь. 8. Для того, чтобы считать одно число или заполнить матрицу рандомом функция не нужна. Тем более, что вызывается она(rmatr) один раз.9. З.ы. как ты в double собрался число вершин графа считать? Ваще понимаешь о чем речь?)))10. З.з.зы. С отступами на форуме вроде все ок. И да, если у тебя переменная в функции константа - в твоем случае имеет смысл ее сделать через дефайн #define BUF 100Отдельно хочется пожелать выучить таки динамические массивы, это проще, чем кажется Изменено 1 мая, 2011 пользователем Хильмек ру Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 1 мая, 2011 Автор Поделиться Опубликовано 1 мая, 2011 спс что расписал. По поводу функции, тольку учусь их использовать. По поводу void vershini, как это возвращать? return p или return s? И как передать по ссылке(комманду знаю, но не понимаю нахоно надо и чем ссыылка от указателя отличается)? 9. З.ы. как ты в double собрался число вершин графа считать? Ваще понимаешь о чем речь?))) Всмысле? о_О#define BUF 100 впервые вижу. У тебя неправильно заполняется матрица - она заполняется одним случайным числом, а не каждая ячейка своим. Если ты хотел каждую чейку случайным числом заполнить, то присваивание переменной l случайного числа надо было в цикл пихать. ээээ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 1 мая, 2011 Поделиться Опубликовано 1 мая, 2011 Функция может возвращать значение. Например, int func(){return 5;} i = func(); В i будет 5, как несложно догадаться. Можно делать так - т.е. присваиваешь S значение функции ввода(в функции ввода читаешь что пользователь ввел и возвращаешь) и потом уже вызываешь rmatr(blabla, S). Можно передать по ссылке, об этом почитай у Шилдта, я ниже ссылку дам. Можно ваще передать указатель на переменную. Тоже у Шилдта. double - тип данных вещественного числа двойной точности. (float - одинарная). Иными словами - это для дробных, не целых чисел. Число вершин может быть дробным? нет, значит тип должен быть int(integer - целое) #define BUF 100директива препроцессора, которая на этапе обработки кода ДО компиляции заменяет в тексте везде BUF на 100. Зачем тебе заводить отдельную переменную статическую, тратить память? Раз уж массив делаешь статическим - делай его константного размера, переменная не нужна. У тебя сейчас как делается - есть матрица 100x100. ты вычисляешь случайное число от 1 до 20 (предположим, получилось 7) и после этого в цикле запихиваешь это число в матрицу - любая ячейка в пределах цикла будет иметь значение 7.Если ты хочешь заполнить матрицу случайными числами - то вычисление случайного числа должно быть в цикле непосредственно перед заполнением матрицы: for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) matrix[j] = rand() % 20; и заметь, ты экономишь таким образом еще одну переменную. Вообще, рекомендую прочитать справочник Герберта Шилдта по С++, он отлично пишет и понятен, в отличие от того же Страуструпа. Каждую вещь, которую не понимаешь надо искать и читать и понимать. Иначе дальше плохо работающего калькулятора не уедешь)) З.ы. Справочник такой:http://www.kodges.ru/74410-polnyj-spravochnik-po-c.htmlНе самоучитель! З.з.ы. Чуть не забыл - выкинь stdafx.h, он нужен только для вижуал студии, если поставлена галочка use precompiled headers. Старайся писать по максимуму на чистом C++ без привязки к платформе или среде - проще будет потом. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 2 мая, 2011 Автор Поделиться Опубликовано 2 мая, 2011 (изменено) Ох ссылочка полезная ))Огромное Спасибо за всё!! Ля. не понимаю как передавать массив через ф-цию без указателя или ссылки, напишите плз?) Изменено 2 мая, 2011 пользователем Honor Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 2 мая, 2011 Поделиться Опубликовано 2 мая, 2011 Сам массив передать в функцию нельзя, можно только указатель на него. int a[10]; // пусть мы уже его чем то заполнили int func(int *i); // указательint func(int i[]); // указатель на массив неопределенного размераint func(int i[10]);// указатель на массив из 10 элементовint func(int i[24]);// указатель на массив из 24 элементов func(a); Все три определения функции эквивалентны, т.к. в функцию передается указатель на 1-ый элемент массива. Соотв. все изменения в функции ИЗМЕНЯТ сам массив. И не важно, какое число указано в скобках - это ни на что не влияет. Кури книжку что я показал, там все это разжевано буквально в первых 100 страницах Ссылка на комментарий Поделиться на другие сайты Поделиться
100 Опубликовано 3 мая, 2011 Поделиться Опубликовано 3 мая, 2011 "Ага. Я тоже раньше так думал - "знание Basic не помешает", потом "знание Pascal не помешает", потом "знание C++ не помешает", потом "знание PHP+MySQL не помешает", потом "знание ASP не помешает", потом "знание Win2003 Server не помешает", потом "знание FreeBSD не помешает". А теперь я 21-летний дядько, сам живу в серверной, прячу в сервере пиво, ношу с собой оружие - бубен, лечу принтеры наложением рук, а сам мечтаю о мировом господстве и някаю на задержавшихся допоздна на работе сотрудников =)" Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 3 мая, 2011 Поделиться Опубликовано 3 мая, 2011 ггг))) Бейсик страшное зло)))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 5 мая, 2011 Автор Поделиться Опубликовано 5 мая, 2011 пытался юзать глобальные переменнные, что бы без указателей, типо выполнилось в ф-ции и сохранилось. Болт. проштудировал темы с ф-ями и указателями - понял насколько я туп, Сделал вывод - забить болт на передачу двумерного массвива в ф-цию. Буду спецом с паяльником И Вообще, те проги которые пишем мы, можно написать в 2 раза короче без использования ф-ции и онанизма на указатели... Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 5 мая, 2011 Поделиться Опубликовано 5 мая, 2011 Поздравляю. Ты сделал первый шаг к становлению быдлокодером и написанию своего первого действительно хуевого кода Глобальные переменные штука особая, использовать ее надо с осторожностью. Я редко видел случаи, где они очень были нужны. Двумерный массив в функцию передается как любой другой. Внутри обращаешься как к двумерному массиву - это все есть у Шилдта. Если ты не научишься в простых прогах использовать указатели и функции - ты никогда не научишься нормально программировать. Кроме как читать Шилдта (всего, не ограничиваясь нужными главами) могу порекомендовать еще разве что Кернигана и Ричи, но лично мне они помогли мало. Читай чужой код, как можно больше. И пиши свой, как можно больше. Другого пути научиться нет. З.ы. Когда я начинал, я не мог понять, что такое "int *p". Долго. Такшта через это проходят все. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 5 мая, 2011 Автор Поделиться Опубликовано 5 мая, 2011 Пересолил картошку, бля. Да буду штудировать и у препода спрошу, мб на пальцах объяснят. Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 5 мая, 2011 Поделиться Опубликовано 5 мая, 2011 Попробуй использовать карточки. Или листочки. Это - переменная, это ссылка. Важно воткнуть, что есть данные, а что есть ссылка на них. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 5 мая, 2011 Автор Поделиться Опубликовано 5 мая, 2011 int A[5][5]={8, 2, 3, 6, 1, 4, 5, 6, 7, 2, 7, 8, 6, 5, 3, 0, 1, 1, 4, 9, 2, 9, 2, 7, 2}; int *p[5]; // указатель на массив [5] типа инт. Правильно? for (int i=0; i<5; i++) {p[i]=*&A[i];} // что тут происходит? -_- Ссылка на комментарий Поделиться на другие сайты Поделиться
Хильмек ру Опубликовано 5 мая, 2011 Поделиться Опубликовано 5 мая, 2011 Неправильно. int A[5][5] - ты создаешь массив 5х5 интов(целочисл.). В памяти он располагается как одномерный массив, т.е. как последовательность интов. A - это указатель на массив. Точнее, на его первый элемент. В A хранится адерс. * - оператор разыменовывания указателя, т.е. взятия данных по адресу. *A - взять данные, которые лежат по адресу, написанному в А, т.е. первый элемент массива. Т.е. *А = 8. Поскольку массив расположен в памяти последовательно, то *(A+1) - второй элемент массива, 2. И т.д. Здесь +1 означает +1 элемент, а не +1 к адресу.& - оператор взятия адреса. Т.е. &А - адрес переменной А, в которой хранится адрес первого элемента массива. Если представить, что у тебя есть пронумерованные листочки - ячейки памяти, и на них есть записи. На первом листочке написано - 8. На втором - 2. На десятом листочке, к примеру, написано "первый листочек". Т.е. 1 и 2 листок хранят данные - цифры, а 10-ый - адрес. Теперь разберем что у тебя написано дальше.int *p[5] - создается массив. Массив типа int*, т.е. массив указателей на целочисленные переменные. Тип указателя говорит только о том, какие данные хранятся по адресу в указателе. Сам указатель всегда число. Т.е. ты можешь сделать указатель char* на символ и указатель на число int* и присвоить одно другому. В примере с карточками указатель был бы карточкой "число на 1-ой карточке" или "символ на 1-ой карточке". Карточка остается карточкой, вопрос только в том, как ты будешь понимать данные с 1-ой карточки, как число или как символ. итак, массив указателей на инты. далее цикл, в цикле (отступление - зачем фигурные скобки? у тебя 1 оператор. кроме того, что скобки нечитабельны и создают кашу)в цикле чудо оператор p=*&A;p - это i-ый указатель из массива. A - это i-ый элемент массива объявленного выше. Эквивалентно *(A+i)&A - адрес i-ого элемента массива.*&A - данные, которые лежат по адресу i-ого элемента массива. Бинго, это и есть сам i-ый элемент массива. Т.е. ты указателю(где должен храниться адрес) присваиваешь само значение. Что есть неверно. Указатель на массив - это само имя массива. Т.е. A. отдельно его объявлять не надо. Кури Шилдта, у него это оч подробно разобрано Ссылка на комментарий Поделиться на другие сайты Поделиться
Xianor Опубликовано 5 мая, 2011 Автор Поделиться Опубликовано 5 мая, 2011 хм. тогда p[25] должен быть? как в массив с 5 э-тов поместятся 25? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти