Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2012, 20:06   #1
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию Запуск программы (Delphi)

Всем доброго времени суток! Помогите пожалуйста разобраться с работой программы при запуске. Сам код объяснять я не прошу. При запуске почему программа просматривает только 6 введенных символов а
дальше шестого не видит(то есть если ввести stev7n дает 5 и если ввести stev7nd тоже дает 5, символ d не смотрит. Почему?

Вот условие задачи для понятности
Напишите функцию nonalpha, которая получает параметр str типа string и возвращает позицию его первой литеры, не являющейся буквой(как латинского, так и русского алфавитов) строчной или прописной. Например, nonalpha(‘stev7n’) дает 5.

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows;

var
  s: string;

function noalpha(var st: string): integer;
var
  i: integer;
  b: set of char;
begin
  noalpha := -1;
  if length(st) = 0 then exit;
  i := 1;
  b := ['A'..'Z', 'a'..'z', chr(192)..chr(255)];
  while (st[i] in b) and (i <= length(st)) do inc(i);
  if i <= length(st) then
    noalpha := i;
end;

begin
  setconsolecp(1251);
  setconsoleoutputcp(1251);
  readln(s);
  writeln(noalpha(s));
  readln;
end.
Начинающий програм вне форума Ответить с цитированием
Старый 22.05.2012, 20:09   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
символ d не смотрит. Почему?
а вчесть чего он должен его видеть?
буква как буква, причём тут она?
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 22.05.2012, 20:23   #3
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Извините за непонимание, просто я еще не такой специалист как Вы. Я не могу просто понять почему функция смотрит только первые 6 символов? Почему только 6 ?
Начинающий програм вне форума Ответить с цитированием
Старый 22.05.2012, 20:44   #4
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

так давай я тебе пошагово обьясню! смотрим на твой код
Цитата:
Код:
while (st[i] in b) and (i <= length(st)) do inc(i);
  if i <= length(st) then
    noalpha := i;
как он у тебя работает
пока i-тый символ равен букве мы переходим к следующему символу!
если у нас будет цифра
то мы выходим из цикла и возвращаем позицию цифры!
другими словами
со словом stev7n и со словом stev7nd
цикл перестанет работать на символе 7 и i будет равен 5
Пойми ты не количество считаешь букв а высчитываешь первую позицию цифры!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 22.05.2012, 21:17   #5
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Я Вам очень благодарен за столь подробное объяснение! Теперь я понял! У меня еще один вопрос есть по задаче из темы файлы, там я не могу разобраться в процедуре, если Вас не затруднит объясните алгоритм ее работы. Я с этим true и false запутался. Если можно бы без них написать, думаю было бы проще для понимания.

Процедура заносит в отдельный файл записи об отличниках.
Код:
procedure Task(var f: tfile; var name: string);
var
  n, i: integer;
  rec: student;
  f2: tfile;
  b, c, d: boolean;
  name2: string;
begin
  write('Введите имя файла для результатов: ');
  readln(name2);
  reset(f);
  assign(f2, name2);
  rewrite(f2);
  writeln('Файл "', name2, '" создан!');
  write('Ищем записи, удовлетворяющие условию... ');
  for n := 0 to Filesize(f) - 1 do     
  begin
    b := true;
    c := true;
    i := 1;
    d := true;
    seek(f, n);               
    read(f, rec);
    while (i <= 5) and d do
    begin
      if (rec.results[rec.curs * 2, i].mark < 4) then d := false;
      inc(i);
    end;
    i := 1;
    if d then  
    begin
      while c and (i <= 5) do
      begin
        if rec.results[rec.curs * 2, i].mark = 5 then
          if b = true then
            b := false
          else
            c := false;
        inc(i);
      end;
      if c then
      begin
        writeln('Найдена запись ', n + 1);
        write(f2, rec);
      end;
    end;
  end;
  closefile(f);
  closefile(f2);
end;
Начинающий програм вне форума Ответить с цитированием
Старый 22.05.2012, 21:19   #6
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

описание структуры покажите!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 22.05.2012, 21:25   #7
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Код:
type
  Tsession = array[1..10, 1..5] of record
    name: string[10];
    mark: 1..5;
  end;
  student = record
    FIO: string[40];
    curs: 1..5;
    group: 1..9;
    results: Tsession;
  end;
  TFile = file of student;
var k: integer;
  fname: string;
  f: TFile;
Начинающий програм вне форума Ответить с цитированием
Старый 22.05.2012, 21:28   #8
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Вот вся программа
Код:
program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows;

type
  Tsession = array[1..10, 1..5] of record
    name: string[10];
    mark: 1..5;
  end;
  student = record
    FIO: string[40];
    curs: 1..5;
    group: 1..9;
    results: Tsession;
  end;
  TFile = file of student;
var k: integer;
  fname: string;
  f: TFile;

procedure Read_student(var st: student);
var
  i, j: integer;
begin
  with st do
  begin
    write('Введите ФИО: ');
    readln(FIO);
    write('Введите курс: ');
    readln(curs);
    write('Введите группу: ');
    readln(group);
    writeln('Введите результаты сессий:');
    i := 1;
    repeat
      writeln('Сейссия №', i, ': ');
      for j := 1 to 5 do
      begin
        write('Название ', j, '-го экзамена: ');
        readln(results[i, j].name);
        write('Оценка за ', j, '-й экзамен: ');
        readln(results[i, j].mark);
      end;
      inc(i);
    until (i = curs * 2 + 1);
  end;
  writeln('Ввод закончен!');
end;

procedure write_student(var st: student);
var
  i, j: integer;
begin
  with st do
  begin
    writeln(FIO, ', ', curs, ' курс, ', group, ' группа.');
    for i := 1 to curs * 2 do
    begin
      write('  Сессия ', i, ': ');
      for j := 1 to 5 do
        write(results[i, j].name, ': ', results[i, j].Mark, ', ');
      writeln;
    end;
  end;
end;

procedure New_file(var f: tfile; var name: string);
begin
  write('Имя нового файла: ');
  readln(name);
  if not fileexists(name) then
  begin
    assign(f, name);
    rewrite(f);
    writeln('Файл "', name, '" создан!');
    closefile(f);
  end;
end;

procedure Open_file(var f: tfile; var name: string);
begin
  write('Имя файла для открытия: ');
  readln(name);
  assignfile(f, name);
  reset(f);
  closefile(f);
  writeln('Файл "', name, '" открыт!');
end;

procedure Add_rec(var f: tfile; var name: string);
var
  rec: student;
  i, n: integer;
begin
  reset(f);
  seek(f, Filesize(f));
  write('Введите количество студентов: ');
  readln(n);
  for i := 1 to n do
  begin
    writeln('Ввод ', i, ' студента из ', n);
    Read_student(rec);
    write(f, rec);
    writeln('Запись добавлена!');
  end;
  closefile(f)
end;

procedure Task(var f: tfile; var name: string);
var
  n, i: integer;
  rec: student;
  f2: tfile;
  b, c, d: boolean;
  name2: string;
begin
  write('Введите имя файла для результатов: ');
  readln(name2);
  reset(f);
  assign(f2, name2);
  rewrite(f2);
  writeln('Файл "', name2, '" создан!');
  write('Ищем записи, удовлетворяющие условию... ');
  for n := 0 to Filesize(f) - 1 do
  begin
    b := true;
    c := true;
    i := 1;
    d := true;
    seek(f, n);
    read(f, rec);
    while (i <= 5) and d do
    begin
      if (rec.results[rec.curs * 2, i].mark < 4) then d := false;
      inc(i);
    end;
    i := 1;
    if d then
    begin
      while c and (i <= 5) do
      begin
        if rec.results[rec.curs * 2, i].mark = 5 then
          if b = true then
            b := false
          else
            c := false;
        inc(i);
      end;
      if c then
      begin
        writeln('Найдена запись ', n + 1);
        write(f2, rec);
      end;
    end;
  end;
  closefile(f);
  closefile(f2);
end;

procedure View_file(var f: tfile; var name: string);
var
  i: integer;
  rec: student;
begin
  reset(f);
  for i := 0 to Filesize(f) - 1 do
  begin
    read(f, rec);
    write('№', i + 1, ' ');
    write_student(rec);
  end;
  writeln('Вывод закончен!');
  closefile(f);
end;

begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
fname:='';
 repeat                                   
  writeln('Меню:');
  writeln('1 - Создать файл');
  writeln('2 - Открыть файл');
  writeln('3 - Добавить запись');
  writeln('4 - Занести в отдельный файл записи об отличниках.');
  writeln('5 - Отобразить содержимое файла');
  writeln('0 - Выход');
  write('Ваш выбор: ');
  repeat
   readln(k);                                            
   if not k in [0..9] then writeln('Некорректный ввод'); 
  until k in [0..9];
  case k of                                              
    1: New_file(f,fname);
    2: Open_file(f,fname);
    3: Add_rec(f,fname);
    4: Task(f,fname);
    5: View_file(f,fname);
    end;
  until k=0;
end.
Начинающий програм вне форума Ответить с цитированием
Старый 22.05.2012, 21:32   #9
Начинающий програм
Форумчанин
 
Аватар для Начинающий програм
 
Регистрация: 22.11.2011
Сообщений: 201
По умолчанию

Вот условие задачи

Создайте файл Студент. Из файла Студент занесите в отдельный файл записи об отличниках.
Начинающий програм вне форума Ответить с цитированием
Старый 23.05.2012, 13:30   #10
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Ай-яй-яй... А что это я вижу такую же точно задачку от Анастасия02? Не клон ваш, случаем? Или вы телепатически догадались, что она в 20:50 задаст такую задачку, и горите желанием помочь девушке?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запрет на запуск программы (delphi) Johny91 Помощь студентам 4 21.03.2012 11:26
Нестабильный запуск Delphi программы в WinXP p1p3nn Софт 14 17.11.2010 16:07
Delphi: запуск программы из командной строки с параметрами kaa1977 Помощь студентам 6 22.03.2010 10:03
Запуск программы в Delphi Cannibal Помощь студентам 2 11.10.2008 16:13
Запуск программы на выполнение из другой программы. ViNcHeStEr Паскаль, Turbo Pascal, PascalABC.NET 6 18.06.2008 14:33