Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Программы для расстановки табуляции в исх *.pas


Автор: zetxi815eb 31.1.2007, 23:28
Вот на каникулах захотелось мне сделать один проект. Я решил написать его из-за нашего препода по программированию. Мы ему сдаём лабы (файлы с расширением *.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. Можете обьяснить в чём трабла?

Автор: skyboy 31.1.2007, 23:40
надо начинать с конца.
Код

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.

Автор: Snowy 31.1.2007, 23:43
А может просто не использовать табуляцию и писать грамотно?

Автор: zetxi815eb 31.1.2007, 23:58
Snowy, как ты отступы делать будешь?

skyboy, спасибо...просто я думал, что процедура delete (x,y,z) работает иначе. Я ещё в String не шарю. Спасибо за помощь!

Автор: Snowy 1.2.2007, 00:26
Цитата(zetxi815eb @  31.1.2007,  23:58 Найти цитируемый пост)
Snowy, как ты отступы делать будешь?
Как и все нормальные люди - пробелами!

Автор: zetxi815eb 1.2.2007, 01:56
Snowy, я по Tab size=4 привык делать...и мне не охото долбить пробел 4 раза....к тому же размер табуляции можно менять...это очень удобно и чётко всё!

Автор: Snowy 1.2.2007, 02:02
Ну, вообще-то это должно настраиваться.
А во-вторых задача сводится к замене #9 на 4 пробела.

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

как же, интересно?  smile Что после удаления третьего символа в третьей позиции просто пусто? smile

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

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

Автор: zetxi815eb 1.2.2007, 20:31
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

Автор: Coder 7.2.2007, 07:47
zetxi815eb, отличная идея. я встречал такие программы для языка PHP, например. Для паскаля мне часто такой утилитки не хватало, когда разбирался в чужых исходниках.
как закончишь программу выкладывай! можно ее также на Делфи переписать, чтобы удобней работать было.

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

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

Coder, на делфе писать не стоит. Там и так не с чем работать. И весит она на паскале всего ничего.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)