Модераторы: 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   Вверх
Garcian
Дата 14.4.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ох спасибо большое) Я то надеялся, что немного код подправите, а тут бам!) Сейчас буду разбираться, еще отпишусь  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
Garcian
Дата 23.4.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну вот, собственно, и результаты (немного запоздало). Программа работает, но преподаватель мне раскрыл суть задания насчет внешнего представления. Все таки, если представление задано длинной, то пользователь должен указать количество символов, которое он хочет прочитать. Так же преподаватель ввел 256 символов, но было прочитано только 254. Куда то 2 символа делись. 
--------------------
Неродивый студент
PM MAIL   Вверх
zim22
Дата 23.4.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



 smile 
Цитата(Garcian @  23.4.2009,  17:06 Найти цитируемый пост)
Так же преподаватель ввел 256 символов

он не устал?


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


Шустрый
*


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

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



 smile 
А это так тяжело? smile 
--------------------
Неродивый студент
PM MAIL   Вверх
bsa
Дата 23.4.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Garcian @ 23.4.2009,  19:09)
smile 
А это так тяжело? smile

конечно. надо же их не только ввести, но еще и посчитать
PM   Вверх
Garcian
Дата 24.4.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



сейчас блокнот такой, что на курсоре мыши указывается символ)

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


Шустрый
*


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

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



с 256 символами разобрался, осталось внешнее представление..
--------------------
Неродивый студент
PM MAIL   Вверх
Garcian
Дата 25.4.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



и с внешним справился, всем спасибо!)
--------------------
Неродивый студент
PM MAIL   Вверх
bsa
Дата 26.4.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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




M
bsa
Garcian, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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