2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Помогите со строками В Паскале
Сообщение17.03.2008, 00:31 
Не могу разобраться со строковым типом в Turbo Pascal..Нужно решить задачу...Дано: Вводимая информация:набор строк,содержащие следующие поля:Фамилия вкладчика банка(10 позиций),величина вклада(8 поз), и срок в месяцах(2 позиции).На который положен вклад..Нужно:определить вкладчика имеющего самый крупный вклад из числа положенных на год..
Т.Е. Должно получаться так: к примеру,вводим 10 вкладчиков их фамилии,вклад и срок..Программа выбирает наибольший вклад и срок больше года..В результате должно вывести 10 позиций под фамилию,8 позиций под вклад и 2 позиции под срок вклада.
Например результат:
Вкладчик: Попов----- Величина: 20000----- Срок: 24 ----------- это пробелы которые не заполненные..
Мне не понятно как можно работать в строковом типе с числовым форматом.Вклад и срок идут как числовой формат..А в результате нужно вывести все как строковой...

 
 
 
 
Сообщение17.03.2008, 19:35 
Аватара пользователя
Я не понял, входные строки уже даны?
Т.е. например, такие строки:
Код:
Иванов    10000   11
Петров    50000   12
Сидоров   5000    1
Попов     20000   24

уже даны в таком формате?
Тогда Вам нужно, наверное, наоборот, получить из этих строк числовые значения?
Это просто:
Код:
var
  Code: Integer;
...
{Пусть S содержит строку в таком формате, в числовую переменную Deposit нужно извлечь сумму вклада, а в числовую переменную Months - срок в месяцах}
Val(Trim(Copy(S,11,8)),Deposit,Code);
if Code <> 0
then begin
  { если строка со вкладом не содержит правильное число, то приходим сюда (такого не должно быть) }
  Exit;
end;
Val(Trim(Copy(S,19,2)),Months,Code);
if Code <> 0
then begin
  { если строка со сроком вклада не содержит правильное число, то приходим сюда (такого не должно быть) }
  Exit;
end;
{ Всё, теперь в Deposit сумма вклада, в Months срок в месяцах }


Добавлено спустя 6 минут 34 секунды:

Да, забыл, что в Turbo Pascal функции Trim нету. Ловите:
Код:
function Trim(const S: string): string;
var
  I, L: Integer;
begin
  L := Length(S);
  I := 1;
  while (I <= L) and (S[I] <= ' ') do Inc(I);
  if I > L then Trim := '' else
  begin
    while S[L] <= ' ' do Dec(L);
    Trim := Copy(S, I, L - I + 1);
  end;
end;

 
 
 
 
Сообщение17.03.2008, 23:07 
Благодарен за ответ..Но я пока начинающий пользователь..И толком не все еще понимаю..Нельзя ли как нибудь попроще..
Нет строки не даны..Их должен задать сам пользователь и получить желемый результат (Фамилию вкладчика положившнго наибольший вклад,на срок больший 12 месяцев)
Должно получиться так, пользователю отводится 10 позиций под фамилию,8 позиций под вклад и 2 позиции под срок вклада..Пользователь вводит с клавиатуры.Примерно так:
Пример

Фамилия:Сидоров--- Вклад:12000--- Срок:24
Фамилия:Петров----- Вклад:24000--- Срок:5-
Фамилия:Александринович Вклад:280000-- Срок:23

{Примечание:--------- <= Это пробелы под отводимые позиции в строках..
Программа должна выдать результат..Фамилию вкладчика положивший наибольший вклад на срок больше 12 месяцев.В этом примере это выглядит так.Окончательный результат работы программы..}

Фиамилия:Александри Вклад:280000 Срок:23

{Примечание:Именно Александри,потомучто под фамилию отводиться 10 позиций}

Вот никак не пойму как это сделать...Тут присутствует и строковой и числовой форматы..

 
 
 
 
Сообщение18.03.2008, 12:44 
Аватара пользователя
Понимаете, для начинающего у Вас тут зачем-то усложнённая задача.

Смотря что Вы изучаете, конечно. Если Вы изучаете простейшие алгоритмы, то всякие вспомогательные задачи (обрезание или дополнение введённых значений до заданного числа символов, перевод из строки в число и наоборот, ввод/вывод) только мешаются под ногами, препятствуя вникнуть в суть алгоритма (поиск максимального числа при дополнительном условии).

