2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Помогите со строками В Паскале
Сообщение17.03.2008, 00:31 


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

 Профиль  
                  
 
 
Сообщение17.03.2008, 19:35 
Заслуженный участник
Аватара пользователя


01/08/06
3132
Уфа
Я не понял, входные строки уже даны?
Т.е. например, такие строки:
Код:
Иванов    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 


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

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

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

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

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

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

 Профиль  
                  
 
 
Сообщение18.03.2008, 12:44 
Заслуженный участник
Аватара пользователя


01/08/06
3132
Уфа
Понимаете, для начинающего у Вас тут зачем-то усложнённая задача.

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

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

 Профиль  
                  
 
 
Сообщение18.03.2008, 22:05 


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

Спасибо!!!

 Профиль  
                  
 
 
Сообщение19.03.2008, 14:08 
Заслуженный участник
Аватара пользователя


01/08/06
3132
Уфа
В этом сообщении в первом куске кода я показал, как нужно извлечь информацию о размере депозита и сроке. Как извлечь информацию о фамилии? Подумайте сами, в примере всё необходимое для этого есть. Подсказка: нужно скопировать часть строки от 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 


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

Спасибо..

 Профиль  
                  
 
 
Сообщение21.03.2008, 13:20 
Заслуженный участник
Аватара пользователя


01/08/06
3132
Уфа
ZoLoToy писал(а):
...дан строковой тип...В котором занесено определенное число фамилий...

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

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

 Профиль  
                  
 
 
Сообщение21.03.2008, 22:12 
Заблокирован


16/03/06

932
Дистанционное обучение подобно заочному - на деле не показать.
Тексты программ тоже не лучший способ помочь. Лучше всё-таки описывать алгоритм.
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 


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

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

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

 Профиль  
                  
 
 
Сообщение27.03.2008, 18:31 
Аватара пользователя


27/03/08
4
Т.е. например, такие строки:
Код:
Иванов    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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group