Форум программистов, компьютерный форум CyberForum.ru

С++ ВАЖНО. тяжело - C++

Восстановить пароль Регистрация
 
maksim-2804
0 / 0 / 0
Регистрация: 13.06.2011
Сообщений: 18
13.06.2011, 13:02     С++ ВАЖНО. тяжело #1
Составить подпpогpамму, котоpая читает постpочно текст дpугой пpогpаммы
на языке Паскаль (вводится с клавиатуpы), содеpжащий не более 10 стpок
(стpока - не более 80 символов), обнаpуживает комментаpии и печатает их.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2011, 13:02     С++ ВАЖНО. тяжело
Посмотрите здесь:

C++ Важно-Функции
Массив в С++ ВАЖНО C++
C++ очень тяжело,метод квайна-мак-класки
C++ нужно исправить ошибку в коде) кому не тяжело
Важно для новичка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
13.06.2011, 13:06     С++ ВАЖНО. тяжело #2
что сложного?
от { до } печатай.
Nursik77
 Аватар для Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
13.06.2011, 13:06     С++ ВАЖНО. тяжело #3
Тема по с++, а пишешь написать на Паскале
maksim-2804
0 / 0 / 0
Регистрация: 13.06.2011
Сообщений: 18
13.06.2011, 13:08  [ТС]     С++ ВАЖНО. тяжело #4
Цитата Сообщение от OstapBender Посмотреть сообщение
что сложного?
от { до } печатай.
ну правильно

Добавлено через 1 минуту
Цитата Сообщение от Nursik77 Посмотреть сообщение
Тема по с++, а пишешь написать на Паскале
в этом и суть читай внимательно!!!
Nursik77
 Аватар для Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
13.06.2011, 13:09     С++ ВАЖНО. тяжело #5
Извиняй, невнимателен
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.06.2011, 13:58     С++ ВАЖНО. тяжело #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Так нужно?
Код
diagon@shadeware:~$ ./a.out
Enter code:
var x:integer; //variable
begin 
{some code}
readln; //pause
end.
variable

some code

pause

diagon@shadeware:~$
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <sstream>
#include <algorithm>
int main(){
    std::cout << "Enter code:\n";
    std::string code;
    for (std::string line;!count(line.begin(),line.end(),'.');code.push_back('\n')){
        std::getline(std::cin,line);
        code += line;
    }  //теперь в code лежит весь код
    bool x=false,y=false;
    for (std::string::iterator it = code.begin(); it != code.end(); ++it){
        if (*it == '}') {y = false; std::cout << std::endl;}
        if (*it == '\n'){x = false; std::cout << std::endl;}
        if (x||y) std::cout << *it;
        if (*it == '{') y = true;
        if (*it == '/' && *(it+1) == '/') {x = true; ++it;}
    }
    return 0;
}
P.S. он считывает до точки
C++
1
!count(line.begin(),line.end(),'.')
Если что, переделайте до себя.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.06.2011, 15:43     С++ ВАЖНО. тяжело #7
Код
[nameless@desktop cpp]$ ./comments sample.pas
File sample.pas contents:
----------------------------------------------
const
  len = 26;
 
  {Это символы для выбора столбца таблицы}
  alpha_hor: string = 'abcdefghijklmnopqrstuvwxyz';
 
  {Здесь будут символы для выбора строки таблицы}
  alpha_ver: string = '';
 
var
  {Это собственно таблица кодирования}
  table: array[1 .. len, 1 .. len] of char;
 
{функция получает строку S и возвращает строку,
  полученную из исходной сдвигом на N позиций}
function shift(s: string; n: integer): string;
  begin
    s := copy(s, length(s) - pred(n), n) + s;
    delete(s, length(s) - pred(n), n); shift := s
  end;
 
var
  i, j, row, col: integer;
  s: string; ch: char;
 
  key: string;
  is_russian: boolean;
  f_in: file of char; f_out, f_key: text;
