Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программа обработки текста, С++.

37K
30 октября 2008 года
darkie
23 / / 30.10.2008
Помогите, пожалуйста...
Действительно очень нужно.

Слова текста из малых латинских букв записаны не менее чем через один пробел; текст оканчивается точкой. БЕЗ ИСПОЛЬЗОВАНИЯ конструкции STRING:
а) написать программу ввода такого текста с клавиатуры;
б) каждую букву, стоящую в алфавите на месте K, заменить на букву, стоящую в алфавите на месте K с конца алфавита.
535
30 октября 2008 года
Нездешний
537 / / 17.01.2008
Код:
#include <iostream>
#include <conio>
#include <vector>
using namespace std;

//---------------------------------------------------------------------------

int main(int argc, char* argv[])
{
     vector<char> Str;
     char AlfabetLow[] = "abcdefghijklmnopqrstuvwxyz";
     char Symbol;

     cout << "Input text:" << endl;

     while ((Symbol = getch()) != '.')
     {
           cout << Symbol;
           Str.push_back(Symbol);
     }

     int Length = sizeof(AlfabetLow) - 1;
     for (unsigned i = 0; i < Str.size(); i++)
     {
          for (int j = 0; j < Length; j++)
          {
               if (AlfabetLow[j] == Str)
               {
                    Str = AlfabetLow[Length - j - 1];
                    break;
               }
          }
     }

     cout << endl << endl << "Result text: " << endl;
     for (unsigned i = 0; i < Str.size(); i++)  cout << Str;

     getch();

     return 0;
}
37K
30 октября 2008 года
darkie
23 / / 30.10.2008
спасибо вам огромное!!!))):)
а не могли помочь со схемой алгоритма к проге?)
535
31 октября 2008 года
Нездешний
537 / / 17.01.2008
Дайте попить пожалуйста, а то так есть хочется, что и переночевать негде... ;)

Код:
//подключаем необходимые библиотечные файлы
#include <iostream> //для cout
#include <conio> //для getch()
#include <vector> //хм... для vector
using namespace std;

//---------------------------------------------------------------------------

int main(int argc, char* argv[])
{
     vector<char> Str; //объявляем вектор из символов -- что-то вроде массива с переменной длиной
     char AlfabetLow[] = "abcdefghijklmnopqrstuvwxyz";
     char Symbol;

     cout << "Input text:" << endl; //выводим строчку на экран

     while ((Symbol = getch()) != '.')//считываем нажатые клавиши, пока не нажата точка
     {
           cout << Symbol;//выводим нажатую клавишу на экран
           Str.push_back(Symbol);//добавляем считанный символ в вектор -- "запоминаем"
     }

     int Length = sizeof(AlfabetLow) - 1;//определим длину алфавита
     for (unsigned i = 0; i < Str.size(); i++)//для каждого символа из вектора
     {
          for (int j = 0; j < Length; j++)//определим, совпадает ли он с символом из малого латинского алфавита
          {
               if (AlfabetLow[j] == Str)
               {
                    Str = AlfabetLow[Length - j - 1];//и заменим его на симметричный с конца алфавита
                    break;
               }
          }
     }

     cout << endl << endl << "Result text: " << endl;//выведем строчку на экран
     for (unsigned i = 0; i < Str.size(); i++)  cout << Str;//выведем вектор на экран

     getch();//ждет нажатия клавиши

     return 0;
}
37K
31 октября 2008 года
darkie
23 / / 30.10.2008
всё поняла, спасибо))
в задании сказано, что без конструкции string нужно сделать. а в коде есть есть str. но, как я понимаю, это разные вещи. так?:)
535
31 октября 2008 года
Нездешний
537 / / 17.01.2008
Разные, да

Если уж вам так не нравится Str, можете заменить по всему тексту программки другим словом, скажем Stroka или Text
37K
31 октября 2008 года
darkie
23 / / 30.10.2008
уж поверьте)) мне всё-всё-всё нравится)) спасибо вам огрооомное!
только вот ещё такой вопрос...
я запускаю программу. ввожу текст. ввожу ".". и почему-то после нажатия enter введённая строка выводится снова. зачем это нужно?
535
01 ноября 2008 года
Нездешний
537 / / 17.01.2008
Мм... не совсем понял, что значит "снова". У меня все выглядит так:
//---------------------
Input text:
abcd efghi jklmn

Result text:
zyxw vutsr qponm
//---------------------

Т.е, по порядку:
Вылезает надпись Input text
Вводим текст abcd efghi jklmn
Нажимаем точку
Вылезает Result text: zyxw vutsr qponm
Нажимаем любую кнопку - происходит выход из программы

