Вторник, 03.12.2024, 10:12 | Главная | Регистрация | Вход |
|
помощь - Форум
помощь
| |
Ariant11 | Дата: Пятница, 06.11.2009, 21:55 | Сообщение # 1 |
Сержант
Группа: Проверенные
Сообщений: 20
Статус: Offline
| Как выяснилось, у многих имеются проблемы с лабами по с++, да и пониманием самого языка. Поступило предложение помогать своим хотя бы с лабами. Предлагаю заинтересовавшимся в теме выкладывать свои идеи или нерабочие программы, остальным же пытаться помочь или заполнить свои пробелы в знаниях.
|
|
| |
noise | Дата: Суббота, 07.11.2009, 11:41 | Сообщение # 2 |
Лейтенант
Группа: Проверенные
Сообщений: 54
Статус: Offline
| ты просто робин гуд ^_^ ну давайте, go ahead
|
|
| |
ALTer | Дата: Среда, 11.11.2009, 00:27 | Сообщение # 3 |
Подполковник
Группа: Проверенные
Сообщений: 107
Статус: Offline
| ну я буду первым... Объясни или кинь ссылочку на книгу что такое **?
Закон Паркинсона: первые 90% кода отнимают 90% времени. Оставшиеся 10% кода отнимают вторые 90%.
|
|
| |
Ariant11 | Дата: Среда, 11.11.2009, 01:26 | Сообщение # 4 |
Сержант
Группа: Проверенные
Сообщений: 20
Статус: Offline
| Кхм) Указатель, который указывает на указатель. Рассмотрим его использование для работы с динамической матрицей. Представь себе столбик из некоторых элементов. Пусть этот столбик будет массивом. Назовём его array. Пусть элементы столбика будут целые числа. Code ☺ ☺ array -----------> ☺ ☺ Рожицы - целочисленные переменные типа int. в программе: Выше был задан массив из десяти элементов. в обычно массиве мы не можем поставить на место размерности массива переменную, но динамический массив нам это позволит. Пусть m - размерность этого массива, далее будем называть переменную m количеством строк. Используя указатель, создадим наш массив в динамической памяти, предварительно полагая, что ранее в программе было заданно колличество строк. Code int* array=new int[m]; Детально разберем эту строчку, поскольку она является ключем к пониманию дальнейшего материала. Сначала идет тип переменной: int* Это значит, что переменная имеющая имя array является "указателем на тип int". Далее следует имя переменной - array. На данном этапе у нас уже есть обычный указатель на переменную типа int. Смотрим дальше. Знак присвоения. Функция new. Она выделяет память, нужную для хранения переменной следующего за ней типа, в нашем случае int. Но поскольку после int идет [m], функция резервирует место для m переменных типа int. Внимательно перечитай места, касающиеся типов данных. Идем далее. Вернемся к нашему столбцу. Столбец - это массив элементов типа int. array - указатель на массив элементов "типа int". Пусть теперь каждый элемент нашего столбца станет указателем на тип int. С этого момента внимание. array - теперь указатель на указатель типа int. Пишем в коде: переменная array тип переменной - указатель * указатель на что - на указатель типа int int* Объявляем: int** array; что мы должны получить: Code ☺ ---------> ☺☺☺☺☺☺☺☺ ☺ ---------> ☺☺☺☺☺☺☺☺ array ------------> ☺ ---------> ☺☺☺☺☺☺☺☺ и так далее... сейчас нам нужно создать тот столбик который мы делал в первый раз, но с учетом того, что теперь его элементы не int, а указатели на int , то есть int* //внимание на тип данных после new На данном этапе у нас есть наш столбец, но он содержит ни на что не указывающие указатели. Нам нужно для каждого такого указателя выделить память под нужно нам колличество элементов, то есть создать саму нашу строку. Массви столбика - массив указателей на строки матрицы. В цикле для каждого такого указателя создаем строку, допустим что необходимо создать n элементов в каждой строке. Код: Code for (int i=0; i<m; i++) *array=new int[n]; Разбираем. Цикл перебирает элементы нашего столбца. У нас есть указатель на этот столбец, следовательно, чтобы получить значение, хранящееся в указателе, его нужно разыменовать (поставить перед ним звездочку). Отсуюда взялось *array перед знаком = .Далее применяется уже известная нам операция выделения памяти под массив из n элементов типа int. Собственно на этом всё. Запишем теперь целиком всё что у нас получилось: //какой-то кусок кода, где уже задаются переменные m и n, где m-колич. // строк, а n- столбцов матрицы ........... Code int** array=new int*[m]; for (int i=0; i<m; i++) *array=new int [n]; В дальнейшем при работе с матрицей array, с ней нужно обращаться как с обыкновенным двухмерным массивом. В функцию она передается как двой ной указатель, то есть её тип в прототипе int**
Сообщение отредактировал Ariant11 - Среда, 11.11.2009, 01:33 |
|
| |
ALTer | Дата: Среда, 11.11.2009, 02:42 | Сообщение # 5 |
Подполковник
Группа: Проверенные
Сообщений: 107
Статус: Offline
| Спасибо!! в общем всё ясно... только я всё равно считаю что это (для моего задания) нерациональное усложнение.. Плюсом кода можно всё таки считать его простоту... Не до полного примитива, но всё же без лишних замутов...
Закон Паркинсона: первые 90% кода отнимают 90% времени. Оставшиеся 10% кода отнимают вторые 90%.
|
|
| |
kulik | Дата: Суббота, 14.11.2009, 20:14 | Сообщение # 6 |
Генерал-майор
Группа: Администраторы
Сообщений: 290
Статус: Offline
| Ну, собственно вот. Еденица передвигается, но по каким-то своим, только ей известным алгоритмам.... Code
void main() { int a[15][15], i, j, x, y; for (x=0;x<15;x++) for (y=0;y<15;y++) { a[x][y]=0; }
i=0; j=0; a[i][j]=1;
for (;;) { switch (getch()) { case 'w': { a[i][j]=0; j++; a[i][j]=1; } case 'a': { a[i][j]=0; i--; a[i][j]=1; } case 's': { a[i][j]=0; j--; a[i][j]=1; } case 'd': { a[i][j]=0; i++; a[i][j]=1; } system("cls");
}
for (x=0;x<15;x++) { for (y=0;y<15;y++) { cout<<a[x][y]<<' '; } cout<<endl; } }
}
|
|
| |
Ariant11 | Дата: Суббота, 14.11.2009, 23:06 | Сообщение # 7 |
Сержант
Группа: Проверенные
Сообщений: 20
Статус: Offline
| 1) В switch при оператах case отсутствует в каждом break. Это собственно главная ошибка здесь: например при нажатии клавиши 'w' у тебя перебирались все операторы из всех case 'ов . 2) при операторах case не нужны фигурные скобки 3) В case 'w' перепутал i и j - при движении вверх ты должен убавить номер строки на 1, а не прибавить столбец, введен ограничитель для курсора 4) В case 'a' снова перепутал столбцы и строки - ты должен сдвинуться на один столбец влево, а не на одну строку подняться вверх, введен ограничитель для курсора 5) В case 's' перепутаны столбцы и строки - нужно сдвинуться на одну строку вниз, а не на один столбец влево, добавлен ограничитель для курсора 6) В операторе case 'd' перепутаны строки и столбцы - нужно сдвинуться на один столбец вправо, а не на одну строку вниз, добавлен ограничитель для курсора 7) Оператор очистки экрана перенесен в начало цикла 8) Цикл изменен с for(;;) на do while. Введена пепеменная q, которой присваиватся вводимое гетчем значение, отныне свитч проверяет значение переменной q. Это сделано для дополнительного пункта case 27, служащего для выхода из программы. Выход осуществляется нажатием кнопки Esc. 9) Цикл вывода матрицы перенесен в начало ключевого цикла. 10) строка должна задавать начальную позицию единицы, у тебя затирает её нулём. Нужно исправить на 11) При цикле for, если зациклить нужно только одну строку, то фигурные скобки не нужны, в этом случае скобки не являются ошибкой, но могут сильно запутать код, особенно при неправильном соблюдении отступов. Исправленный код (студия): Code #include <iostream> #include <conio.h> using namespace std;
void main() { int a[15][15], i, j, x, y; for (x=0;x<15;x++) for (y=0;y<15;y++) a[x][y]=0; i=0; j=0; a[i][j]=1; char q; do { system("cls"); for (x=0;x<15;x++) { for (y=0;y<15;y++) cout<<a[x][y]<<' '; cout<<endl; } q=getch(); switch (q) { case 'w': if (i==0) break; a[i][j]=0; i--; a[i][j]=1; break; case 'a': if (j==0) break; a[i][j]=0; j--; a[i][j]=1; break; case 's': if (i==14) break; a[i][j]=0; i++; a[i][j]=1; break; case 'd': if (j==14) break; a[i][j]=0; j++; a[i][j]=1; break; case 27: system ("cls"); } }while (q!=27); cout <<"ending..."<<endl; system ("pause"); }
Сообщение отредактировал Ariant11 - Суббота, 14.11.2009, 23:15 |
|
| |
kulik | Дата: Среда, 02.12.2009, 20:41 | Сообщение # 8 |
Генерал-майор
Группа: Администраторы
Сообщений: 290
Статус: Offline
| Ну с i и j - это я игрался - методом тыка хотел исправить... А так, НЕ МОГУ ВЫРАЗИТЬ НАСКОЛЬКО ТУПО ЭТО БЫЛО... СПС!!!11 Добавлено (02.12.2009, 20:41) --------------------------------------------- Ну, вот ещё: (бьются данные студентов при сортировке) (Builder) Code //---------------------------------------------------------------------------
#include <vcl.h> #include <iostream.h> #include <conio.h> #pragma hdrstop
//--------------------------------------------------------------------------- //class:
class student { public: student(); void show();
char* showname(); char* showsurname(); int showcode(); int showavrate();
void putname(char _name[15]); void putsurname(char _surname[15]); void putcode(int _code); void putavrate(int _avrate);
private: char name[15]; char surname[15]; int code; int avrate; };
student::student() {
}
//-------------------------------------------------------------------------- //class functions:
void student::putcode(int _code) { this->code = _code; return; }
void student::putavrate(int _avrate) { this->avrate = _avrate; return; }
void student::putname(char _name[15]) { for (int i=0;i<15;i++) { this->name[i] = _name[i]; } return; }
void student::putsurname(char _surname[15]) { for (int i=0;i<15;i++) { this->surname[i] = _surname[i]; } return; }
void student::show() {
cout<<this->name<<endl; cout<<this->surname<<endl; cout<<this->code<<endl; cout<<this->avrate<<endl; cout<<endl;
}
char* student::showname() { return (this->name); }
char* student::showsurname() { return (this->surname); }
int student::showcode() { return (this->code); }
int student::showavrate() { return (this->avrate); } //--------------------------------------------------------------------------- //prototypes:
void input(student* a, int n); void view_students (student* a, int n); void codesort (student* a, int n); void namesort (student* a, int n); int check ();
//--------------------------------------------------------------------------- //realization:
void input (student* a, int n) { int cd, avr; char _name[15], _surname[15];
clrscr(); for (int i=0;i<n;i++) { clrscr(); cout<<"Sudent #"<<i+1<<" name>>"<<endl; cin>>_name; a[i].putname(_name); cout<<"Sudent #"<<i+1<<" surname>>"<<endl; cin>>_surname; a[i].putsurname(_surname); cout<<"Sudent #"<<i+1<<" code>>"<<endl; cd=check(); a[i].putcode(cd); cout<<"Sudent #"<<i+1<<" Avarage rate>>"<<endl; avr=check(); a[i].putavrate(avr); } cout<<"done."; getch(); }
void view_students (student* a, int n) { clrscr(); for (int i=0;i<n;i++) {
cout<<"\tstudent #"<<i+1<<endl; a[i].show();
} getch(); }
void codesort (student* a, int n) { clrscr(); bool f; int i,j,z,x; student buf;
do { f=false; for (i=0; i<n; i++)
{ x=a[i].showcode(); z=a[i+1].showcode(); if (x>z) { buf=a[i+1]; a[i+1]=a[i]; a[i]=buf; f=true; } } }
while(f==true); cout <<"sorted..."; getch(); }
void namesort (student* a, int n) { clrscr(); bool f=true; int i,j; char z[20],x[20]; student buf;
buf.putname(""); buf.putsurname(""); buf.putcode(0); buf.putavrate(0);
do { f=false; for (i=0; i<n; i++)
{ strcpy(x,a[i].showname()); strcpy(z,a[i+1].showname()); if (x[0]>z[0]) { buf=a[i+1]; a[i+1]=a[i]; a[i]=buf; f=true; } } } while(f==true); cout <<"sorted..."; getch();
}
//--------------------------------------------------------------------------- #pragma argsused void main() { int n;
cout<<"Enter number of students:"<<endl; n=check();
student* a; a=new student[n];
for (;;) { clrscr(); cout<<"[MAIN]"<<endl; cout<<"1.Enter students` data"<<endl; cout<<"2.View students` data"<<endl; cout<<"3.Sort students by code"<<endl; cout<<"4.Sort students by name"<<endl; cout<<"5.Quit"<<endl;
switch (getch()) { case '1': input(a, n); break;
case '2': view_students(a, n); break;
case '3': codesort(a, n); break;
case '4': namesort(a, n); break;
case '5': exit(1);
default: cout<<"Error!!! Try again."<<endl; getch(); } } }
//--------------------------------------------------------------------- //digit check function
int check () {
char* temp=new char[10]; int a=0; do { bool b=true; cin>>temp;
for(int i=0;i<strlen(temp);i++) if (isdigit(temp[i])==0) { b=false; break; }
if (b) { a=StrToInt(temp); temp=0; } else cout<<endl<<"Digits only!"<<endl; } while (temp!=0);
//n++; return (a);
} //---------------------------------END---------------------------------------
Сообщение отредактировал kulik - Среда, 02.12.2009, 20:41 |
|
| |
Ariant11 | Дата: Четверг, 03.12.2009, 19:00 | Сообщение # 9 |
Сержант
Группа: Проверенные
Сообщений: 20
Статус: Offline
| В функциях codesort и namesort строку заменить на Code for (i=0; i<n-1; i++) Ты вылезаешь за пределы массива, поэтому в операциях сравнения начинает участвовать мусор из памяти, в результате данные бьются.
|
|
| |
kulik | Дата: Суббота, 05.12.2009, 17:05 | Сообщение # 10 |
Генерал-майор
Группа: Администраторы
Сообщений: 290
Статус: Offline
| Спасибо санёк, и, как всегда, facepalm.jpg
|
|
| |
|
| |