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)
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.
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;
Wielkie dzięki za podpowiedz :)
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.
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
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%
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 :).
Wystarczy zmienić ciało pętli:
for Index := 1 to Count do
Sum := Sum + StrToInt(ParamStr(Index));
Sum +=
jest tym samym co Sum := Sum +
.
Wielkie dzięki teraz już rozumiem :)