Поэтому насчёт попроще мне не понятно. Кто Вам задал задачу и в рамках какой изучаемой темы?

 
 
 
 
Сообщение18.03.2008, 22:05 
Да я Вас понимаю,замороченная задача...Это у нас такие азы программирования по языку Паскаль..Тогда проще объяснить...Как вообще можно сравнить строковой тип (на этом примере) Возьмем пока вклад,пусть будет 10 вкладчиков строки: их фамилии и вклад...Как мне сравнить все десять вкладов и вывести фамилию вкладчика положившего наибольший вклад..Т.Е результат:
Фамилия вкладчика:Петров сумма вклада:100000

Спасибо!!!

 
 
 
 
Сообщение19.03.2008, 14:08 
Аватара пользователя
В этом сообщении в первом куске кода я показал, как нужно извлечь информацию о размере депозита и сроке. Как извлечь информацию о фамилии? Подумайте сами, в примере всё необходимое для этого есть. Подсказка: нужно скопировать часть строки от 1 до 10-й позиции и поместить её в специально заведённую для этого строковую переменную.

Далее нам потребуется сравнивать только переменные числовых типов (ведь переменные Deposit и Months --- числовые). Это ведь Вы умеете?

Чтобы найти максимальный депозит и его владельца, нужно завести отдельную опять же числовую переменную, которую можно назвать, например, MaxDeposit и отдельную строковую переменную, в которой будет храниться фамилия вкладчика, сделавшего максимальный вклад. Например, она будет называться MaxDepositName.

В цикле перебираем все строки и в MaxDeposit заносим текущее максимальное значение, а в MaxDepositName - текущую фамилию вкладчика, внёсшего максимальную сумму.
По окончании цикла MaxDepositName будет содержать фамилию самого богатого вкладчика, а MaxDeposit - размер его вклада.

Если дополнительно нужно будет вывести срок, то для этого опять же нужно будет завести отдельную переменную, MaxDepositPeriod, в которую в цикле будет заноситься срок максимального текущего вклада.

Добавлено спустя 20 минут 30 секунд:

Ещё одна заморочка --- это ввод данных.

Чтобы разобраться с этой заморочкой, нужно сначала определиться, какой именно числовой тип нам нужен для хранения размера и спрока вкладов. Я подозреваю, что нужно завести переменные типа Longint. Тогда мы не сможем работать с вкладами с точностью до копейки и со сроками вкладов, являющимися нецелым числом месяцев, но, по-моему, всё равно банки так и округляют. Зато исчезнут заморочки с тем, как вводить/выводить нецелые данные (например, разделитель целой и дробной частей может быть запятой или точкой, число 100 можно выводить как '100' и как '100.00').
Теперь, при вводе фамилии, вклада и срока, достаточно будет обрезать эти данные до нужного числа позиций, а недостающие позиции забить дополнить пробелами справа:
Код:
var
  S, S1: string;
  Deposit, Months: Longint;
{...}
  Write('Фамилия вкладчика: '); ReadLn(S);
  { Обрезаем фамилию до 10 символов }
  S := Copy(S,1,10);
  { Дополняем пробелами справа, если нужно }
  while Length(S) < 10 do
    S := S + ' ';
  { В переменной S1 будут содержаться и фамилия, и вклад, и срок }
  S1 := S;
  Write('Размер вклада: '); ReadLn(Deposit);
  { Переводим из числа в строку }
  Str(Deposit,S);
  { Далее нужно опять же обрезать эту строку до 8 символов
    и дополнить справа пробелами, если нужно. Напишите сами }
  {...}
  { Добавляем к S1 размер вклада }
  S1 := S1 + S;
  Write('Срок вклада в месяцах: '); ReadLn(Months);
  { По аналогии с Deposit }
  {...}
  { Добавляем к S1 срок }
  S1 := S1 + S;
  { Теперь в S1 у нас находится правильно сформированная строка }


По идее, в учебной задаче по азам программирования не должно быть таких заморочек. Если Вы специально не изучаете в этой теме, например, структуры данных, операции над строками и т.п.

 
 
 
 