З.Ы.: в какой среде программируете?
З.З.Ы.: надо, чтобы еще и преподу понравилось ;)
37K
01 ноября 2008 года
darkie
23 / / 30.10.2008
аналогично. я делаю так:
вылезает предложение ввода текста. ввожу текст, в конце ставя точку. нажимаю кнопку enter.
выводится текст без точки.
только потом результат.
[ATTACH]3117[/ATTACH]
535
05 ноября 2008 года
Нездешний
537 / / 17.01.2008
Видимо, вы что-то удачно подправили? Потому что в том, что я написал, нажимать ентер необходимости нет -- при нажатии на точку вылезет результат.
Выложите ваш исправленный вариант, посмотрим
37K
05 ноября 2008 года
darkie
23 / / 30.10.2008
понимаете, какая проблема...
я копирую всё, что вы мне написали.
нажимаю debug, но он не кушает библ-ку conio, соответственно ругается на getch.
я изменила getch на getchar, а conio на conio.h...
после чего нужно жать enter, т.к. на точку она реагирует, строка выводится 2 раза. ну и т.д. о чём я и говорила...

Код:
//подключаем необходимые библиотечные файлы
#include <iostream> //для cout
//#include <conio.h> //для getch()
#include <vector> //хм... для vector
using namespace std;

//---------------------------------------------------------------------------

int main(int argc, char* argv[])
{
     vector<char> Str; //объявляем вектор из символов -- что-то вроде массива с переменной длиной
     char AlfabetLow[] = "abcdefghijklmnopqrstuvwxyz";
     char Symbol;

     cout << "Input text:" << endl; //выводим строчку на экран

     while ((Symbol = getchar()) != '.')//считываем нажатые клавиши, пока не нажата точка
     {
           cout << Symbol;//выводим нажатую клавишу на экран
           Str.push_back(Symbol);//добавляем считанный символ в вектор -- "запоминаем"
     }

     int Length = sizeof(AlfabetLow) - 1;//определим длину алфавита
     for (unsigned i = 0; i < Str.size(); i++)//для каждого символа из вектора
     {
          for (int j = 0; j < Length; j++)//определим, совпадает ли он с символом из малого латинского алфавита
          {
               if (AlfabetLow[j] == Str)
               {
                    Str = AlfabetLow[Length - j - 1];//и заменим его на симметричный с конца алфавита
                    break;
               }
          }
     }

     cout << endl << endl << "Result text: " << endl;//выведем строчку на экран
     for (unsigned i = 0; i < Str.size(); i++)  cout << Str;//выведем вектор на экран

     getchar();//ждет нажатия клавиши

     return 0;
}
535
06 ноября 2008 года
Нездешний
537 / / 17.01.2008
Ну, если уж он скушал <conio.h>, то getch можно использовать! :) Меняйте getchar на getch обратно!

Цитата:
getchar читает символы с stdin, который имеет
буфер на одну строку. Поэтому она ничего не возвращает
до тех пор, пока вы не нажмете Enter

37K
06 ноября 2008 года
darkie
23 / / 30.10.2008
исправила, работает. спасибо вам огромное ещё раз!:)
37K
27 ноября 2008 года
darkie
23 / / 30.10.2008
извините, что достаю. но не удалось сдать прогу, препод ругается на использование вектора... нужно сделать динамический массив, в который будем записывать введенные символы с помощью функции gets, затем полученный массив записать в файл, запись осуществим, учитывая, что последний символ ‘.’. В дальнейшем будем работать с файлом. так же нужно сделать так, чтобы прога воспринимала только маленькие латинские буквы. ни русские, ни цифры, ни прочее... помогите, плз.
535
28 ноября 2008 года
Нездешний
537 / / 17.01.2008
Цитата:
прога воспринимала только маленькие латинские буквы. ни русские, ни цифры, ни прочее

Если имеется ввиду, что программа должна блокировать ввод прочих символов, то как же она тогда необходимую в конце точку воспримет? Или пробел?
Или имеется ввиду, что программа считывает строку любых символов и конвертирует из них только те, которые латинские маленькие, а другие оставляет как есть?

И что там с файлом, подробнее?

Вот переделка предыдущей программки без вектора, с блокировкой ввода всего, кроме пробела, точки и маленьких латинских символов:

Код:
#include <iostream.h>
#include <conio.h>
using namespace std;

//---------------------------------------------------------------------------

int main()
{
     char Alfabet[] = "abcdefghijklmnopqrstuvwxyz";
     int AlfabetLength = sizeof(Alfabet) - 1;

     cout << "Input text:" << endl;

     int StrLength = 0;
     char *szStr = new char [StrLength];
     char Symbol;

     while ((Symbol = getch()) != EOF)
     {
          bool bCorrect = false;
          for (int i = 0; i < AlfabetLength; i++)
          {
            if (Symbol == Alfabet)
               {
                bCorrect = true;
                    break;
               }
          }

          if (Symbol == ' ' || Symbol == '.')   bCorrect = true;

          if (!bCorrect)    continue;

            cout << Symbol;
          StrLength++;

          char *szBuffer = new char [StrLength];
          for (int i = 0; i < StrLength - 1; i++)   szBuffer = szStr;
          szBuffer[StrLength - 1] = Symbol;

          delete[] szStr;
          szStr = new char [StrLength];
          for (int i = 0; i < StrLength; i++)   szStr = szBuffer;

          delete[] szBuffer;

          if (Symbol == '.')    break;
     }

     for (int i = 0; i < StrLength; i++)
     {
          for (int j = 0; j < AlfabetLength; j++)
          {
               if (Alfabet[j] == szStr)
               {
                    szStr = Alfabet[AlfabetLength - j - 1];
                    break;
               }
          }
     }

     cout << endl << endl << "Result text: " << endl;
     for (int i = 0; i < StrLength; i++)    cout << szStr;
     cout << endl;

     delete[] szStr;
     getch();

     return 0;
}
37K
28 ноября 2008 года
darkie
23 / / 30.10.2008
вообще по словам препода, это должно быть так:
вводим предложение с точкой.
жмём enter.
прога проверяет только ли это латиница. если нет, то выдаёт ошибку.
если всё ок, то спрашивает, точно ли эту строчку я хочу обрабатывать дальше.
после этого выводит текст обработанный.
вот так это должно выглядеть... знаю, что эт оч замороченно.

