Помощь - Поиск - Пользователи - Календарь
Полная версия: массив из строк
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
>hamka<
Когда есть массив из строк, то при добавлении нового элемента, он подсоединяется к предыдущей строке. А как же их разграничить.
Код

write('Введите количество сортируемых цифр ( не больше 10 ) --> ');
readln(n);
for I:=1 to length(n) do
begin
chislo2:=ord(n[i])-48;chislo:=chislo*10; chislo:=chislo2+chislo;
end;
if (chislo > 10) or (chislo=0) or (chislo2 < 0) or (chislo2 > 9) then
writeln('Некорректное значение');
k:=0;
for j:=1 to chislo do
begin
write('Введите ', j, '- ое число --> ');
readln (a[j]);
for s:=1 to length(a[j][s]) do
begin
ch2:=ord(a[j][s])-48; ch:=ch*10; ch:=ch2+ch; end;
writeln(ch);
....

если они разграничиваются ( ведь массив же ), то где же моя ошибка ? =((
Altair
бред какой-то..
можете задание сказать для того, что бы было понятно о чем речь вообще.. мне потому что не понятна ваша затея...
>hamka<
от пользователя получают 10 цифр ( их тип string ), далее из переводят в число (без val'а) по алгоритму : к последней цифре прибавляется предпоследняя*10 + предпредпоследняя*100 и т.д. , в итоге получается число smile.gif
далее идет заполнение массива числами ( которые сначала, являются строками) потом по этому же алгоритму идет их перевод в число. Далее я хочу эти числа занести уже в массив цифровой , а далее их сортировка методом "пузырька".
Но в проге у меня получается, что когда я заношу в строковый массив строку, она у меня переводится в число, но потом при занесении следущеей строки, число прибавляется к предыдущему ( хотя по идее не должно ). И как итог вместо массива из строк ( а потом и из чисел ) получается одна большая строка ( или число ).
Надеюсь я объяснила понятно smile.gif
Altair
Смотри-ка сюда...
Function strInt(s:string):longint;
var
i:byte; ss:longint;
begin
ss:=0;
for i:=1 to length(s) do
begin
 ss:=ss+(ord(s[i])-48)*trunc(Exp((length(s)-i)*Ln(10)));
end;
strInt:=ss;
end;

var
a:array[1..10] of string;
b:array[1..10] of longint;
i:integer;
begin
for i:=1 to 10 do readln(a[i]);
for i:=1 to 10 do b[i]:=strInt(a[i]);
{...}
end.

Функция strInt(s:string):longint; переводит из строки в число.. ошибки не учитываются...
дальше сама прога проста.. вводится 10 строк и переводится в 10 чисел..
на основе того ,что я дал, ты можешь все сделать дальше..
еще вопросы есть?
>hamka<
Цитата(Oleg_Z @ 23.02.05 21:54)
Смотри-ка сюда...
Function strInt(s:string):longint;
  ss:=ss+(ord(s[i])-48)*trunc(Exp((length(s)-i)*Ln(10)));


еще вопросы есть?

Спасибики!
Тока один еще вопрос: а после транк'а что за выражение такое, т.е. что оно делает по алгоритму перевода строки в число?
Altair
возведение в степень. Есть такая формула.
В данном случае возвожу 10 в степень соответствующую..
>hamka<
Перенесено из темы "Формирование вектора"

этот алгорит проверки на "не число" не в цикле у меня работает. А потом у меня должно происходить формирование вектора. И здесь такая ситуация-> с первым числом все нормально, а потом происходит выход из цикла. Идет переход на формирование вектора.
Код

...
begin
for i:=1 to chislo do
begin
Z:
write('Введите ', i, '- ое число --> ');
readln (a[i]);
for j:=1 to length (a[i]) do
begin
l:=ord (a[i][j])-48;
if (l< 0) or (l> 9) then begin writeln('Некорректное значение');
goto Z; end; end;
for i:=1 to chislo do
b[i]:=PEREVOD(a[i]);
SORTIROVKA (chislo,b);
end;
...

почему это происходит? и как правильно доделать эту задачу. Мне нужно, чтобы дальше было - "введите <cлед. число> и т.д.
volvo
Цитата(>hamka< @ 24.02.05 13:47)
как правильно доделать эту задачу. Мне нужно, чтобы дальше было - "введите <cлед. число> и т.д.

Я же предлагал: написать свою функцию чтения строки... Что-то типа вот этого:
Код
Uses Crt;
...
Function myRead: String;
 var s: string;
   ch: char;
 begin
   s := '';
   repeat
     ch := readkey;
     if ch in ['0' .. '9'] then
       begin
         write(ch); s := s + ch
       end;
   until ch = #13;
   writeln; myRead := s
 end;
...
{ в основной программе: }
for i:=1 to chislo do
 begin
   write('Введите ', i, '- ое число --> ');
   a[i] := myRead;
 end;
{ далее по тексту }


Теперь пользователь просто не сможет ввести те символы, которые он вводить не должен...
>hamka<
Так же это практически всю программу придется переписывать. А у меня уже все практически готово =(( Даж проверку на max значение сделала, когда можно вводить какие угодно символы. И все работает +) Тока когда в цикл подставляю, идет обработка тока первого элемента и все. Может можно как-нибудь сделать, чтобы не переписывать smile.gif
>hamka<
И еще такой вопросик. В программе я хочу проверить нажатую клавишу на <Enter>
Что я должна написать ?
Код
if n=……? then writeln.

как символ это не представить. А как символ из аски < Enter> как называется? Еще я прочитала про какие-то коды опроса клавиатуры =)).
Что это такое ?
volvo
Цитата(>hamka< @ 24.02.05 15:51)
В программе я хочу проверить нажатую клавишу на <Enter>
Что я должна написать?


А что я в предыдущем посте писал?
Цитата
    repeat
    ch := readkey;
    if ch in ['0' .. '9'] then
      begin
        write(ch); s := s + ch
      end;
  until ch = #13;

Это что такое, если не проверка, нажат ли <Enter>

Цитата(>hamka< @ 24.02.05 15:51)
как символ это не представить
blink.gif
>hamka<
Объединено из темы: "Enter не работает"

Код
begin
clrscr;
main:
writeln;
write('Введите количество сортируемых цифр ( не больше 10 ) --> ');
readln(n);
for j:=1 to length (n) do
begin
l:=ord (n[j])-48;
if (l< 0) or (l> 9) then begin writeln('Некорректное значение');
goto main; end; end;
goto Dalee;

Хелп! Почему этот кусок кода не реагирует на нажатие <Enter> как на некорректное значение? Ведь раньше все работало, а по мере увеличения проги работать перестало! Теперь просто переход на новую строчку и вылет из программы. Что делать?

Продолжайте обсуждение своей задачи в одном топике
Altair
"жуть. " (С)

1. убрать метки.
2. показать весь код.

3. тогда поговорим.
>hamka<
Вот программа, которая не работает. не знаю почему =)) не вижу я своих ошибок.
она простая. многие в моей группе ее за 2 часа написали. причем у них программа работала даже с ошибками в коде, которые видели все. а у меня...
я плачу =((


а вот собственно и задание.
Получение от пользователя до 10 ( и 10) целых чисел. Сортировка , вывод на экран.
все элементы-целые простые числа. Цель -> максимальная защита "от дурака", т.е. хоть ногами по клавиатуре прыгай, но программа должна быть полностью рабочей ( без каких-либо вылетов)
volvo
Нет уж, увольте ... Разбираться в такой программе просто несерьезно... Сплошные GOTO... Избавитесь от них, тогда пожалуйста. А так - :no:
Altair
вот программа. работает по заданию. Тестил в BPW если что...
можно топтать клаву, все равно работает.
Если встречаются символы, просто игнорирует их.
Код

Const
Count=10;
Type
arrType = Array[1 .. Count] Of Longint;

Procedure Bubble(Var ar: arrType; n: integer);
Var i, j, T: Integer;
Begin
  For i := 1 To n Do
    For j := n DownTo i+1 Do
      If ar[Pred(j)] > ar[j] Then { < }
        Begin
          T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
        End
End;

Function strInt(s:string):longint;
var
i:byte; ss:longint;
setc:set of char;
begin
setc:=['0'..'9'];
ss:=0;
for i:=1 to length(s) do
begin
 If s[i] in setc then ss:=ss+(ord(s[i])-48)*trunc(Exp((length(s)-i)*Ln(10)));
end;
strInt:=ss;
end;

var
s:string;
a:array[1..Count] of string;
b:arrtype;
i,n:integer;
begin
write('Сколько будем вводить чисел:'); readln(n);
For i:=1 to n do readln(a[i]); {ввод 10 чисел}
For i:=1 to n do b[i]:=StrInt(a[i]); {переводим в числа}
Bubble(b,n); {сортируем}
clrscr;
for i:=1 to n do writeln(b[i]); {вывод на экран отсортирвоанных чисел}
end.
>hamka<
Вот моя модифицированная программа, но она кажеЦа не работает вообще =))
Такая глючная. Ужас!
если набрать число, то вводится тока одно. При наборе букв, вообще вылетает. Недочетов масса. Мож как нибудь можно свою передедать? Там ведь только на <Enter> не реагирует. + цикл не проходит . ( LABA_1)
Altair
а чем не устраивает тот вариант что я предложил?
может там просто что-то не понятно тебе?
>hamka<
ну, во-первых, все-таки вылетает.
потом у меня программа диалоговая, т.е. если не цифры - сообщение и повторный ввод. А в этой все воспринимается. И самое главное "вылетает"

