Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структуры 
:(
    Опции темы
Garcian
Дата 12.4.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Здраствуйте уважаемые программисты! 
У меня довольно таки простая задача "Удалить все знаки, входящие в данный набор знаков". Но было бы все так просто, я бы не стал к вам обращаться.

1) Прежде всего, можно использовать только структуры (т.е. никаких стандартных функций стринга быть не должно).
2) Внутреннее представление программы должно быть с маркером и с длинной (пользователь выбирает одно из двух). Внешнее же представление может быть каким угодно, главное чтобы при обработке маркером или длинной ответ был один и тот же.

Со структурами я только знакомлюсь, поэтому для начала сделал 2 разных кода для маркера и для длины соответственно. Возникли некоторые трудности.

Вот представление с маркером:

Код

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

const int M = 60;

struct StrM { char A[M+1]; char mark; } ;

int read (StrM x);

int read (StrM *p) 

{
    int i = 0;
    char c;
    fstream fin ("***");
    fin.unsetf (ios::skipws);
        fin >> c;
        if (fin.fail()) {
            cout << endl << "Net dannyh " << endl;
            return 0;
            }
        p -> mark = c;
         
        while (!(fin).eof()) 
          {
              fin >> c;
              if (fin.eof()) break;
              p -> A[i++] = c;
          } 
    p -> A[i] = p -> mark;          
}          

int main () 

{
    StrM S; int i = 0;
    StrM *p = &S;
     if   (read (&S)) { 
        p -> mark = '!';
        p -> A[i];
        int t = 0; 
        char z = 'f';
        while (p -> A[i] != p -> mark) 
            {
                if (p -> A[i] == z) {t = 1; int j = i; while (p -> A[j] != p -> mark) { p -> A[j] = p -> A[j+1]; j++;}}
                std::cout << p -> A[i]; i++;
            }  
        }    
getch();
return 0;
}  


текстовый файл: I lovfe you!
Буква f исчезает - отлично. Больше 2х букв не стирает (не могу реализовать).
Если вводится пустой файл, проверка не работает. Выдает не пойми что...

Вот код с длинной:

Код

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

const int Leight = 30;

struct StrL { char L[Leight]; int Len; } ;

int ReadL (fstream, StrL);
int OutL (StrL);

int ReadL (fstream *fin, StrL *l)
{
    char s;
    int t = 0, i = 0, d;
    *fin >> d;
    l -> Len = d;
    while ((!fin -> eof()) && (i < l -> Len + 1) && (i < 30)) {
        *fin >> s;
        l -> L[i] = s;
        i++;
    }
    l -> Len = i;
}

int OutL(StrL *l) { 
    for (int i = 0; i < l -> Len; i++) {
        cout << l -> L[i]; 
        }
    cout << endl;
}

int main () {
    StrL l;
    fstream fin;
    fin.open ("***", ios::in);
    fin.unsetf (ios::skipws);
    int ReadL (fstream *fin, StrL *l);
    OutL(&l);
    getch();
}


Здесь я застрял раньше (поиск и не пробывал). В независимости от входного файла, при запуске программа выводит ужасные вещи (проглядывается windows system и т.д.), после чего зависает. При этом комп изрядно пикает  smile 

Очень прошу, если у вас есть свободные пару минут помочь мне  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
bsa
Дата 12.4.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Garcian, допустим, длину еще можно понять - число элементов в наборе. А вот что такое маркер, мне непонятно.
PM   Вверх
mes
Дата 12.4.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(bsa @  12.4.2009,  21:32 Найти цитируемый пост)
А вот что такое маркер, мне непонятно. 

думаю, указатель на текущий элемент. 


Цитата(Garcian @  12.4.2009,  20:38 Найти цитируемый пост)
 Leight 

тут наверно Length ?


Это сообщение отредактировал(а) mes - 12.4.2009, 22:57


--------------------
PM MAIL WWW   Вверх
Garcian
Дата 12.4.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Маркер - это признак конца строки. У меня это восклицательный знак.

Добавлено через 29 секунд
mes, да, длина)

Добавлено через 8 минут и 3 секунды
по англ забыл как пишется...
--------------------
Неродивый студент
PM MAIL   Вверх
Garcian
Дата 13.4.2009, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



т.е. не забыл, а ошибся  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
Garcian
Дата 13.4.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



эх, классные задания у меня... Идеи не появились?  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Классы использовать нельзя? Только структуры без методов?
PM MAIL ICQ   Вверх
NDQuattro
Дата 13.4.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 18.7.2008
Где: Украина

Репутация: нет
Всего: нет



Anikmar, 
Нет методов, это же Си...
Вообще не пойму, чего Страуструп не убрал структуры из плюсов
PM MAIL   Вверх
mes
Дата 13.4.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(NDQuattro @  13.4.2009,  21:52 Найти цитируемый пост)
Вообще не пойму, чего Страуструп не убрал структуры из плюсов

Во первых совместимость с Си. А во вторых удобно их иметь.  smile 



--------------------
PM MAIL WWW   Вверх
Garcian
Дата 13.4.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Anikmar, на классы у меня следующее задание ооочень похожее) Но здесь надо без них.
--------------------
Неродивый студент
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(NDQuattro @  13.4.2009,  22:52 Найти цитируемый пост)
Anikmar, 
Нет методов, это же Си...

Ясно, просто я не увидел, что написано именно Си. В примере кода был cout - это явно не Си.

Добавлено через 2 минуты и 14 секунд
Поподробнее по задаче:
Исходный текст - из файла? кто файл создает?
Строка со списком удаляемых символов - откуда?
Результат куда? (Гусары - молчать!)
PM MAIL ICQ   Вверх
Garcian
Дата 13.4.2009, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



