Program sumujący liczby z parametrów

0

Jestem nowy w programowaniu ,i potrzebuje pomocy w zrobieniu programu który przy wpisaniu w konsoli program.exe parametr1 parametr2 ... parametrX to program to doda i tyle.Wiem że musze użyć PramStr i StrToInt ale nie wiem w jaki sposób . (środowisko pascal)

0

Funkcja ParamCount zwraca liczbę parametrów, z jakimi została uruchomiona aplikacja. Jeśli wynosi 0 to program został uruchomiony bez parametrów. Funkcja ParamStr zwraca wartość parametru w postaci łańcucha znaków, gdzi ParamStr(0) zwraca (w większości przypadków) ścieżkę uruchomionej aplikacji, a spod indeksów od 1 do ParamCount zwraca wartości parametrów.

Przykład użycia tych funkcji:

var
  AppPath: String;
  ParamCnt: Integer;
  ParamIdx: Integer;
begin
  AppPath := ParamStr(0);
  ParamCnt := ParamCount();

  WriteLn('Application path: ', AppPath);
  WriteLn('Parameters count: ', ParamCnt, LineEnding);

  for ParamIdx := 1 to ParamCnt do
    WriteLn('Parameter ', ParamIdx, ' value: ', ParamStr(ParamIdx));

  ReadLn();
end.

Jeśli uruchomisz program bezpośrednio (bez określania parametrów), w ekranie konsoli ujrzysz coś takiego:

Application path: C:\DOCUME~1\FURIOU~1\USTAWI~1\Temp\project1.exe
Parameters count: 0

Natomiast jeśli uruchomisz program z linii poleceń w ten sposób:

project1.exe 50 100 500

w kosoli zobaczysz dodatkowo wylistowane parametry:

Application path: C:\DOCUME~1\FURIOU~1\USTAWI~1\Temp\project1.exe
Parameters count: 3

Parameter 1 value: 50
Parameter 2 value: 100
Parameter 3 value: 500

Teraz pozostaje zamienić ciągi parametrów na liczby i je zsumować, ale to pozostawiam Tobie.

0
jacek099 napisał(a):

Jestem nowy w programowaniu ,i potrzebuje pomocy w zrobieniu programu który przy wpisaniu w konsoli program.exe parametr1 parametr2 ... parametrX to program to doda i tyle.Wiem że musze użyć PramStr i StrToInt ale nie wiem w jaki sposób . (środowisko pascal)

function calculateParams: integer;
var
  lVal1, lVal2: integer;
begin

  try
    lVal1 := StrToint(paramstr(1));
  except
    on e: exception do
      raise exception.Create('First parameter, invalid format' + #13 + #10 + e.Message);
  end;

  try
    lVal2 := StrToint(paramstr(2));
  except
    on e: exception do
      raise exception.Create('Second parameter, invalid format' + #13 + #10 + e.Message);
  end;

  result := lVal1 + lVal2;

end;

0

@furious programming:

Wielkie dzięki za podpowiedz :)

0

Jeszcze mam problem z użyciem StrToInt nie jestem pewien gdzie to podstawić , a zsumować też mam problem bo nie wiem jak ma to wyglądać ,wiem że to brzmi jakbym se jaja robił ale ja jestem takim Newbie x2 .na razie nie mam pojęcia co jest co i jak działa .Potrzebuje przykładu jak to funkcjonuje bo inaczej tego nie zrozumie po podpowiedziach.

1

Sugeruję użycie funkcji SysUtils.TryStrToInt, która nie generuje wyjątku, jeśli podany ciąg znaków nie zawiera prawidłowo zapisanej liczby. Jeśli piszesz pod Lazarusem to równie dobrze możesz skorzystać z metody ToInteger dla ciągów znaków:

uses
  SysUtils;
var
  Count, Index: Integer;
  Sum: Integer = 0;
begin
  Count := ParamCount();

  if Count = 0 then
    Write('no parameters specified')
  else
  begin
    for Index := 1 to Count do
      Sum += ParamStr(Index).ToInteger();

    Write('Sum: ', Sum);
  end;

  ReadLn();
end.

A jeśli program ma reagować na błędy związane z nieprawidłowymi parametrami, można w ten sposób:

uses
  SysUtils;
var
  Value: String;
  Count, Index, Number: Integer;
  Sum: Integer = 0;
begin
  Count := ParamCount();

  if Count = 0 then
    Write('no parameters specified')
  else
  begin
    for Index := 1 to Count do
    begin
      Value := ParamStr(Index);

      if Integer.TryParse(Value, Number) then
        Sum += Number
      else
      begin
        Write('parameter at index ', Index, ' with value "', Value, '" is not a valid integer');

        ReadLn();
        Halt();
      end;
    end;

    Write('Sum: ', Sum);
  end;

  ReadLn();
end.

Przykład określenia prawidłowych wartości parametrów:

project1.exe 50 100 500

po uruchomieniu w konsoli pojawi się wynik:

Sum: 650

A dla błędnych parametrów:

project1.exe 50 foo 500

wyskoczy zdefiniowany błąd:

parameter at index 2 with value "foo" is not a valid integer
0

A może w CMD? Wtedy nie trzeba używać StrToInt i innychzawracaczygłowy

@echo off
:start
set /a wynik=0
:dodaj
if "%1"=="" goto end
set /a wynik=%wynik%+%1
shift
goto dodaj

:end
echo %wynik%
0
uses
  SysUtils;
var
  Count, Index: Integer;
  Sum: Integer = 0;
begin
  Count := ParamCount();
 
  if Count = 0 then
    Write('no parameters specified')
  else
  begin
    for Index := 1 to Count do
      Sum += ParamStr(Index).ToInteger();
 
    Write('Sum: ', Sum);
  end;
 
  ReadLn();
end.

Rozumiem że znacie już dużo lepsze komendy ,mógłbyś mi pokazać jak wygląda ten sam program z zastosowaniem StrToInt; .Uczę sie od podstaw wieć funkcje z SysUtils będą mi potrzebne troche pozniej .Mimo wszystko ten programik wiele mi rozjaśnił ale potrzebuje takiego łopatologicznego wyjaśnienia jak działa funkcja StrToInt .Z góry wielkie dzięki :).

0

Wystarczy zmienić ciało pętli:

for Index := 1 to Count do
  Sum := Sum + StrToInt(ParamStr(Index));

Sum += jest tym samym co Sum := Sum +.

0

Wielkie dzięki teraz już rozumiem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1