Сообщение20.03.2008, 23:08 
Благодарен Вам...Со строковым типом я разобрался..Как переводить из числового в строковый и выделять необходимые позиции....Ну есть конечно небольшие глюки,но я думаю сам разберусь...
У меня есть еще один вопрос.Не могли бы вы его прокомментировать?? Например дан строковой тип...В котором занесено определенное число фамилий...Как мне вывести те фамилии которые начинаються на букву Т..
Я понимаю это надо делать через условие...Только как его задать и вывести не одну фамилию а несколько..Вдруг там будет много фамилий на букву Т..

Спасибо..

 
 
 
 
Сообщение21.03.2008, 13:20 
Аватара пользователя
ZoLoToy писал(а):
...дан строковой тип...В котором занесено определенное число фамилий...

М-дя, терминология у Вас хромает. "Она хорошая. Но хромает." (C) Винни Пух :)
Дана переменная строкового типа...

И всё равно непонятно. Обычно несколько фамилий заносятся не в одну строку, а в массив строк. Во-первых, потому что в одной строке места может не хватить (255 символов максимум). Во-вторых, непонятно как Вы собираетесь хранить несколько строк в одной. Ну вот вроде бы по аналогии: отвести фиксированное (а какое?) число символов на каждую фамилию, при необходимости обрезать или дополнять справа пробелами. Но это нужно обязательно указывать в условии, ибо телепаты в отпуске.
Напишите условия задачи так, чтобы понять её неправильно было бы невозможно. Тогда, может быть, получится помочь.

 
 
 
 
Сообщение21.03.2008, 22:12 
Дистанционное обучение подобно заочному - на деле не показать.
Тексты программ тоже не лучший способ помочь. Лучше всё-таки описывать алгоритм.
1, Определяем (задаем) 3 массива (строковый, числовой, числовой) одинаковой длины LM.
2. Задаем счетчик (индекс IM) , он будет указывать на строку сразу в трех массивах.
3. Заполняем массивы данными.
4. Задаем резервную переменную числового формата, например RP.
5.Задаем счетчик цикла, равный длине массивов (SC).
6. Запускаем цикл со счетчиком цикла (от 1 до длины массива LM)
Внутри тела цикла проверяем: Если очередной вклад (2 массив)больше RP и срок вклада (3 массив) больше 12, то ((RP=вкладу, IM=SC))..... конец цикла.
7 Проверили все вклады, максимальный вклад, со сроком более 12, нашли. На него будет указывать cчетчик массива IM (например 8). Теперь осталось вывести на печать 8-ю строку всех трех массивов.

 
 
 
 
Сообщение22.03.2008, 11:58 
Да я согласен...С терменологией у меня проблемы...Пока до хорошего мне еще плыть и плыть..
Значит условие задачи такое:
Вводимая информация: строка содержащая следующие поля: количество учеников в классе и их фамилии разделенные одним или несколькими пробелами..
Составить программу выводящие фамилии учеников, начинающихся на букву "А"..

Я пока не представляю как можно вводить фамилии и чтоб они разделялись пробелами...Или я условие совсем не понимаю... При выводе тоже не понятно...Если фамилий там к примеру будет 20 на букву А..Как их запомнить и потом еще и вывести...

Если я понятно выразил саму суть задачи..То можно это как нибудь запрограммировать, у меня вообщени ни чего не выходит...Только получается ввод фамилий через массив и то каждая начинается с новой строки...
Спасибо!!!!

 
 
 
 
Сообщение27.03.2008, 18:31 
Аватара пользователя
Т.е. например, такие строки:
Код:
Иванов    10000   11
Петров    50000   12
Сидоров   5000    1
Попов     20000   24

Не проще ли будет ввести запись, чтото вроде
Код:
const
man = 20; //Количество вкладчиков
....
type
bkl = record
  Name:String[20];   //Имя
  DirName:Integer;    //Величина вклада
  Avtor:integer;  //Срок
end;
....

var
bklad:array[1..man] of bkl;
...

Тогда например, чтобы узнать все о 5м вкладчике:
Код:
...
bklad[5].name //Имя
bklad[5].DirName    //Величина вклада
bklad[5].Avtor  //Срок
...
:?:
P.S.Смотрите хелп :idea:

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group