следовательно блокировку делать не нужно.) ввести кириллицу можно, и цифры можно, да всё, что угодно можно... но прога должна ругаться и снова предложить корректный ввод заново.
535
28 ноября 2008 года
Нездешний
537 / / 17.01.2008
Цитата:
вводим предложение с точкой.
жмём enter.

Смысл тогда в этой точке?

Цитата:
если всё ок, то спрашивает, точно ли эту строчку я хочу обрабатывать дальше.

Виста стайл, блин! "Вы точно уверены, что точно уверены, что ..."

Цитата:
эт оч замороченно

Это много проще блокировки ))

37K
28 ноября 2008 года
darkie
23 / / 30.10.2008
а смысл точки, наверное, в том, что можно так несколько строк сделать. ну... типа:"today is sunny. i like to jump." без понятия я какой в этом смысл. когда мужчина 77 лет составляет задания для 25 вариантов, от него можно ждать чего угодно. и не факт, что в них ещё и смысл есть.)) но ему хочется, чтоб было вот так, как я до этого написала.
37K
28 ноября 2008 года
darkie
23 / / 30.10.2008
так можно ли без блокировки?) а просто сделать сообщение об ошибке...)
535
01 декабря 2008 года
Нездешний
537 / / 17.01.2008
Код:
#include <iostream.h>
#include <conio.h>
using namespace std;

//---------------------------------------------------------------------------

int main()
{
     char Alfabet[] = "abcdefghijklmnopqrstuvwxyz";
     int AlfabetLength = sizeof(Alfabet) - 1;

     int StrLength = 300;
    char *szStr = new char [StrLength];

     while(1)
     {
        cout << "Input text:" << endl;
          gets(szStr);

          StrLength = strlen(szStr);
          bool bCorrectStr = true;

          for (int i = 0; i < StrLength; i++)
          {
            bool bCorrectSymbol = false;

               if (szStr == '.')
               {
                StrLength = i + 1;
                    bCorrectSymbol = true;
               }
               else if (szStr == ' ')   bCorrectSymbol = true;
               else
               {
                for (int j = 0; j < AlfabetLength; j++)
                    {
                        if (szStr == Alfabet[j])
                         {
                            bCorrectSymbol = true;
                              break;
                         }
                    }
               }

               if (!bCorrectSymbol)
               {
                bCorrectStr = false;
                    break;
               }
          }

          if (szStr[StrLength - 1] != '.')  bCorrectStr = false;

          if (bCorrectStr)  break;
          else  cout << endl << "String is not correct. Use only small latin symbols, dot and space symbols. Use at least one dot. Repeat, please." << endl;
     }

     cout << endl << "Do you want continue with the string \"";
     for (int i = 0; i < StrLength; i++)    cout << szStr;
     cout << "\" (y -- yes, any key -- no): " << endl;
     if (getch() != 'y')
     {
        delete[] szStr;
          return 0;
     }

     for (int i = 0; i < StrLength; i++)
     {
          for (int j = 0; j < AlfabetLength; j++)
          {
               if (Alfabet[j] == szStr)
               {
                    szStr = Alfabet[AlfabetLength - j - 1];
                    break;
               }
          }
     }

     cout << endl << "Result text: " << endl;
     for (int i = 0; i < StrLength; i++)    cout << szStr;
     cout << endl;

     delete[] szStr;
     getch();

     return 0;
}
535
01 декабря 2008 года
Нездешний
537 / / 17.01.2008
Может быть, вы все же попробуете что-то писать самостоятельно?

Что-то пишите вы, хотя бы самые элементарные вещи. А про непонятные конкретные вещи спрашиваете на форуме.

Вопрос "как мне сделать то-то и так-то" -- значительно лучше, чем "напишите за меня программу целиком"

З.Ы. Не стремился задеть или обидеть :)
37K
01 декабря 2008 года
darkie
23 / / 30.10.2008
спасибо огромное)
а ещё вот такой вопрос...
можно ли доделать для нескольких строк?
37K
01 декабря 2008 года
darkie
23 / / 30.10.2008
т.е. не прошу вас о этом.)
просто можно ли?
2
01 декабря 2008 года
squirL
5.6K / / 13.08.2003
Цитата: darkie
т.е. не прошу вас о этом.)
просто можно ли?


да, можно

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог