Несколько вопросов по C++

Модератор: Модераторы разделов

Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Несколько вопросов по C++

Сообщение Sarius »

Здравствуйте. В ходе изучения языка C++ возникло несколько вопросов:
1. Должно ли работать выражение вида (n++/--m)++
Вроде ++ может использоваться только с переменными, а не выражениями?

2. Псевдодинамические массивы - самые обыкновенные массивы?
Вроде этого int massive[100];

3. Как организовать ввод и вывод строки с помощью ниже приведённых функций?
char* gets(char*s)
int puts(char *s)
Спасибо сказали:
Аватара пользователя
stomp
Сообщения: 721
ОС: Debian GNU

Re: Несколько вопросов по C++

Сообщение stomp »

Sarius писал(а):
09.05.2007 12:53
Здравствуйте. В ходе изучения языка C++ возникло несколько вопросов:
1. Должно ли работать выражение вида (n++/--m)++
Вроде ++ может использоваться только с переменными, а не выражениями?

2. Псевдодинамические массивы - самые обыкновенные массивы?
Вроде этого int massive[100];

3. Как организовать ввод и вывод строки с помощью ниже приведённых функций?
char* gets(char*s)
int puts(char *s)

С такими вопросами Вам в раздел Программирование, а не в Вопрос новичка :blush:
Спасибо сказали:
Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Re: Несколько вопросов по C++

Сообщение Sarius »

Я только начинаю изучать язык, посмотрите какие темы в разделе "Программирование" поднимают, а не такие ламерские вопросы...
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

Sarius писал(а):
09.05.2007 12:53
Здравствуйте. В ходе изучения языка C++ возникло несколько вопросов:
1. Должно ли работать выражение вида (n++/--m)++
Вроде ++ может использоваться только с переменными, а не выражениями?

something ++;
--это сокращение от выражения
something = something + 1;

Если something -- не переменная, то ее, разумеется, невозможно поставить в левой части оператора присваивания.
2. Псевдодинамические массивы - самые обыкновенные массивы?
Вроде этого int massive[100];

Никогда не слышал про такие. :)
3. Как организовать ввод и вывод строки с помощью ниже приведённых функций?
char* gets(char*s)
int puts(char *s)

Например, вот так

Код: Выделить всё

#include<iostream>
using namespace std;

int main()
{
  char line[256];

  while(gets(line) != NULL)
    {
      puts(line);
      cout << endl;
    }

  return 0;
}
Спасибо сказали:
Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Re: Несколько вопросов по C++

Сообщение Sarius »

Спасибо за ответы.

Спрошу ещё. Правильно ли я тут обращаюсь с динамическим одномерным массивом? Правильно ли работаю с ним в функциях?

Код: Выделить всё

#include <iostream>
using namespace std;
void input_mas(int *mas,int size)
{
    for (int i=0; i<size; i++)
    {
      mas[i]=rand()%100-50;
    }
}

void print_mas(int *mas,int size)
{
    for (int i=0; i<size; i++)
    {
      cout << mas[i] << " ";
    }
}

int main()
{
    int* mas = new int[100];
    int size=6;
    input_mas(mas,size);
    print_mas(mas,size);
 }
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

Да все, вроде, нормально.
Припиши только в конце main()'а строчку
return 0;
Чисто для порядка.

Кстати, есть хороший отладчик для Линукса, называется
valgrind
В нем есть возможность проследить за ошибками памяти тоже. Я его использую, когда студенческие программы проверяю... :)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Несколько вопросов по C++

Сообщение Liksys »

Uncle_Theodore писал(а):
12.05.2007 20:09
Да все, вроде, нормально.
Припиши только в конце main()'а строчку
return 0;

до нее напишие еще
delete [] mas;
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

Liksys писал(а):
12.05.2007 20:18
до нее напишие еще
delete [] mas;

А, черт! И правда, он же память аллокейтает...
Блин, не проснулся я еще... :)
Интересно, кстати, а зачем?
Спасибо сказали:
Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Re: Несколько вопросов по C++

Сообщение Sarius »

Это маленькая задачка, чтобы понять что такое динамический массив. Точно, точно delete [] mas; не хватает.

Ещё на счёт строк вопросик:
Есть функция strncpy - копирует n первых символов одной строки в другую. Можно ли как-то скопировать n-символов, ночиная, например, с 10?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