begin
  { Заполнение таблицы кодировки }
  for i := 1 to len do begin
    {получаем строку символов для текущей строки таблицы}
    s := shift(alpha_hor, pred(i));
    for j := 1 to len do
      table[i, j] := s[j];
    {
      не забываем первый символ заносить в "хранилище"
      для выбора строк по кодируемой букве
    }
    alpha_ver := alpha_ver + s[1]
  end;
 
  { связываем логические файлы программы с физическими файлами на диске }
 
  { файл с фразой для кодирования - открываем для чтения }
  assign(f_in, 'f_00in.txt');
  {$i-} reset(f_in); {$i+}
 
  { файл для сохранения результата - открываем для записи }
  assign(f_out, 'f_00out.txt');
  {$i-} rewrite(f_out); {$i+}
 
  {
    файл, содержащий ключевое слово - открываем для чтения,
    считываем слово в строковую переменную и закрываем файл
  }
  assign(f_key, 'f_00key.txt');
  {$i-} reset(f_key); {$i+}
  readln(f_key, key);
  close(f_key);
 
  { счетчик закодированных символов }
  i := 0;
  {до конца кодируемого файла делаем следующее:}
  while not eof(f_in) do begin
    { читаем очередной символ }
    read(f_in, ch);
    { находим по нему строку таблицы }
    row := pos(ch, alpha_ver);
    {
      эта переменная содержит значение успеха предыдущей операции
      (если True, то символ присутствует в таблице, иначе False)
    }
    is_russian := (row > 0);
    if is_russian then begin
      { Если символ присутствует в таблице, его надо кодировать }
 
      { увеличиваем счетчик закодированных символов }
      inc(i);
 
      {
        находим столбец по значению ключевого символа
        (операция mod используется, чтобы исключить выход
        за пределы ключа, т.к. длина ключа обычно меньше
        длины шифруемой последовательности)
      }
      col := pos(key[i mod (length(key))], alpha_hor);
      { и заменяем простой символ на зашифрованный (из таблицы) }
      ch := table[row, col];
    end;
    {
      если символ надо было шифровать, он уже зашифрован,
      если он не может быть зашифрован, он остался без изменений.
      Пишем его в выходной файл
    }
    write(f_out, ch)
  end;
 
  { И закрываем оба файла: исходный и зашифрованный }
  close(f_out);
  close(f_in)
end.
----------------------------------------------

Это символы для выбора столбца таблицы
Здесь будут символы для выбора строки таблицы
Это собственно таблица кодирования
функция получает строку S и возвращает строку,
  полученную из исходной сдвигом на N позиций
 Заполнение таблицы кодировки 
получаем строку символов для текущей строки таблицы

      не забываем первый символ заносить в "хранилище"
      для выбора строк по кодируемой букве
    
 связываем логические файлы программы с физическими файлами на диске 
 файл с фразой для кодирования - открываем для чтения 
$i-
$i+
 файл для сохранения результата - открываем для записи 
$i-
$i+

    файл, содержащий ключевое слово - открываем для чтения,
    считываем слово в строковую переменную и закрываем файл
  
$i-
$i+
 счетчик закодированных символов 
до конца кодируемого файла делаем следующее:
 читаем очередной символ 
 находим по нему строку таблицы 

      эта переменная содержит значение успеха предыдущей операции
      (если True, то символ присутствует в таблице, иначе False)
    
 Если символ присутствует в таблице, его надо кодировать 
 увеличиваем счетчик закодированных символов 

        находим столбец по значению ключевого символа
        (операция mod используется, чтобы исключить выход
        за пределы ключа, т.к. длина ключа обычно меньше
        длины шифруемой последовательности)
      
 и заменяем простой символ на зашифрованный (из таблицы) 

      если символ надо было шифровать, он уже зашифрован,
      если он не может быть зашифрован, он остался без изменений.
      Пишем его в выходной файл
    
 И закрываем оба файла: исходный и зашифрованный 
[nameless@desktop cpp]$
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
 
int main(int argc, char* argv[])
{
    if(argc != 2)
    {
    std::cerr << "Usage: " << *argv << " FILE" << std::endl;
    return 1;
    
    }
    
 
    std::ifstream ifs(argv[1]);
 
    if(!ifs)
    {
    std::cerr << "Can't open file " << argv[1] << std::endl;
    return 1;
    }
 
    std::cout << "File " << argv[1] << " contents:" << std::endl;
    std::cout << "----------------------------------------------" << std::endl;
    
    std::filebuf* pbuf = ifs.rdbuf();
    std::cout << pbuf << std::endl;
 
    size_t size = pbuf->pubseekoff(0, std::ios::end, std::ios::in);
    pbuf->pubseekpos(0, std::ios::in);
 
    char* buffer = new char[size];
 
    pbuf->sgetn(buffer, size);
 
    char *cbeg, *cend;
    
    cbeg = strchr(buffer, '{');
 
    std::cout << "----------------------------------------------" << std::endl;
    std::cout << std::endl;
    
    while(cbeg)
    {
    cend = strchr(cbeg, '}');
    if(!cend)
        break;
 
    fwrite(cbeg + 1, sizeof(char), cend - cbeg - 1, stdout);
    putchar('\n');
    cbeg = strchr(cbeg + 1, '{');
    }
    
    delete[] buffer;
    
    return 0;
}
schdub
 Аватар для schdub