Плиз, помогите кто-нить передалать мою, чтобы не было гоуту, и чтобы работало smile.gif
Мне надо сдавать уже в четверг. Это вопрос гордости Ж)
Altair
1. она не вылетает.
2. а исправить программу для повторного ввода слабо???
>hamka<
ВЫЛЕТАЕТ! Я тож проверяла =))
А буквы она позволяет вводить! А исправлять - это все-равно, что переписывать, а в своей, я хоть понимаю, что делаю ;)
volvo
Значит так... Или здесь приводятся тесты для программы, или я закрываю тему. Переделывать никто ничего не будет, т.к. кроме автора никто разобраться в _той_ программе не сможет...
Altair
ну вот с повторением ввода..
Код

Const
Count=10;
Type
arrType = Array[1 .. Count] Of Longint;

Procedure Bubble(Var ar: arrType; n: integer);
Var i, j, T: Integer;
Begin
  For i := 1 To n Do
    For j := n DownTo i+1 Do
      If ar[Pred(j)] > ar[j] Then { < }
        Begin
          T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
        End
End;

Function strInt(s:string):longint;
var
i:byte; ss:longint;
setc:set of char;
begin
setc:=['0'..'9'];
ss:=0;
for i:=1 to length(s) do
begin
 If s[i] in setc then ss:=ss+(ord(s[i])-48)*trunc(Exp((length(s)-i)*Ln(10)));
end;
strInt:=ss;
end;

var
s:string;
a:array[1..Count] of string;
b:arrtype;
i,n,j:integer;
setc:set of char;
pr:boolean;
begin
setc:=['0'..'9'];
write('Сколько будем вводить чисел:'); readln(n);
For i:=1 to n do
begin
 repeat
  readln(a[i]); {ввод 10 чисел}
  pr:=false;
  s:=a[i];
  For j:=1 to length(s) do If not(s[j] in setc) then pr:=true;
 until not pr;
end;
For i:=1 to n do b[i]:=StrInt(a[i]); {переводим в числа}
Bubble(b,n);
clrscr;
for i:=1 to n do writeln(b[i]);
end.
>hamka<
при_беспорядочном_стуке_по_клавиатуре_всем
_пальчиками ->вылетает
это подходит под определение теста для программы ?

зы : а это программа воспринимает буквы тож нормально?. В прошлой она подставляла где буквы нули =)

а эта если встречает буквы, просит снова ввести!
volvo
Нет, не подходит...
Закрыто
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.