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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2009, 12:45   #1
Doublefaced
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 100
По умолчанию Строки

Цитата:
Дана строка, значение которой является число в экспоненциальной форме представления (2,3Е+3). Необходимо получить строку, значением которой будет представлено в нормальной форме (2300). При решении не использовать преобразования строкового типа в числовой.
Как можно решить без числового типа? Разве это возможно?
Doublefaced вне форума Ответить с цитированием
Старый 21.06.2009, 13:38   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Это в Делфи нужно делать? А можно результат в ту же строку помещать?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 21.06.2009, 13:58   #3
Doublefaced
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 100
По умолчанию

Да в в консоле Делфи. Результат в строку, да.
Doublefaced вне форума Ответить с цитированием
Старый 21.06.2009, 14:50   #4
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Цитата:
Как можно решить без числового типа?
решать надо без преобразования строки в число а не без числового типа то есть без использования функции
Код:
StrToInt('строка')
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 21.06.2009, 15:03   #5
Doublefaced
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 100
По умолчанию

Напишите в общем виде. Я не совсем понял, что куда.
Doublefaced вне форума Ответить с цитированием
Старый 21.06.2009, 15:26   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Хм... Вообще интересное задание...



Ну допустим разделили строку на две части - до "E+" и после...
А дальше надо думать.....
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 21.06.2009, 16:44   #7
Doublefaced
Форумчанин
 
Регистрация: 01.03.2009
Сообщений: 100
По умолчанию

Пока не придумал, кто знает напишите код пож-та!
Doublefaced вне форума Ответить с цитированием
Старый 21.06.2009, 20:39   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

для того, чтобы решить данную задачу нужно научиться переводить один символ из символьного представления в числовое.
Вы даже не представляете, сколько различных вариантов есть для этого..
пусть в S - у нас цифры. задача - перевести каждую символ-цифру в число.
вот, навскидку, три варианта:
Код:
const Chislo : array['0'..'9'] of integer = (0,1,2,3,4,5,6,7,8,9);
const Numbers = '0123456789';
var
  s : string;
  i,k : integer;
begin
  WriteLn;
  s:='98057';
  WriteLn('Исходная строка: ',s);
  WriteLn('Вариант 1:');
  for i:=1 to length(s) do
  begin
    k := ord(s[i])-ord('0');
    WriteLn(k)
  end;
  WriteLn('----------------');
  WriteLn('Вариант 2:');
  for i:=1 to length(s) do
  begin
    k := Chislo[s[i]];
    WriteLn(k)
  end;
  WriteLn('----------------');
  WriteLn('Вариант 3:');
  for i:=1 to length(s) do
  begin
    if Pos(s[i],Numbers)>0 then
       k := Pos(s[i],Numbers)-1;
    WriteLn(k)
  end;
  WriteLn('----------------');
end.
NB. мне кажется вариант 1 самый удобный в данном случае. я бы рекомендовал взять его за основу

что же касается целиком задачи перевода строки из экспоненциальной формы,
то вот, полностью программа.
Нужные проверки добавите сами.
И разобраться я предлагаю Вам самостоятельно.
Код:
function MyStrToFloat(s : string):double;
const
  {разделитель целой и дробной части мантиссы}
  DecimalSeparator = '.'; 
var
  MyResult,Base : double;
  IntPart,FractPart : string;
  i : integer;
begin
  MyResult := 0.0;

  FractPart := '';
  if Pos(DecimalSeparator,s)>0 then begin
    IntPart := Copy(s,1, Pos(DecimalSeparator,s)-1);
    FractPart := Copy(s,Pos(DecimalSeparator,s)+1,
                      Length(s)-Pos(DecimalSeparator,s)+1);
  end
  else IntPart := s;

  {перевод целой части мантиссы}
  Base := 1;
  for i:=Length(IntPart) downto 1 do
  begin
    MyResult := MyResult + (ord(IntPart[i])-ord('0'))* Base;
    Base := Base * 10;
  end;

  {перевод дробной части мантиссы}
  Base := 0.1;
  for i:=1 to Length(FractPart) do
  begin
    MyResult := MyResult + (ord(FractPart[i])-ord('0'))* Base;
    Base := Base / 10;
  end;

  MyStrToFloat := MyResult;
end;

var
  s, sMantissa, sPokazatel : string;
  i, iPokazatel  : integer;
  znakPokazatel : boolean;
  Res : double;
