Вторник, 03.12.2024, 10:23Главная | Регистрация | Вход

Меню сайта

Форма входа

Приветствую Вас Гость!

Мини-чат

Наш опрос

Оцените мой сайт
Всего ответов: 54

Статистика

помощь - Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
помощь
Ariant11Дата: Пятница, 06.11.2009, 21:55 | Сообщение # 1
Сержант
Группа: Проверенные
Сообщений: 20
Награды: 0
Репутация: 3
Статус: Offline
Как выяснилось, у многих имеются проблемы с лабами по с++, да и пониманием самого языка. Поступило предложение помогать своим хотя бы с лабами. Предлагаю заинтересовавшимся в теме выкладывать свои идеи или нерабочие программы, остальным же пытаться помочь или заполнить свои пробелы в знаниях.

 
noiseДата: Суббота, 07.11.2009, 11:41 | Сообщение # 2
Лейтенант
Группа: Проверенные
Сообщений: 54
Награды: 0
Репутация: 3
Статус: Offline
ты просто робин гуд ^_^
ну давайте, go ahead


 
ALTerДата: Среда, 11.11.2009, 00:27 | Сообщение # 3
Подполковник
Группа: Проверенные
Сообщений: 107
Награды: 0
Репутация: 4
Статус: Offline
ну я буду первым...
Объясни или кинь ссылочку на книгу что такое **?



Закон Паркинсона: первые 90% кода отнимают 90% времени. Оставшиеся 10% кода отнимают вторые 90%.
 
Ariant11Дата: Среда, 11.11.2009, 01:26 | Сообщение # 4
Сержант
Группа: Проверенные
Сообщений: 20
Награды: 0
Репутация: 3
Статус: Offline
Кхм)
Указатель, который указывает на указатель. Рассмотрим его использование для работы с динамической матрицей.

Представь себе столбик из некоторых элементов. Пусть этот столбик будет массивом. Назовём его array. Пусть элементы столбика будут целые числа.

Code
                   
                           ☺
                           ☺
array -----------> ☺
                           ☺
     

Рожицы - целочисленные переменные типа int.
в программе:
Code
  int array[10];

Выше был задан массив из десяти элементов. в обычно массиве мы не можем поставить на место размерности массива переменную, но динамический массив нам это позволит. Пусть 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*

Code
array=new int*[m];
//внимание на тип данных после 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
Награды: 0
Репутация: 4
Статус: Offline
Спасибо!! в общем всё ясно... только я всё равно считаю что это (для моего задания) нерациональное усложнение.. Плюсом кода можно всё таки считать его простоту... Не до полного примитива, но всё же без лишних замутов...


Закон Паркинсона: первые 90% кода отнимают 90% времени. Оставшиеся 10% кода отнимают вторые 90%.
 
kulikДата: Суббота, 14.11.2009, 20:14 | Сообщение # 6
Генерал-майор
Группа: Администраторы
Сообщений: 290
Награды: 0
Репутация: 10
Статус: 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
Награды: 0
Репутация: 3
Статус: Offline
1) В switch при оператах case отсутствует в каждом break. Это собственно главная ошибка здесь: например при нажатии клавиши 'w' у тебя перебирались все операторы из всех case 'ов .
2) при операторах case не нужны фигурные скобки
3) В case 'w' перепутал i и j - при движении вверх ты должен убавить номер строки на 1, а не прибавить столбец, введен ограничитель для курсора
Code
if (i==0) break;

4) В case 'a' снова перепутал столбцы и строки - ты должен сдвинуться на
один столбец влево, а не на одну строку подняться вверх, введен ограничитель для курсора
Code
if (j==0) break;

5) В case 's' перепутаны столбцы и строки - нужно сдвинуться на одну строку вниз, а не на один столбец влево, добавлен ограничитель для курсора
Code
if (i==14) break;

6) В операторе case 'd' перепутаны строки и столбцы - нужно сдвинуться на один столбец вправо, а не на одну строку вниз, добавлен ограничитель для курсора
Code
if (j==14) break;

7) Оператор очистки экрана перенесен в начало цикла
8) Цикл изменен с for(;;) на do while. Введена пепеменная q, которой присваиватся вводимое гетчем значение, отныне свитч проверяет значение переменной q. Это сделано для дополнительного пункта case 27, служащего для выхода из программы. Выход осуществляется нажатием кнопки Esc.
9) Цикл вывода матрицы перенесен в начало ключевого цикла.
10) строка
Code
a[i][j]=0;

должна задавать начальную позицию единицы, у тебя затирает её нулём.
Нужно исправить на
Code
a[i][j]=1;

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
Награды: 0
Репутация: 10
Статус: 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---------------------------------------

Прикрепления: 0838920.jpg (17.2 Kb)






Сообщение отредактировал kulik - Среда, 02.12.2009, 20:41
 
Ariant11Дата: Четверг, 03.12.2009, 19:00 | Сообщение # 9
Сержант
Группа: Проверенные
Сообщений: 20
Награды: 0
Репутация: 3
Статус: Offline
В функциях codesort и namesort строку

Code
for (i=0; i<n; i++)

заменить на

Code
for (i=0; i<n-1; i++)

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


 
kulikДата: Суббота, 05.12.2009, 17:05 | Сообщение # 10
Генерал-майор
Группа: Администраторы
Сообщений: 290
Награды: 0
Репутация: 10
Статус: Offline
Спасибо санёк, и, как всегда, facepalm.jpg



 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2024 |