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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2009, 14:48   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию определение количества повторяющихся элементов в строке

Пробую написать программу для определения количества повторяющихся элементов в строке (по 6 символов в строке из 600).

В принципе все написал, но выводит бред.

Код:
unit Unit28;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, XPMan;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    RichEdit1: TRichEdit;
    XPManifest1: TXPManifest;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
 F:TextFile;
 N,M:Integer;
 S:String;
begin
 AssignFile(F,'Arc.arc');
 Rewrite(F);
 For N:=1 to 600 do
  Begin
   M:=Random(9)+1;
   S:=IntToStr(M);
   Write(F,S);
  End;
 CloseFile(F);
Windows.Beep(700,700);
Windows.Beep(600,600);
Windows.Beep(500,500);
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
 F:TextFile;
 MasS:Array[1..100] of String;
 MasN:Array[1..100] of Integer;
 S,CurS:String;
 M,N,Nez,PP:Integer;
 CurOn:Boolean;
begin
 CurOn:=False;
 Nez:=1;
 AssignFile(F,'Arc.arc');
 Reset(F);
 ReadLn(F,S);
 While S<>'' do
  Begin
   CurS:=Copy(S,1,6);
   For N:=1 to 100 do
    Begin
     If CurS = MasS[N] Then
      Begin
       CurOn:=True;
       Inc(MasN[N]);
      End;
     If (N = 100) And (CurOn = False) Then
      Begin
       MasS[Nez]:=CurS;
       Inc(Nez);
      End;
     CurOn:=False;
     Delete(S,1,6);
    End;
  End;
 Windows.Beep(700,700);
 Windows.Beep(500,500);
 Windows.Beep(600,600);

 For N:=1 to 100 do
  For M:=1 to 99 do
   If MasN[M]<MasN[M+1] Then
    Begin
     PP:=MasN[M];
     MasN[M]:=MasN[M+1];
     MasN[M+1]:=PP;
    End;
  For N:=1 to 100 do
   RichEdit1.Lines.Add(MasS[N]+'              '+IntToStr(MasN[N]));

end;

end.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 09.08.2009, 15:20   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
В принципе все написал, но выводит бред.
Извини, но что написал, то и выводит. Конкретно задание можно? Желательно полностью.
puporev вне форума Ответить с цитированием
Старый 09.08.2009, 16:05   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Попробую объяснить:
При нажатии на кнопку 1 (procedure TForm1.Button1Click(Sender: TObject); )
В файл записывается 600 чисел от 1 до 9.
По нажатию на кнопку 2 (procedure TForm1.Button2Click(Sender: TObject); )
Программа разбивает строку из 600 символов на группы из 6-ти:
Код:
CurS:=Copy(S,1,6);
Delete(S,1,6);
Далее проверяется наличии такой последовательности в массиве из строк.
Если такая последовательность есть, то в параллельном массиве типа Integer прибавляем номеру последовательности единицу.
Если такая последовательность не обнаружена, добавляем её пользуясь числом Nez - первый Nezаполненный элемент массива из строк.
Затем сортируем массивчик и выводим в Rich.
--------------------------------------------------------------------------------------------------
Нашел две маленькие ошибки, не исправляющие программу.
Строки
Код:
    Delete(S,1,6);
    End;
  End;
Следует заменить на
Код:
    
    End;
   Delete(S,1,6);
  End;
И еще
Код:
Begin
       MasS[Nez]:=CurS;
       Inc(Nez);
      End;
на
Код:
Begin
       MasS[Nez]:=CurS;
       Inc(MasN[Nez]);
       Inc(Nez);
      End;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 09.08.2009 в 16:14. Причина: Ого!
Alex Cones вне форума Ответить с цитированием
Старый 09.08.2009, 16:39   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Мне кажется надо сначала из строки создать(наполнить) массив или в цикле
for i:=1 to 100 do
MasS[i]:=copy(s,(i-1)*6+1,6)//по 6 символов
или как у тебя через удаление.
А потом работать с этим массивом.
puporev вне форума Ответить с цитированием
Старый 09.08.2009, 17:00   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Что-то я не представляю себе последовательность команд, которые будут поочередно сравнивать между собой 100 элементов (в тестовой версии, в рабочей собираюсь ставить около 150 тыс) и куда тогда будет заполнятся второй массив? если к примеру у двух элементов стрингового массива одинаковые значения, то в "пользу кого будет передано очко"?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 09.08.2009, 17:07   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Как я понял задачу в Вашем изложении и для такого количества как Вы написали, то я бы сделал так.
Код:
procedure TForm1.Button2Click(Sender: TObject);
Var
 F:TextFile;
 MasS:Array[1..100] of String;
 MasN:Array[1..100] of Integer;
 S:String;
 i,j,PP:Integer;
begin
AssignFile(F,'Arc.txt');
Reset(F);
ReadLn(F,S);
//создаем массив строк
for i:=1 to 100 do
MasS[i]:=copy(s,(i-1)*6+1,6);
//обнуляем массив встречаемости
for i:=1 to 100 do
MasN[i]:=0;
//ищем повторения
for i:=1 to 100 do
for j:=1 to 100 do
//если находим повторение добавляем 1 в соответствующую ячейку
if MasS[i]=MasS[j] then MasN[i]:=MasN[i]+1;
Windows.Beep(700,700);
Windows.Beep(500,500);
Windows.Beep(600,600);
//сортировка
For i:=1 to 99 do
For j:=i+1 to 100 do
If MasN[i]<MasN[j] Then
    Begin
     PP:=MasN[i];
     MasN[i]:=MasN[j];
     MasN[j]:=PP;
    End;
For i:=1 to 100 do
RichEdit1.Lines.Add(MasS[i]+'              '+IntToStr(MasN[i]));

end;
puporev вне форума Ответить с цитированием
Старый 09.08.2009, 17:30   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Спасибо, заработало, правда выдает Stack overflow на больших значениях, но это уже моя проблема.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 09.08.2009, 17:31   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
выдает Stack overflow на больших значениях,
Задай массив
MasS:Array[1..100] of String[6];
puporev вне форума Ответить с цитированием
Старый 09.08.2009, 17:35   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Я уже поменял размер стринга и размер максимально допустимого стака в опциях проекта. Все работает, еще раз спасибо.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 09.08.2009, 17:41   #10
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Alex Cones
дошел до строчки
Код:
If CurS = MasS[N] Then
- действительно будет "бред"

Локальные переменные не инициализируются - значит у тебя первоначально в массиве MasS может быть что угодно (мусор свободной памяти)
(дальше пока не смотрел)
s.Creator вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Определение количества слов в тексте. Evgesha Помощь студентам 17 12.04.2011 18:58
программа для посчета количества символов в строке revan-8 Общие вопросы C/C++ 13 26.07.2009 16:52
функция для подсчета количества символов в строке типа std::string a Артэс Общие вопросы C/C++ 3 06.07.2009 17:43
поиск одинаковых элементов одномерного массива и их количества MyQwErTy Помощь студентам 2 28.02.2009 17:17
Подсчет количества заданных символов в строке Mihailo Помощь студентам 3 23.12.2007 11:58