Консультация № 184545
24.11.2011, 22:01
64.76 руб.
28.11.2011, 13:17
0 3 1
Здравствуйте! Прошу помощи в следующем вопросе:
помогите сделать задания,которые будут в ссылке.......в коде к каждой стоке пояснения писать....чем проще будет код,тем лучше......
срочно надо....
Структура данных “строка”

Постановка задачи
1. Для СД типа строка определить:
1. Абстрактный уровень представления СД:
1.1. Характер организованности и изменчивости.
1.2. Набор допустимых операций.
2. Физический уровень представления СД:
2.1. Схему хранения.
2.2. Объём памяти, занимаемый экземпляром СД.
2.3. Формат внутреннего представления СД и способ
его интерпретации.
2.4. Характеристику допустимых значений.
2.5. Тип доступа к элементам.
3. Логический уровень представления СД.
3.1. Способ описания СД и экземпляра СД на языке
программирования.

2. Реализовать СД строкового типа в соответствии с вариантом
индивидуального задания в виде модуля. Определить и обработать исключительные ситуации.
3. Разработать программу для решения задачи в соответствии с
вариантом индивидуального задания с использованием модуля
п.2.


Приложение:
Варианты задач
1. Заголовок: void function Copies(string s, string s1,short n).
Назначение: копирование строки s в строку s1 n раз.
Входные параметры: s,n.
Выходные параметры: s1.

Назначение процедур и функций в модулях реализации СД типа строка
void function InputStr(string1 st)
Ввод строки st с клавиатуры.
void function OutputStr(string1const st)
Вывод строки st на экран монитора.
void function InitStr(string1 st, short n)
Выделение динамической памяти под строку st, содержажую
от 0 до n символов.
void function WriteToStr(string1 st, string s)
Запись данных в строку st из строки s.
void function WriteFromStr(string1 st, string s)
Запись данных в строку s из строки st.
bool function Comp(string1 s1, string1 s2, short fl)
Сравнивает строки s1 и s2. Возвращает true если s1=s2 и
fl=0, если s1>s2 и fl=1, если s1<s2 и fl=-1.
void function Delete(string1 s, short index, short count)
Удаляет count символов из строки s,начиная с позиции
index.
void function Insert(String1 Subs, String1 S,short Index)
Вставляет подстроку SubS в строку S,начиная с позиции
Index.
void function Concat(string1 S1, string1 S2, string1 srez)
Выполняет конкатенацию строк S1 и S2; результат помещает
в srez.
void function Copy(String1 S,short Index, short Count, string1 Subs)
Возвращает подстроку Subs из строки S,начиная с позиции
Index и длиной Count символов.
short function Length(string1 S)
Возвращает текущую длину строки S.
short function Pos(string1 SubS, String1 S)
Возвращает позицию, начиная с которой в строке S распо-
лагается подстрока SubS.

Варианты форматов
Формат 1.
typedef char [256] string1;
{признак конца строки–символ с кодом 0}
void function WriteToStr(string1 st, string s) ;
void function WriteFromStr(string1 st, string s);
void function InputStr(string1 st)
void function OutputStr(string1const st)
bool function Comp(string1 s1, string1 s2, short fl)
void function Delete(string1 s, short index, short count)
void function Insert(String1 Subs, String1 S,short Index)
void function Concat(string1 S1, string1 S2, string1 srez)
void function Copy(String1 S,short Index, short Count, string1 Subs)
short function Length(string1 S)
short function Pos(string1 SubS, String1 S)
StrError: {тип переменной ошибки}

Обсуждение

давно
Старший Модератор
17042
808
24.11.2011, 22:22
общий
Сергей Николаевич!
Вы серьёзно считаете, что 6 (шесть) лабораторных работ с вариантами заданий - это один вопрос? И что кто-то возьмётся за такой объём работы пусть и за 65 рублей?
Кроме того, формально я могу и удалить эту консультацию в связи отсутствием текста собственно вопроса. Ссылка на архив - это не вопрос. Необходимо набирать задание экспертам в форме подачи вопроса.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
25.11.2011, 05:01
общий
Напоминаю экспертам, что в соответствии с Правилами портала вы можете подать ответ на одну из лабораторных работ архива по вашему выбору. Я же в этом случае отредактирую вопрос в соответствии с решением.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
28.11.2011, 13:16
общий
это ответ
Здравствуйте, Бондаренко Сергей Николаевич!

Вот вариант Вашей программы из файла 1. Основано на этом моём ответе.
Вот функция из Вашего варианта:
Код:
void Copies (String1 s, String1 &s1, short n) //копирование s в s1 n раз
{
for (int i=0; i<n; i++) //в цикле за n итераций
s1.Concat (s); //прибавляем к строке заданную
}


Вот пример вызова:
Код:
int _tmain(int argc, _TCHAR* argv[])
{
String1 s ("ura");
String1 s2;
Copies (s, s2, 5);
cout << s2.GetString();
_getch();
return 0;
}


Класс в приложении, будут вопросы - задавайте.
Проверено в VS 2010.
Удачи!

Приложение:
#ifndef STRING1_H
#define STRING1_H

const int max_len = 256;