Sarius писал(а):
12.05.2007 20:36
Ещё на счёт строк вопросик:
Есть функция strncpy - копирует n первых символов одной строки в другую. Можно ли как-то скопировать n-символов, ночиная, например, с 10?

Можно. Просто укажи в качестве источника сдвинутый на 10 позиций поинтер.
Вот так примерно.

Код: Выделить всё

#include<iostream>
#include<string.h>

using namespace std;

int main()
{
  char abra[] = "abracadabra";
  char cadabra[12];

  strncpy(cadabra, abra+4, 7);

  for(int i=0;i<7;i++)
    cout << cadabra[i];
  cout << endl;

  return 0;
}


Впрочем, у C++ есть своя библиотека работы со стрингами, лучше использовать ее, а не Сяшные функции.
Спасибо сказали:
Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Re: Несколько вопросов по C++

Сообщение Sarius »

Проверьте меня ещё, пожалуйста. Есть подозрение, что я неверно удаляю "дмухмерный" динамический массив из памяти. Я даже специально вывел его на печать, после процедуры удаления. Часть информации осталось. Или так и должно быть?

Код: Выделить всё

#include <iostream>
using namespace std;
int** form_matr(int n,int m)
{
int **matr=new int*[n];//выделение памяти по массив указателей
for(int i=0;i<n;i++)
    //выделение памяти 100*sizeof(int) байт для массива значений
    matr[i]=new int [m];
return matr;//возвращаем указатель на массив указателей
}
//Заполняем массив числами
void genmas(int **matr,int n,int m)
{
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    matr[i][j]=rand()%100-50;
}
//Вывод
void printmas(int **matr,int n,int m)
{
    for(int i=0;i<n;i++)
    {
    for(int j=0;j<m;j++)
    {cout << matr[i][j] << "\t";}
    cout << endl;
    }
}
//Вроде как удаление
void delall(int **matr,int n,int I)
{
    for(int i=0;i<n;i++)
    {
        delete[] matr[i];
    }
    delete[] matr;
    cout << endl;
}

int main()
{
    int n,m;
    n=4;
    m=5;
    int** massiv;
    massiv = form_matr(n,m);
        genmas(massiv,n,m);
    printmas(massiv,n,m);
    cout << endl;
    delall(massiv,m,1);
    printmas(massiv,n,m);
    return 0;
}


И ещё, как узнать сколько занимает этот массив в памяти?
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Несколько вопросов по C++

Сообщение uptime »

Sarius писал(а):
12.05.2007 22:04

Код: Выделить всё

 //Вроде как удаление
 void delall(int **matr,int n,int I)
 {
     for(int i=0;i<n;i++)
     {
         delete[] matr[i];
     }
     delete[] matr;
     cout << endl;
 }

всё достаточно прилично, два небольших замечания. Параметр I не используется, значит не нужен. Вывод символа конца строки выглядит в этой функции неуместно.
Всё таки эту тему надо перенести в программирование, там теперь специальный подфорум есть.

успехов
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

uptime писал(а):
13.05.2007 00:40
всё достаточно прилично, два небольших замечания. Параметр I не используется, значит не нужен. Вывод символа конца строки выглядит в этой функции неуместно.
Всё таки эту тему надо перенести в программирование, там теперь специальный подфорум есть.

успехов

Если автор хочет -- пусть скажет, перенесу.
И еще один момент -- оператор delete не чистит освобожденную память. Так что, пока она не переписана другими операторами, в ней находится то, что было раньше.
А по поводу valgrind -- я серьезно. Хороший дебаггер.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Несколько вопросов по C++

Сообщение Liksys »

Uncle_Theodore писал(а):
13.05.2007 00:46
А по поводу valgrind -- я серьезно. Хороший дебаггер.

+1, я им словарь на предмет утечек памяти полирую :)

И давайте уже отнесем тему в программирование для начинающих.
Спасибо сказали:
Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Re: Несколько вопросов по C++

Сообщение Sarius »

Насчёт переноса темы согласен, так как поток вопросов ещё не истяк ;)
Спасибо за отладчик.
Спасибо сказали:
Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Re: Несколько вопросов по C++

Сообщение Sarius »

Помогите мне разобраться, пожалуйста. Не получается нормально работать с char.
Когда я использую cout для вывода, всё прекрасно. Но при попытке произвести сравнение - неудача.
Вот, например, такая задачка: есть список сотрудников и их возраст. Нужно вывести всех с фамилией Иванов.
Использовать структуры.

Код: Выделить всё

#include <iostream>
using namespace std;

//Заданная структура
struct employee
{
char* name;
int years;
};

employee* form_massiv(int n)
{
    //выделение памяти для массива
    return new employee[n];
    //возвращаем указатель на массив
}

//Ввод информации о работнике
employee make_person()
{
    char name[20];
    int years;
    cout << "Name? ";
    cin >> name;
    cout << "Years? ";
    cin >> years;

    employee worker;
    worker.name=new char[strlen(name)+1];
    strcpy(worker.name,name);
    worker.years=years;
    return worker;
}

//Вывод
void print_person(employee worker)
{
    cout<<"\nName: "<< worker.name<<"\tYears: "<<worker.years;
}

//Поиск сотрудников, отвечающих указанному критерию
void search(employee* worker, int n)
{
    bool notfound=0;
    for (int i=0;i<n;i++)
    {
        if (worker[i].name=="Ivanov")
        {
            print_person(worker[i]);
            notfound=1;
        }
    }
    if (notfound==0)
    {
        cout << "Not found!!!\n";
    }
}

//удаление массива из памяти
void delmas(employee *mas,int n)
{
    for (int i = 0; i < n; i++)
    {
        delete[] mas[i].name;
    }
    delete[] mas;
}

int main()
{
    int n=3;
    employee* massiv;
    //Формирование массива
    massiv = form_massiv(n);
    //Ввод информации о работниках.
    for (int i=0;i<n;i++)
    {
        cout << "Enter information about worker N" << i << endl;
        massiv[i]=make_person();
    }
    //Вывод с фильтром
    search(massiv,n);
    //Чистка
    delmas(massiv,n);
    return 0;
}


Вот как это выглядит:
Enter information about worker N0
Name? Petrov
Years? 35
Enter information about worker N1
Name? Ivanov
Years? 20
Enter information about worker N2
Name? Sidorov
Years? 25
Not found!!!


Не правильно со структурой обращаюсь? :mellow:
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

Используй тип переменных string, а не массив char[].
Или уж используй strcmp
Спасибо сказали:
Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Re: Несколько вопросов по C++

Сообщение Sarius »

strcmp помогло, Pascal сказывается...
string использовать нельзя, полёт мысли ограничен заданием.

Так, а если мне нужно информацию из worker[i].name скопировать в другой массив такого же типа (employee в моём случае)?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

Sarius писал(а):
14.05.2007 17:31
strcmp помогло, Pascal сказывается...
string использовать нельзя, полёт мысли ограничен заданием.

Это очень странное задание. Ты пишешь на С++, но используешь средства другого языка, в данном случае С.
При этом, ты зачем-то выделяешь память, вроде как, экономя ее, но при этом, держишь массивы фиксированной длины для введенных строчек имени.
В результате программа выглядит странно...
Так, а если мне нужно информацию из worker[i].name скопировать в другой массив такого же типа (employee в моём случае)?

strcpy
?
Спасибо сказали:
Аватара пользователя
Sarius
Сообщения: 80
ОС: Debian

Re: Несколько вопросов по C++

Сообщение Sarius »

Согласен, что странное. Вообще ведь в C++ вместо структур появились классы. Может в нашем ВУЗе считают, что это недоступно для понимания студента? :rolleyes:

Можно глупый вопрос: как заставить cin разделять строки не по пробелам, а по ентерам?
Так?

char mystring[256];

cin.getline(mystring,128);

mas[i]=mystring;

где mas[i] - элемент динамического массива типа string.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Несколько вопросов по C++

Сообщение Assuri »

Надеюсь, Sarius, не будет против, если я в его теме позадаю несколько вопросов:

Работаю с перегрузкой функций и не могу понять результата. Вот участок кода, который выдает странный результат:

Код: Выделить всё

#include <iostream>
using namespace std;

// тут прототипы

int main ()
{
    char nch;
    short p = 0;
    ....
    cout <<"Введите число char >";
    cin >> nch;
    cout << "Введите степень >";
    cin >> p;
    cout << "Число char " << nch << " в степени " << p << " = " << power ( nch,  p ) << '\n';
    return 0;
}