begin
  WriteLn('Введите число в экспоненциальной форме (разделитель - точка):');
  Readln(s);
  for i:=1 to Length(s) do s[i] := UpCase(s[i]);

  if (Pos('E',s)<2) or (Pos(',',s)>0) then begin
    Writeln('Введённая строка не является числом в экспоненциальной форме!');
    Halt(100);
  end;

  sMantissa := Copy(s, 1, Pos('E',s)-1);
  sPokazatel := Copy(s, Pos('E',s)+1, Length(s)-Pos('E',s)+1);

  if (sPokazatel[1]<>'+') and (sPokazatel[1]<>'-')
        or (Length(sPokazatel)<2) then begin
    Writeln('Введённая строка не является числом в экспоненциальной форме!');
    Halt(101);
  end;
  znakPokazatel := (sPokazatel[1]='+');
  sPokazatel := Copy(sPokazatel, 2, Length(sPokazatel)-1);

  Res := MyStrToFloat(sMantissa);
  iPokazatel := Trunc(MyStrToFloat(sPokazatel));

  for i:=1 to iPokazatel do
  begin
    if znakPokazatel
      then Res := Res * 10
      else Res := Res / 10;
  end;

  WriteLn('Число ',S,' = ',Res:20:8);

end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2009, 22:43   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Эх... Не успел...

Цитата:
вот, навскидку, три варианта:
Здорово... Мой вариант на фоне тех смотрится больно громоздким и неуклюжим...
Код:
d:=0;
While c<>'' Do
      Begin
      Case c[1] Of
            '0':
                  d:=d*10;
            '1':
                  d:=d*10+1;
            '2':
                  d:=d*10+2;
            '3':
                  d:=d*10+3;
            '4':
                  d:=d*10+4;
            '5':
                  d:=d*10+5;
            '6':
                  d:=d*10+6;
            '7':
                  d:=d*10+7;
            '8':
                  d:=d*10+8;
            '9':
                  d:=d*10+9;
            End;
      c:=Copy(c, 2, Length(c)-1);
      End;
// теперь в переменной d такое же число как в строке c...
Да и остальной код тоже... Многое не учтено, по сравнению с вариантом Serge_Bliznykov'а...

Но пусть он будет храниться здесь... Для истории...

Код:
Var A, b, c: String; L, S, d: Integer;
...
WriteLn('Введите число (разделитель - точка)');
ReadLn(A);
L:=Length(A);
S:=Pos('E+', A);
If S<>0 Then
      Begin
      b:=Copy(A, 1, S-1);
      c:=Copy(A, S+2, L-S);
      End;
// теперь в строке "b" часть строки "A" до "E+"
// а в строке "c" часть строки "A" после "E+"
If (Length(c)<>0) And (c[1]<>'0') Then // если после "E+" не пусто и не ноль
      Begin
      S:=Pos('.', b);
      L:=Length(b);
      If S=0 Then // если в строке "b" нет точки
            Begin
            d:=0;
            While c<>'' Do
                  Begin
                  Case c[1] Of
                        '0':
                              d:=d*10;
                        '1':
                              d:=d*10+1;
                        '2':
                              d:=d*10+2;
                        '3':
                              d:=d*10+3;
                        '4':
                              d:=d*10+4;
                        '5':
                              d:=d*10+5;
                        '6':
                              d:=d*10+6;
                        '7':
                              d:=d*10+7;
                        '8':
                              d:=d*10+8;
                        '9':
                              d:=d*10+9;
                        End;
                  c:=Copy(c, 2, Length(c)-1);
                  End;
            A:=b;
            While d<>0 Do
                  Begin
                  A:=A+'0';
                  d:=d-1;
                  End;
            End
      Else  // если в строке "b" есть точка
            Begin
            d:=0;
            While c<>'' Do
                  Begin
                  Case c[1] Of
                        '0':
                              d:=d*10;
                        '1':
                              d:=d*10+1;
                        '2':
                              d:=d*10+2;
                        '3':
                              d:=d*10+3;
                        '4':
                              d:=d*10+4;
                        '5':
                              d:=d*10+5;
                        '6':
                              d:=d*10+6;
                        '7':
                              d:=d*10+7;
                        '8':
                              d:=d*10+8;
                        '9':
                              d:=d*10+9;
                        End;
                  c:=Copy(c, 2, Length(c)-1);
                  End;
            d:=d-L+S;
            A:=Copy(b, 1, S-1)+Copy(b, S+1, L-S);
            While d<>0 Do
                  Begin
                  A:=A+'0';
                  d:=d-1;
                  End;
            End;
      WriteLn(A);
      End
Else
      WriteLn('Error');
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 22.06.2009, 10:15   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю свой вариант:
Код:
   var e,s:string;f,cm:byte;ex:char;
begin
 s:='2,85E+5';
 f:=1;while s[f]<>'E' do begin
  if s[f] in ['0'..'9'] then  e:=e+s[f];
  if s[f] in ['.'..','] then cm:=f;
  inc(f);
 end;
 ex:=s[length(s)];
 f:=length(e)-cm;
 while chr(f+ord('0'))<=ex do begin inc(f); e:=e+'0';end;
 write(e);
 readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Цитата:
При решении не использовать преобразования строкового типа в числовой.
Думаю что соблюл это условие на 98%
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строки на Си Карол Помощь студентам 6 14.02.2010 12:02
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10
Строки. Как вывести часть строки? Anfall Общие вопросы Delphi 7 26.02.2009 09:10
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45