Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программы для расстановки табуляции в исх *.pas, Вопросыи траблы, возникшие при создании 
:(
    Опции темы
zetxi815eb
Дата 31.1.2007, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот на каникулах захотелось мне сделать один проект. Я решил написать его из-за нашего препода по программированию. Мы ему сдаём лабы (файлы с расширением *.pas). Так вот, каждый раз он меняет размер табуляции в редакторе и если где-то стоит лишний пробел или неправильный отступ  - он просто не принимает...даж не компилирует... А когда ещё сдаёшь в последний момент кучу лаб и около препода выстраивается очередь...и вот ты написал прогу..простоял эту очередь, сдаёшь ему эту работу и он находит там лишний отступ или пробел... и не принимает из-за этого лабу...и ты идёшь убирать этот пробел и опять стаишь эту очередь....

Короче я хочу написать программу, которая берёт по строке из файла *.pas. Сперва удаляет все пробелы и табуляции...затем уже расставляет символ табуляции там, где это требуется.

Вот возникла проблема.

Значит для пробы это программа ищет символ '_',который имеет код 95.
1 тест:  
Ввод:   1_2_3
Вывод: 123uses crt;

2 тест:  
Ввод:   1_2__3 (после двойки 2 символа '_')
Вывод: 12_3

Код

uses crt;
var A:string;
    i:integer;
    tin,tout:text;
begin
    clrscr;
    assign (tin,'input.txt');
    reset (tin);
    assign (tout,'output.txt');
    rewrite (tout);
    while not Eof(tin) do begin
        readln (tin,A);
        for i:=1 to length(A) do begin
         writeln (byte(A[i]),'i=',i);
         if byte(A[i])=95 then delete (A,i,1);
        end;
        writeln (A);
        writeln (tout,A);
        readkey;
    end;
    close (tout);
    close (tin);
    readkey;
end.


Люди...я ещё не очень подружился с типом string. Можете обьяснить в чём трабла?
PM MAIL   Вверх
skyboy
Дата 31.1.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



надо начинать с конца.
Код

uses crt;
var A:string;
    i:integer;
    tin,tout:text;
begin
    clrscr;
    assign (tin,'input.txt');
    reset (tin);
    assign (tout,'output.txt');
    rewrite (tout);
    while not Eof(tin) do begin
        readln (tin,A);
        for i:=length(A) downto 1 do begin
         writeln (byte(A[i]),'i=',i);
         if byte(A[i])=95 then delete (A,i,1);
        end;
        writeln (A);
        writeln (tout,A);
        readkey;
    end;
    close (tout);
    close (tin);
    readkey;
end.

причина: положим, идем сначала.
слово "а_б_в__г___д"
по циклу:
i= 1 s="а_б_в__г___д"
i= 2 s="а_б_в__г___д" удаляем второй символ
i= 3 s="аб_в__г___д"   удаляем третий символ
i= 4 s="абв__г___д"     удаляем четвертый символ
i= 5 s="абв_г___д"       пятый символ - не "_", а "г", потому ничего не удаляем
i= 6 s="абв_г__д"         удаляем шестой символ... и т.д.
проблема в том, что когда мы удаляем 3(к примеру) символ, третим становится символ, который раньше был четвертым. И мы этот символ пропустим(ведь третий символ мы уже обработали!). Выхода два:
либо после удаления символа перезапускать цикл с предыдущим значением i, либо проходить строку, начиная с конца.
по второму пункту пример привел, а вот первый вариант:
надо начинать с конца.
Код

uses crt;
var A:string;
    i:integer;
    tin,tout:text;
begin
    clrscr;
    assign (tin,'input.txt');
    reset (tin);
    assign (tout,'output.txt');
    rewrite (tout);
    while not Eof(tin) do begin
        readln (tin,A);
        i:= 1;
        while i<= length(A) do
         begin
          writeln (byte(A[i]),'i=',i);
          if byte(A[i])=95 
           then 
            delete (A,i,1)
           else
            i:= i + 1;
         end;
        end;
        writeln (A);
        writeln (tout,A);
        readkey;
    end;
    close (tout);
    close (tin);
    readkey;
end.

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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



А может просто не использовать табуляцию и писать грамотно?
PM MAIL   Вверх
zetxi815eb
Дата 31.1.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Snowy, как ты отступы делать будешь?

skyboy, спасибо...просто я думал, что процедура delete (x,y,z) работает иначе. Я ещё в String не шарю. Спасибо за помощь!
PM MAIL   Вверх
Snowy
Дата 1.2.2007, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(zetxi815eb @  31.1.2007,  23:58 Найти цитируемый пост)
Snowy, как ты отступы делать будешь?
Как и все нормальные люди - пробелами!
PM MAIL   Вверх
zetxi815eb
Дата 1.2.2007, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Snowy, я по Tab size=4 привык делать...и мне не охото долбить пробел 4 раза....к тому же размер табуляции можно менять...это очень удобно и чётко всё!
PM MAIL   Вверх
Snowy
Дата 1.2.2007, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Ну, вообще-то это должно настраиваться.
А во-вторых задача сводится к замене #9 на 4 пробела.
PM MAIL   Вверх
skyboy
Дата 1.2.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(zetxi815eb @  31.1.2007,  22:58 Найти цитируемый пост)
просто я думал, что процедура delete (x,y,z) работает иначе. 

как же, интересно?  smile Что после удаления третьего символа в третьей позиции просто пусто? smile
PM MAIL   Вверх
Zero
Дата 1.2.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

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



zetxi815eb, я вот тоже табуляции недоверяю... smile 
А чем тебе пробелы не нравяться?? Их же не в каждой строчке вставлять надо, а только после необходимости отступа, а после нажатия ентер, курсор ставиться где нужно, и четыре пробела многовато, если будет много отступов, то плохо видно будет, ИМХО самый нормальный отступ 2 пробела. smile как в Делфи. smile Но я это только я так привык, другим мож по другому надо, но всёравно кнопкой таб польлзуються немногие. smile

Добавлено @ 11:52 
Цитата(Snowy @  1.2.2007,  02:02 Найти цитируемый пост)
А во-вторых задача сводится к замене #9 на 4 пробела.
 И кстати, это снови верно подметил... smile 
PM MAIL ICQ   Вверх
zetxi815eb
Дата 1.2.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Zero,  у меня стоит Tab size=4..мне удобно работать с табом...хочу делаюразмер таба 8, хочу 2. 

Короче прога Zetx Taber - Spacer будет универсальной!!! Пользователь сможет выбирать ставить пробелы,либо знак табуляции.

Вот уже сырую версию сделал с табами.... посмотрите как работает:

короче распакуйте архив...посмотрите файл input.txt.... запусти эксэшник...и должен создасться файл output.txt....затем сравни input.txt с output.txt http://zetxi815eb.jino-net.ru/forums/uploads/zetxtaber.rar


Это сообщение отредактировал(а) zetxi815eb - 1.2.2007, 20:32
PM MAIL   Вверх
Coder
Дата 7.2.2007, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zetxi815eb, отличная идея. я встречал такие программы для языка PHP, например. Для паскаля мне часто такой утилитки не хватало, когда разбирался в чужых исходниках.
как закончишь программу выкладывай! можно ее также на Делфи переписать, чтобы удобней работать было.
PM MAIL   Вверх
zetxi815eb
Дата 15.2.2007, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Довёл до ума программу. Теперь можно выбирать тип отступа. Либо табуляцию, либо пробел, указывая количества пробелов в отступе.
http://zetxi815eb.jino-net.ru/tabspace.rar

Потом ещё немного подработаю..и выдложу следующую версию.

Coder, на делфе писать не стоит. Там и так не с чем работать. И весит она на паскале всего ничего.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

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

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

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




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


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

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