Несколько вопросов по C++
Модератор: Модераторы разделов
Несколько вопросов по C++
Здравствуйте. В ходе изучения языка C++ возникло несколько вопросов:
1. Должно ли работать выражение вида (n++/--m)++
Вроде ++ может использоваться только с переменными, а не выражениями?
2. Псевдодинамические массивы - самые обыкновенные массивы?
Вроде этого int massive[100];
3. Как организовать ввод и вывод строки с помощью ниже приведённых функций?
char* gets(char*s)
int puts(char *s)
1. Должно ли работать выражение вида (n++/--m)++
Вроде ++ может использоваться только с переменными, а не выражениями?
2. Псевдодинамические массивы - самые обыкновенные массивы?
Вроде этого int massive[100];
3. Как организовать ввод и вывод строки с помощью ниже приведённых функций?
char* gets(char*s)
int puts(char *s)
Re: Несколько вопросов по C++
Sarius писал(а): ↑09.05.2007 12:53Здравствуйте. В ходе изучения языка C++ возникло несколько вопросов:
1. Должно ли работать выражение вида (n++/--m)++
Вроде ++ может использоваться только с переменными, а не выражениями?
2. Псевдодинамические массивы - самые обыкновенные массивы?
Вроде этого int massive[100];
3. Как организовать ввод и вывод строки с помощью ниже приведённых функций?
char* gets(char*s)
int puts(char *s)
С такими вопросами Вам в раздел Программирование, а не в Вопрос новичка
Re: Несколько вопросов по C++
Я только начинаю изучать язык, посмотрите какие темы в разделе "Программирование" поднимают, а не такие ламерские вопросы...
- Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Несколько вопросов по C++
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;
}
Re: Несколько вопросов по C++
Спасибо за ответы.
Спрошу ещё. Правильно ли я тут обращаюсь с динамическим одномерным массивом? Правильно ли работаю с ним в функциях?
Спрошу ещё. Правильно ли я тут обращаюсь с динамическим одномерным массивом? Правильно ли работаю с ним в функциях?
Код: Выделить всё
#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++
Да все, вроде, нормально.
Припиши только в конце main()'а строчку
return 0;
Чисто для порядка.
Кстати, есть хороший отладчик для Линукса, называется
valgrind
В нем есть возможность проследить за ошибками памяти тоже. Я его использую, когда студенческие программы проверяю...
Припиши только в конце main()'а строчку
return 0;
Чисто для порядка.
Кстати, есть хороший отладчик для Линукса, называется
valgrind
В нем есть возможность проследить за ошибками памяти тоже. Я его использую, когда студенческие программы проверяю...
Re: Несколько вопросов по C++
Uncle_Theodore писал(а): ↑12.05.2007 20:09Да все, вроде, нормально.
Припиши только в конце main()'а строчку
return 0;
до нее напишие еще
delete [] mas;
- Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Несколько вопросов по C++
Это маленькая задачка, чтобы понять что такое динамический массив. Точно, точно delete [] mas; не хватает.
Ещё на счёт строк вопросик:
Есть функция strncpy - копирует n первых символов одной строки в другую. Можно ли как-то скопировать n-символов, ночиная, например, с 10?
Ещё на счёт строк вопросик:
Есть функция strncpy - копирует n первых символов одной строки в другую. Можно ли как-то скопировать n-символов, ночиная, например, с 10?
- Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Несколько вопросов по C++
Можно. Просто укажи в качестве источника сдвинутый на 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++ есть своя библиотека работы со стрингами, лучше использовать ее, а не Сяшные функции.
Re: Несколько вопросов по C++
Проверьте меня ещё, пожалуйста. Есть подозрение, что я неверно удаляю "дмухмерный" динамический массив из памяти. Я даже специально вывел его на печать, после процедуры удаления. Часть информации осталось. Или так и должно быть?
И ещё, как узнать сколько занимает этот массив в памяти?
Код: Выделить всё
#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;
}
И ещё, как узнать сколько занимает этот массив в памяти?
Re: Несколько вопросов по C++
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.
The answer is blowin' in the wind.
- Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Несколько вопросов по C++
Если автор хочет -- пусть скажет, перенесу.
И еще один момент -- оператор delete не чистит освобожденную память. Так что, пока она не переписана другими операторами, в ней находится то, что было раньше.
А по поводу valgrind -- я серьезно. Хороший дебаггер.
Re: Несколько вопросов по C++
+1, я им словарь на предмет утечек памяти полирую
И давайте уже отнесем тему в программирование для начинающих.
Re: Несколько вопросов по C++
Насчёт переноса темы согласен, так как поток вопросов ещё не истяк
Спасибо за отладчик.
Спасибо за отладчик.
Re: Несколько вопросов по C++
Помогите мне разобраться, пожалуйста. Не получается нормально работать с char.
Когда я использую cout для вывода, всё прекрасно. Но при попытке произвести сравнение - неудача.
Вот, например, такая задачка: есть список сотрудников и их возраст. Нужно вывести всех с фамилией Иванов.
Использовать структуры.
Вот как это выглядит:
Не правильно со структурой обращаюсь?
Когда я использую 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!!!
Не правильно со структурой обращаюсь?
- Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Несколько вопросов по C++
Используй тип переменных string, а не массив char[].
Или уж используй strcmp
Или уж используй strcmp
Re: Несколько вопросов по C++
strcmp помогло, Pascal сказывается...
string использовать нельзя, полёт мысли ограничен заданием.
Так, а если мне нужно информацию из worker[i].name скопировать в другой массив такого же типа (employee в моём случае)?
string использовать нельзя, полёт мысли ограничен заданием.
Так, а если мне нужно информацию из worker[i].name скопировать в другой массив такого же типа (employee в моём случае)?
- Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Несколько вопросов по C++
Это очень странное задание. Ты пишешь на С++, но используешь средства другого языка, в данном случае С.
При этом, ты зачем-то выделяешь память, вроде как, экономя ее, но при этом, держишь массивы фиксированной длины для введенных строчек имени.
В результате программа выглядит странно...
Так, а если мне нужно информацию из worker[i].name скопировать в другой массив такого же типа (employee в моём случае)?
strcpy
?
Re: Несколько вопросов по C++
Согласен, что странное. Вообще ведь в C++ вместо структур появились классы. Может в нашем ВУЗе считают, что это недоступно для понимания студента?
Можно глупый вопрос: как заставить cin разделять строки не по пробелам, а по ентерам?
Так?
char mystring[256];
cin.getline(mystring,128);
mas[i]=mystring;
где mas[i] - элемент динамического массива типа string.
Можно глупый вопрос: как заставить cin разделять строки не по пробелам, а по ентерам?
Так?
char mystring[256];
cin.getline(mystring,128);
mas[i]=mystring;
где mas[i] - элемент динамического массива типа string.
Re: Несколько вопросов по C++
Надеюсь, Sarius, не будет против, если я в его теме позадаю несколько вопросов:
Работаю с перегрузкой функций и не могу понять результата. Вот участок кода, который выдает странный результат:
Результат:
Введите число char >3
Введите степень >2
Число char 3 в степени 2 = 2601!
Почему не 9? Что не так?
Работаю с перегрузкой функций и не могу понять результата. Вот участок кода, который выдает странный результат:
Код: Выделить всё
#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++
Потому что ты неверно используешь 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;
}
и сразу увидишь, в чем дело...
Re: Несколько вопросов по C++
Спасибо, Uncle_Theodore. Я, кажется, понял, в чем была ошибка.
Re: Несколько вопросов по C++
Вот код, который должен был выполнять следующие вещи: каждый объект класса должен писать какой его порядковый номер.
А вместо этого получаю ошибку:
Что я делаю не так?
Код:
#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
Что я делаю не так?
Re: Несколько вопросов по C++
Вы забыли вне класса определить статическую переменную allobjects и задать ей начальное значение:
Код: Выделить всё
unsigned int quenumber::allobjects = 0;
Re: Несколько вопросов по C++
Alxn1 писал(а): ↑05.07.2007 20:05Вы забыли вне класса определить статическую переменную allobjects и задать ей начальное значение:
Код: Выделить всё
unsigned int quenumber::allobjects = 0;
Вы правы. А возможно ли как-нибудь выполнить ту задачу, которую я хочу, но с помощью конструктора только?
Re: Несколько вопросов по C++
Сомневаюсь. По крайней мере, в голову ничего не приходит.
Re: Несколько вопросов по C++
Код: Выделить всё
class X
{
public:
int number;
X()
{
static int cntr=0;
cntr++;
number = cntr;
}
};
все сказанное есть имхо...
Re: Несколько вопросов по C++
Не понимаю откуда ошибка:
Неужели в синтаксисе ошибка?
$ 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++
В инициализации ошибка.
Вот так будет работать
Вот так будет работать
Код: Выделить всё
string texture[ 2 ][ 12 ] =
{
{
"a", "b","c"
},
{
"e", "f", "g"
}
};