// Объявление
double power( char n, int p )
{
    n = static_cast<int>(n);
    double result = 1;
    for ( short i = 0; i < p; i++ )
        result *=n;
    return result;
}


Результат:
Введите число char >3
Введите степень >2
Число char 3 в степени 2 = 2601!

Почему не 9? Что не так?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

-DooM- писал(а):
04.07.2007 08:29
Результат:
Введите число char >3
Введите степень >2
Число char 3 в степени 2 = 2601!

Почему не 9? Что не так?

Потому что ты неверно используешь static_cast. Вернее, то, что он в действительности делает -- это совсем не то, что ты от него хочешь.
Чтобы увидеть ошибку, измени свою функцию на вот это

Код: Выделить всё

double power( char n, short p )
{
  int nn = static_cast<int>(n);
  cout << " number is cast to " << nn << endl;

    int result = 1;
    for ( short i = 0; i < p; i++ )
      result *=nn;

    return result;
}

и сразу увидишь, в чем дело...
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Несколько вопросов по C++

Сообщение Assuri »

Вот код, который должен был выполнять следующие вещи: каждый объект класса должен писать какой его порядковый номер.

Код:

#include <iostream> using namespace std; class quenumber { private: static unsigned int allobjects; unsigned int persnumber; public: quenumber () { persnumber = allobjects + 1; allobjects++; cout << "Мой персональный номер: " << persnumber << '\n'; } void print_obj() { } }; int main () { quenumber q1,q2,q3; return 0; }


А вместо этого получаю ошибку:

Код: Выделить всё

$ g++ g6u8.cpp -o g6u8
/tmp/ccBDe1wo.o: In function `quenumber::quenumber()':
g6u8.cpp:(.text._ZN9quenumberC1Ev[quenumber::quenumber()]+0x8): undefined reference to `quenumber::allobjects'
g6u8.cpp:(.text._ZN9quenumberC1Ev[quenumber::quenumber()]+0x15): undefined reference to `quenumber::allobjects'
g6u8.cpp:(.text._ZN9quenumberC1Ev[quenumber::quenumber()]+0x1d): undefined reference to `quenumber::allobjects'
collect2: ld returned 1 exit status


Что я делаю не так?
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Контактная информация:

Re: Несколько вопросов по C++

Сообщение Alxn1 »

Вы забыли вне класса определить статическую переменную allobjects и задать ей начальное значение:

Код: Выделить всё

unsigned int quenumber::allobjects = 0;
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Несколько вопросов по C++

Сообщение Assuri »

Alxn1 писал(а):
05.07.2007 20:05
Вы забыли вне класса определить статическую переменную allobjects и задать ей начальное значение:

Код: Выделить всё

unsigned int quenumber::allobjects = 0;

Вы правы. А возможно ли как-нибудь выполнить ту задачу, которую я хочу, но с помощью конструктора только?
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Контактная информация:

Re: Несколько вопросов по C++

Сообщение Alxn1 »

Сомневаюсь. По крайней мере, в голову ничего не приходит.
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Несколько вопросов по C++

Сообщение d_n_k »

Код: Выделить всё

class X
{
public:
    int number;
    X()
    {
        static int cntr=0;
        cntr++;
        number = cntr;
    }
};
все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Несколько вопросов по C++

Сообщение Assuri »

Не понимаю откуда ошибка:
$ g++ main.cpp -o main
main.cpp: In constructor ‘game::game()’:
main.cpp:33: error: expected primary-expression before ‘{’ token
main.cpp:33: error: expected `;' before ‘{’ token

Код:

... string texture [ 2 ] [ 12 ]; ..... // Конструктор ============================== game () : randnum ( 0 ), entnum ( 0 ), steps ( 0 ), choice ( 0 ), settings ( "нет" ), langstr ( "r" ), langindex ( 0 ) { texture = 33 строка: { { "а", "б","в" }, { "г","д,"е" } }; }

Неужели в синтаксисе ошибка?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Несколько вопросов по C++

Сообщение Uncle_Theodore »

В инициализации ошибка.
Вот так будет работать

Код: Выделить всё

  string  texture[ 2 ][ 12 ] =
  {
    {
      "a", "b","c"
    },
    {
      "e", "f", "g"
    }
  };
Спасибо сказали:
Ответить