Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2014, 19:35   #1
Евгения Е
Пользователь
 
Регистрация: 21.05.2014
Сообщений: 11
По умолчанию сделать,чтобы запрашивалось сколько вводить строк. наследование класса

Задание:
Объявите класс TString, создающий тип – строку.
Элементы – данные класса:
- указатель на строку;
- длина строки.
Предусмотрите конструкторы класса:
- по умолчанию;
- получающий параметр – указатель на строку;
- копирования;
Напишите функции – методы класса для сравнения строк, определения длины строки, конкатенации строк.
Напишите программу, в которой создайте объекты типа TString и выполните над ними действия, предусмотренные методами класса.
В производном классе введите функции-методы для выполнения таких операций над строками, как поиск подстроки, разбиение строки на слова.

В программе у меня ввод 3 строк, а нужно сделать, чтобы сначала запрашивалось сколько строк вводить, а потом я их уже вводила. как так сделать? помогите,пожалуйста, заранее спасибо
Код:
#include <iostream>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>

using namespace std;

class TString
{
  public:
    int n;
    char *S;
    TString():n(0),S(0) {}; //Конструктор по умолчанию
    TString(char *);   //Конструктор, получающий указатель на строку
    TString(const TString &);  //Конструктор, получающий ссылку на строку
	friend int operator == (TString&, char*);  //Перегрузка операции сравнения
    int Dlin();//Метод получения длины строки
	TString operator +(TString);
};

class TStrMod: public TString
{
  public:
    int Poisk(char *); //Поиск подстроки
    int Razb(char *X[100]); //Разбитие строки на слова
};

TString::TString(char *X)  //Конструктор, получающий указатель на строку
{
   int i;
   for (i=0;X[i]!='\0';i++);
   n=i;
   S=new char[n];
   strcpy(S,X);
}

TString::TString(const TString &obj) //Конструктор, получающий ссылку на строку
{
   n=obj.n;
   S=new char [n+1];
   S=obj.S;
}

int operator == (TString& a, TString& b)
{
  return (!strcmp(a.S,b.S));
}

TString TString::operator +(TString c) //Перегрузка суммирования двух элементов
{
	int i;
	char *X;
	TString R;
	X=new char[n+c.n+1];
	for (i=0;i<n;i++)
		X[i]=S[i];
	for (i=n;i<=n+c.n;i++)
		X[i]=c.S[i-n];
	R.n=n+c.n;
	R.S="";
	R.S=new char[R.n+1];
	R.S=X;
	return R;
}

int TString::Dlin()			//Метод получения длины
{
  return n;
}

int TStrMod::Poisk(char *X)	//поиск подстроки
{
	int m,i,k,res;
	m=strlen(X); k=0; res=0;
	for (i=0;i<n;i++)
	{
		if (S[i]==X[k]) k++; else k=0;
		if (k==m) {res=i-k+1; break;}
	}
	return res+1;
}

int TStrMod::Razb(char *X[100])  //разбивка по строкам
{
	int i,k,t,l;
	k=0;
	for (i=0;i<n;i++)
		if (S[i]==' ') k=k+1;
	t=0; l=0; X[0]=new char[100];
	for (i=0;i<n;i++)
		if (S[i]==' ') {X[t][l]='\0'; t=t+1; l=0;X[t]=new char[100];}
		else {X[t][l]=S[i]; l=l+1;}
	X[t][l]='\0';
	return k+1;
}

void main()
{
  char X[255];
  int i,n;   
  char *SL[100];

  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  
  cout<<"Ввод 3 строк:\n";
  cout<<"Строка A: ";
  gets(X);
  TStrMod A;
  A.S=new char[strlen(X)+1];
  strcpy(A.S,X);
  A.n=strlen(A.S);
  cout<<"Строка B: ";
  gets(X);
  TStrMod B;
  B.S=new char[strlen(X)+1];
  strcpy(B.S,X);
  B.n=strlen(B.S);
  cout<<"Строка C: ";
  gets(X);
  TStrMod C;
  cout<<"\nРавны ли строки A и B?\n";
  if (A==B) cout<<"Да!\n\n";
  else cout<<"Нет!\n\n";
  cout<<"Длина строки B: "<<B.Dlin()<<"\n\n";
  cout<<"Конкатенация строк C и B: ";
  TString D(C+B);
  cout<<D.S<<endl;
  C.S=new char[strlen(X)+1];
  strcpy(C.S,X);
  C.n=strlen(C.S);
  cout<<"\nСтрока A по словам: \n";
  n=A.Razb(SL);
  for (i=0;i<n;i++)
    cout<<SL[i]<<endl;
  cout<<"\nСтрока C входит в строку B с позиции (если 0 - значит не входит!): "<<B.Poisk(C.S)<<endl;
  system("pause");
  return;
}

Последний раз редактировалось Stilet; 12.12.2014 в 07:41.
Евгения Е вне форума Ответить с цитированием
Старый 12.12.2014, 07:33   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Код:
...
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int kolvo;
cout<<"Скока надо строк?\n";
cin >> kolvo; // ввод пользователем числа строк

TStrMod *stroki = new TStrMod[n]; // создаём массив из указанного пользователем числа строк
for (int i = 0; i < kolvo; ++i) // цикл для ввода строк
{
  cout<<"Строка №" << i + 1 << ":";
  gets(X);
  stroki[i].S=new char[strlen(X)+1];
  strcpy(stroki[i].S,X);
  stroki[i].n=strlen(stroki[i].S);
}
...
С операциями всё то же самое, только вместо A, B, C и D нужно будет использовать stroki[i], где i - номер строки (у первой строки номер ноль)
pu4koff вне форума Ответить с цитированием
Старый 12.12.2014, 16:50   #3
Евгения Е
Пользователь
 
Регистрация: 21.05.2014
Сообщений: 11
По умолчанию как с операциями сделать? я дуб дубом, помоги, пожалуйста!

как с операциями сделать? я дуб дубом, помоги, пожалуйста!

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Код:
...
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int kolvo;
cout<<"Скока надо строк?\n";
cin >> kolvo; // ввод пользователем числа строк

TStrMod *stroki = new TStrMod[n]; // создаём массив из указанного пользователем числа строк
for (int i = 0; i < kolvo; ++i) // цикл для ввода строк
{
  cout<<"Строка №" << i + 1 << ":";
  gets(X);
  stroki[i].S=new char[strlen(X)+1];
  strcpy(stroki[i].S,X);
  stroki[i].n=strlen(stroki[i].S);
}
...
С операциями всё то же самое, только вместо A, B, C и D нужно будет использовать stroki[i], где i - номер строки (у первой строки номер ноль)
Евгения Е вне форума Ответить с цитированием
Старый 12.12.2014, 18:08   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Например, сравнение первой и второй введенных строк:
Код:
cout<<"\nРавны ли строки A и B?\n";
  if (stroki[0]==stroki[1]) cout<<"Да!\n\n";
  else cout<<"Нет!\n\n";
pu4koff вне форума Ответить с цитированием
Старый 12.12.2014, 18:40   #5
Евгения Е
Пользователь
 
Регистрация: 21.05.2014
Сообщений: 11
По умолчанию не работает программа(

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Например, сравнение первой и второй введенных строк:
Код:
cout<<"\nРавны ли строки A и B?\n";
  if (stroki[0]==stroki[1]) cout<<"Да!\n\n";
  else cout<<"Нет!\n\n";
программа не работает

#include <iostream>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>

using namespace std;

class TString
{
public:
int n;
char *S;
TString():n(0),S(0) {}; //Конструктор по умолчанию
TString(char *); //Конструктор, получающий указатель на строку
TString(const TString &); //Конструктор, получающий ссылку на строку
friend int operator == (TString&, char*); //Перегрузка операции сравнения
int Dlin(); //Метод получения длины строки
TString operator +(TString);
};

class TStrMod: public TString
{
public:
int Poisk(char *); //Поиск подстроки
int Razb(char *X[100]); //Разбитие строки на слова
};

TString::TString(char *X) //Конструктор, получающий указатель на строку
{
int i;
for (i=0;X[i]!='\0';i++);
n=i;
S=new char[n];
strcpy(S,X);
}

TString::TString(const TString &obj) //Конструктор, получающий ссылку на строку
{
n=obj.n;
S=new char [n+1];
S=obj.S;
}

int operator == (TString& a, TString& b)
{
return (!strcmp(a.S,b.S));
}

TString TString:perator +(TString c) //Перегрузка суммирования двух элементов
{
int i;
char *X;
TString R;
X=new char[n+c.n+1];
for (i=0;i<n;i++)
X[i]=S[i];
for (i=n;i<=n+c.n;i++)
X[i]=c.S[i-n];
R.n=n+c.n;
R.S="";
R.S=new char[R.n+1];
R.S=X;
return R;
}

int TString::Dlin() //Метод получения длины
{
return n;
}

int TStrMod::Poisk(char *X) //поиск подстроки
{
int m,i,k,res;
m=strlen(X); k=0; res=0;
for (i=0;i<n;i++)
{
if (S[i]==X[k]) k++; else k=0;
if (k==m) {res=i-k+1; break;}
}
return res;
}

int TStrMod::Razb(char *X[100]) //разбивка по строкам
{
int i,k,t,l;
k=0;
for (i=0;i<n;i++)
if (S[i]==' ') k=k+1;
t=0; l=0; X[0]=new char[100];
for (i=0;i<n;i++)
if (S[i]==' ') {X[t][l]='\0'; t=t+1; l=0;X[t]=new char[100];}
else {X[t][l]=S[i]; l=l+1;}
X[t][l]='\0';
return k+1;
}

void main()
{
char X[255];
int i,n;
char *SL[100];

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

int kolvo;
cout<<"Введите количество строк:\n";
cin >> kolvo; // ввод пользователем числа строк

TStrMod *stroki = new TStrMod[n]; // создаём массив из указанного пользователем числа строк
for (int i = 0; i < kolvo; ++i) // цикл для ввода строк
{
cout<<"Строка №" << i + 1 << ":";
gets(X);
stroki[i].S=new char[strlen(X)+1];
strcpy(stroki[i].S,X);
stroki[i].n=strlen(stroki[i].S);
}
cout<<"\nРавны ли строки A и B?\n";
if (stroki[0]==stroki[1]) cout<<"Да!\n\n";else cout<<"Нет!\n\n";
cout<<"Длина строки"<<stroki[0].Dlin()<<"\n\n";
system("pause");
return;
}
Евгения Е вне форума Ответить с цитированием
Старый 12.12.2014, 20:12   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Лоханулся я немного
Код:
TStrMod *stroki = new TStrMod[kolvo]; // создаём массив из указанного пользователем числа строк
В первую строку из-за использования cin наверняка хлам попадёт (или пустая строка) без запроса ввода у пользователя, поэтому либо смотрите как буфер очищать, либо перед циклом добавьте gets(X); просто чтобы было, эдакий костыль.
pu4koff вне форума Ответить с цитированием
Старый 12.12.2014, 20:33   #7
Евгения Е
Пользователь
 
Регистрация: 21.05.2014
Сообщений: 11
По умолчанию последний вопрос, можно?) как делать конкатенацию

н.................................. ..................................

Последний раз редактировалось Евгения Е; 13.12.2014 в 05:02.
Евгения Е вне форума Ответить с цитированием
Старый 15.12.2014, 13:58   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

конкатенация - это сцепление (конкатенацией строк "абв" и "где" будет строка "абвгде"). В данном случае тут оператор + для этого и использовался. Просто вместо того, чтобы ручками всё копировать, можно использовать функцию strcat, а то для копирования строк использовали strcpy, а конкатенацию навелосипедили, некрасиво как-то
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать прогу чтобы показывать сколько дней осталось до... Bigtyoma Общие вопросы Delphi 20 23.12.2016 06:23
Ввод - сделать так, чтобы в Edit можно было вводить только цифры, или на оборот, только буквы BastAngel Общие вопросы Delphi 7 27.04.2012 01:15
как при импорте из Excel в delphi узнать сколько заполненных строк в книге Excel?чтобы организовать цикл betirsolt БД в Delphi 1 17.01.2010 18:51
Как сделать так чтобы вводить информацию в Edit Box в двоичной и шестнадцатеричной системах stasy1905 Общие вопросы C/C++ 0 18.12.2009 17:58
Как сделать, чтобы один элемент списка в ComboBox писался в несколько строк? Andr Общие вопросы Delphi 5 15.08.2007 22:24