class String1 //класс строка
{
char s[max_len+1]; //буфер для строки
int n; //длина строки
int StrError; //флаг ошибки
public:
String1 (); //конструктор по умолчанию
String1 (const char* str, int n_); //конструктор из строки с заданной длиной
String1 (const char* str); //конструктор из строки
String1 (const String1 &str); //конструктор копирования
~String1 () {}; //деструктор (пустой)
String1& operator= (char *str); //присваивание строки
String1& operator= (String1 str); //присваивание другого объекта класса
const char* GetString(); //получение массива символов
bool Compare (String1 str, int ofs = 0); //сравнение на равенство, опционально указывается отступ
void Delete (int ofs = 0, int count = -1); //удаление count символов с ofs позиции (по умолчанию - удаление всей строки)
void Insert (String1 str, int ofs); //вставка на заданную позицию
void Concat (String1 str); //объекдинение
void Copy (String1& whr, int ofs, int count); //копирование
int Length (); //длина строки
int Pos (String1 str); //позиция подстроки (-1 в случае, если она отсутствует)
int GetError (); //получение флага ошибки
};

#endif


#include "Set.h"
#include <string.h>


String1::String1()
{
s[0] = '\0'; //по умолчанию пишем пустую строку
n = 0;
StrError = 0;
}

String1::String1 (const char* str, int n_)
{
if (n_>max_len) { //если заданная длина больше допустимой, пишем пустую строку и помечаем ошибку
StrError = 1;
s[0] = '\0';
n = 0;
return;
}
n = n_; //иначе копируем посимвольно
for (int i=0; i<n; i++)
s[i] = str[i];
s[n] = '\0';
StrError = 0;
}

String1::String1 (const char* str)
{
int l = strlen (str); //всё, как и в предыдущей, но длину строки вычисляем сами
if (l>max_len) {
StrError = 1;
s[0] = '\0';
n = 0;
return;
}
n = l;
for (int i=0; i<n; i++)
s[i] = str[i];
s[n] = '\0';
StrError = 0;
}

String1::String1 (const String1 &str)
{
strcpy (s, str.s); //копируем всё из другого объекта
n = str.n;
StrError = 0;
}

String1& String1::operator= (char *str)
{
if (strlen(str)>max_len) { //аналогично контруктору из строки
StrError = 1;
return *this;
}
n = strlen(str);
strcpy (s, str);
StrError = 0;
return *this; //возвращаем себя
}

String1& String1::operator= (String1 str)
{
strcpy (s, str.s); //аналогично конструктору копирования
n = str.n;
StrError = 0;
return *this;
}

const char* String1::GetString()
{
StrError = 0;
return s; //возвращаем буфер
}

bool String1::Compare (String1 str, int ofs)
{
StrError = 0;
for (int i=0; i<n && i+ofs<str.n; i++) //посимвольно сравниваем
if (s[i]!=str.s[i+ofs]) return false; //при несовпадении возвращаем 0
return true; //если дошли досюда, то строки равны
}

void String1::Delete (int ofs, int count)
{
if (count == -1) count = n-ofs; //в случае параметра по умолчанию
if (ofs>=n || count>n) { //проверяем корректность диапазона
StrError = 1;
return;
}
StrError = 0;
for (int i = ofs; i<=n-count; i++) //сдвигаем массив символов влево
s[i] = s[i+count]; //затираем ненужное
n -= count; //уменьшаем размер
}

void String1::Insert (String1 str, int ofs)
{
if (n+str.n>max_len) { //проверяем, влезает ли
StrError = 1;
return;
}
for (int i=n+str.n; i>=ofs+str.n; i--) //освобождаем место
s[i] = s[i-str.n]; //сдвигаем массив вправо
for (int i=0; i<str.n; i++) //копируем данные
s[ofs+i] = str.s[i];
n+=str.n; //увеличиваем размер
StrError = 0;
}

void String1::Concat (String1 str)
{
if (n+str.n>max_len) { //проверяем, влезает ли
StrError = 1;
return;
}
for (int i = 0; i< str.n; i++) //дописываем в конец
s[n+i] = str.s[i];
s[n+str.n] = '\0'; //проставляем конец строки
n+=str.n; //увеличиваем длину
StrError = 0;
}

void String1::Copy (String1& whr, int ofs, int count)
{
if (ofs>=n || count>n) { //проверяем корректность диапазона
StrError = 1;
return;
}
String1 tmp (s+ofs, count); //делаем новую строку из старой со сдвигом на ofs и длиной count
whr = tmp; //присваиваем новый объект возвращаемому
StrError = 0;
}

int String1::Length ()
{
StrError = 0;
return n; //возврашаем длину
}

int String1::Pos (String1 str) //ищет только первое вхождение
{
StrError = 0;
if (str.n>n) return -1; //если длина искомой строки больше исходной, её точно у нас нет
for (int i = 0; i< n; i++) //идём по строке
if (s[i]==str.s[0]) { //встретили совпадаюший первый символ
bool f = true; //готовим флаг
for (int j = 1; j<str.n && f; j++) //идём по подстроке
if (s[i+j]!=str.s[j]) f = false; //если какой-то символ не совпал - ошибка
if (f) return i; //если флаг не сброшен, возвращаем полученную позицию
}
return -1; //если попали сюда, подстроки нет
}

int String1::GetError ()
{
return StrError; //фозвращаем флаг ошибки
}
Прикрепленные файлы:
Форма ответа