угу, исходный текст из файла! Кто создает - препод предполагаю создаст) Но об этом не стоит волноваться, главное проверку на пустой файл. А пример текстового файла я уже привел ("I lovfe you!").

Вопрос про строку мне не понятен...
Результат на экран (про гусаров вообще не понял, видимо плохо с чувством юмора)
--------------------
Неродивый студент
PM MAIL   Вверх
Anikmar
Дата 14.4.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Garcian @  13.4.2009,  23:53 Найти цитируемый пост)
Вопрос про строку мне не понятен...

Откуда брать строку с лишними символами? (Где взять список символов, которые надо удалить из исходной строки)

Т.е. я так понимаю исходный файл текстовый. А вот структуры для работы нужны двух видов: первые хранят строку и длину отдельно, второй тип - как в Си, только вместо нулевого символа некий произвольный маркер.

Вопрос: В исходном тексте обязательно должен быть маркер или к строке без маркера его просто добавлять?

Добавлено через 1 минуту и 10 секунд
Цитата(Garcian @  13.4.2009,  23:53 Найти цитируемый пост)
про гусаров вообще не понял, видимо плохо с чувством юмора

Старый бородатый анекдот про Ржевского, гусар и графиню со свечкой (которую та не знала куда вставить).
PM MAIL ICQ   Вверх
Garcian
Дата 14.4.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Anikmar, список символов можно указать прямо в программе (произвольный). Про исходный файл - на самом деле все равно, но лучше с маркером. И про внутренне представление вы все правильно поняли.
зы: да, помню этот анекдот  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
Anikmar
Дата 14.4.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Код неряшливый - сразу скажу.
Плюс использована strlen (лень было свою писать - надо сами напишите).
Как-то так, короче.
Код

//---------------------------------------------------------------------------
#include <istream>
#include <iostream>
#include <fstream>
#include <conio.h>
#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused

using namespace std;

char StrDelimiters[] = " ,.-=,?";

// Структура для внутреннеего представления строки
typedef struct
{
    char Str[256];        // Строка
    int Size;            // Размер (для отображения по размеру)
    char Marker;        // Маркер (для отображения по маркеру)
    bool IsMarekerEnable;    // Да - маркер, Нет - размер
} MyString;

// Функция очистки нашей строки
void ClearMyString(MyString *pTarget)
{
    if (pTarget->IsMarekerEnable) pTarget->Str[0] = pTarget->Marker;
    else pTarget->Size = 0;
}

// Возвращает длину строки
int LengthMyString(MyString *pTarget)
{
    int i=0;
    char *pT = pTarget->Str;
    if (!pTarget->IsMarekerEnable) return pTarget->Size;
    while(*pT++) ++i;
    return i;
}

// Удаление разделителей
void DeleteDelimiters(MyString *pTarget, char *pStrDel)
{
    int i,j,d=0;
    int StrLen = LengthMyString(pTarget);
    int DelLen = strlen(pStrDel);
    char *pT = pTarget->Str;
    bool IsGood;

    for(i=0;i<StrLen;i++)
    {
        IsGood = true;
        for(j=0;j<DelLen;j++)
            if (pTarget->Str[i] == pStrDel[j])
            {
                IsGood = false;
                break;
            }
        if (IsGood) *pT++ = pTarget->Str[i];
        else d++;
    }
    if (pTarget->IsMarekerEnable) *pT = pTarget->Marker;
    else pTarget->Size -= d;
}

// Копирует в нашу структуру строку из ASCIIZ
void CopyMyString(MyString *pTarget,char *pSource)
{
    char *ps = pSource;
    char *pt = pTarget->Str;

    // Обнуляем строку
    ClearMyString(pTarget);

    while(*ps)
    {
        *pt++ = *ps++;
        if (!pTarget->IsMarekerEnable) pTarget->Size++;
    }
    if (pTarget->IsMarekerEnable) *pt = pTarget->Marker;
}

// Функция копирования структуры в массив char согласно внутреннему отображению
void MyStringToChar(MyString *pSource,char *pTarget)
{
    if (pSource->IsMarekerEnable)
    {
        char *pS = pSource->Str;
        while (*pS != pSource->Marker) *pTarget++ = *pS++;
    }
    else
    {
        int i;
        for (i=0;i<pSource->Size;i++) *pTarget++ = pSource->Str[i];
    }
    *pTarget = 0;
}

// Функция работы
void Work(bool pFlagMarked)
{
    char TempStr[256];
    MyString Str;
    ifstream InpFile;

    Str.IsMarekerEnable = pFlagMarked;
    Str.Size = 0;
    Str.Marker = '!';

    InpFile.open("Input.txt",ios::in);
    InpFile.getline(TempStr,255);
    InpFile.close();
    CopyMyString(&Str,TempStr);

    cout << "Source string:" << endl;
    cout << TempStr << endl;
    cout << "Delimiters:" << endl;
    cout << StrDelimiters << endl;
    cout << "Result:" << endl;
    DeleteDelimiters(&Str,StrDelimiters);
    MyStringToChar(&Str,TempStr);
    cout << TempStr << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char Type;
    cout << "Enter type str: 1 - Marked, 2 - Size, other - exit" << endl;
    cin >> Type;
    if (Type == '1') Work(true);
    if (Type == '2') Work(false);
    getch();
    return 0;
}
//---------------------------------------------------------------------------


Добавлено через 39 секунд
зы. Файл Input.txt
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.5387 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.