2902 / 1246 / 222
Регистрация: 19.01.2009
Сообщений: 3,214
Завершенные тесты: 1
13.06.2011, 18:51     С++ ВАЖНО. тяжело #8
diagon, не обрабатываются комментарии в строках. Например, для такого файла:
Pascal
1
2
3
4
5
6
7
const str1 = '// commnent 1 in string';
      str2 = '{ commnent 2 in string }';
var x:integer; //variable
begin 
{some code}
readln; //pause
end.
Вот такой вывод:
Код
 commnent 1 in string';
 commnent 2 in string 

variable

some code

pause
Добавлено через 2 минуты
Nameless One, у Вас не обрабатываются много строчные комментарии в строках и почему-то не выведен последний коммент //pause. Вывод:
Код
oleg@oleg-laptop:~/src/tmp$ ./a.out code.pas
File code.pas contents:
----------------------------------------------
const str1 = '// commnent 1 in string';
      str2 = '{ commnent 2 in string }';
var x:integer; //variable
begin 
{some code}
readln; //pause
end.


----------------------------------------------

 commnent 2 in string 
some code
oleg@oleg-laptop:~/src/tmp$
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.06.2011, 18:56     С++ ВАЖНО. тяжело #9
schdub, как видно из кода, у меня обрабатываются только многострочные комментарии (появление символов '{', '}' в строковых литералах не обрабатывается).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2011, 20:17     С++ ВАЖНО. тяжело
Еще ссылки по теме:

C++ Тяжело ли написать утилитку, которая работает как DOS-команда "pause"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.06.2011, 20:17     С++ ВАЖНО. тяжело #10
Цитата Сообщение от schdub Посмотреть сообщение
diagon, не обрабатываются комментарии в строках.
Да там вообще мало что делается, фактически это тупо алгоритм, написанный на коленке=)
Я делал подобное задание в книге Страуструпа, только там нужно было удалить эти комментарии с учетом строковых констант, но исходник к сожалению не сохранился. Решал через вектор строк, в который заносил символы из считанной строки без учета собственно комментариев, использовал несколько (3 или больше) булевых переменных. В общем не сложно и здесь то же самое сделать, т.к. в паскале, насколько я помню, нету " а есть только '

Добавлено через 20 минут
Вот немного доработанный вариант, но баги еще могут быть, так как это очень халявное решение =)
Код
diagon@shadeware:~$ ./a.out
Enter code:
const str1 = '// commnent 1 in string';
      str2 = '{ commnent 2 in string }';
var x:integer; //variable
begin 
{some code}
readln; //pause
end.
----------------------------------------------------------------

variable
some code
pause
diagon@shadeware:~$
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <sstream>
#include <algorithm>
int main(){
        std::cout << "Enter code:\n";
        std::string code;
        for (std::string line;!count(line.begin(),line.end(),'.');code.push_back('\n')){
                std::getline(std::cin,line);
                code += line;
        }  
        std::cout << "----------------------------------------------------------------\n";
        bool x=false,y=false;
        unsigned q = 0;
        for (std::string::iterator it = code.begin(); it != code.end(); ++it){        
                if (*it == '}') {y = false; std::cout << std::endl; }
                if (*it == '\n') { if (x) std::cout << std::endl; x = false; }
                if (*it == '\'') ++q;
                if ((x||y)&&q%2==0) std::cout << *it;
                if (*it == '{') y = true; 
                if (*it == '/' && *(it+1) == '/' && q%2 == 0) {x = true; ++it;}
        }
        return 0;
}
Yandex
Объявления
13.06.2011, 20:17     С++ ВАЖНО. тяжело
Ответ Создать тему
Опции темы

Текущее время: 12:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru