يه برنامه به زبان پاسکال مي خوام که يه جمله رو بگيره اسپيساش يا همون بلنک هاشو حذف کنه و دوباره جمله ي اوليه رو و نتيجه رو بتايپه.خودم نوشتم اما error ميده ميشه کمک کنين...
Printable View
يه برنامه به زبان پاسکال مي خوام که يه جمله رو بگيره اسپيساش يا همون بلنک هاشو حذف کنه و دوباره جمله ي اوليه رو و نتيجه رو بتايپه.خودم نوشتم اما error ميده ميشه کمک کنين...
پاسکال میخواید یا دلفی؟ برای دلفی می تونید از تابع StringReplace استفاده کنید.
در ضمن، اونی که خودتون نوشتید کجا ست؟ آن را در اینجا قرار بدید، وگرنه تاپیک شما حکم درخواست برنامه یا درخواست حل تمرین را پیدا میکنه، و حذف میشه.
برنامه اي که نوشتم اينه: واسه پاسکال مي خوام.
نقل قول:
program blank;
var
a:array[1..200]of char;
i,n,k,j:integer;
begin
write('enter number of sentences:');
readln(n);
writeln('enter sentences:');
for i:=1 to n do
read(a[i]);
for i:=1 to n do
if a[i]=' ' then
begin
for j:=i to n do
a[j]:=a[j+1];
end;
writeln;
write('the output sentences:');
for i:=1 to n do
write(a[i]);
readln(k);
end.
تو حلقه دوم j+1 از تعداد کاراکتر های a در هنگام j=nبیش تر میشه و خطا می ده .
خب، الان این کد شما که جمله نمیگیره،کارکتر میگیره. اگر میخواید جمله بگیره، باید بجای اون آرایه از string استفاده کنید:
a : string;
اون وقت می تونید a را بصورت یک جمله توسط readln از کاربر بگیرید.
وقتی a را گرفتید، طولش را با استفاده از تابع Length حساب کنید، و با استفاده از یک حلقه for معکوس، عناصر آن را چک کنید، اگر فاصله پیدا کردید، با استفاده از تابع Delete آن را حذف کنید:
Len := Lenght(a);
for i := Len downto 1 do
if a[i] = ' ' then
Delete(a,i,1);
با همون حلقه ها بدون استفاده از تابع delete آقای مدیر می تونید بنویسید فقط باید حلقه دوم را تا n-1 ادامه دهید .
اون روش کلا اشکال داره. اگر قرار هست ورودی بصورت کارکتر به کارکتر گرفته بشه، اصلا نیازی به اون حلقه ها نیست، میشه در همان زمان ورود کارکترها وجود فاصله را تشخیص داد، و اگر فاصله ایی وارد شد بود، آن را در آرایه وارد نکرد. اما به همچین کاری دیگه گرفتن جمله و تشخیص وجود فاصله در آن گفته نمیشه!نقل قول:
با همون حلقه ها بدون استفاده از تابع delete آقای مدیر می تونید بنویسید فقط باید حلقه دوم را تا n-1 ادامه دهید .
ببخشيد اما من اين برنامه و يک برنامه ديگه که از همين روش استفاده مي کنه رو مي نويسم تو پاسکال اما يه error ميده که ; لازمه اونم بعد end e آخر:متفکر: بعد اينو ميذارم ميگه begin مي خواد اونو ميذارم ميگه يه end. مي خواد باز اينو مينويسم error اولي رو ميده:عصبانی++:
من اين برنامه ها رو فردا بايد تحويل بدم:افسرده: ممنون ميشم کمک کنين.
چون وقت ندارم کدا رو دوباره بنويسم و از داخل پاسکال نميشه کپي کرد فايل.pas ش رو آپلود کردم:
http://www.2shared.com/file/9549264/...fc/SPACE1.html
ممنون ميشم واقعا".
:متعجب: Length خودش یک تابع استاندارد پاسکال هست دیگه چرا تعریفش کردی ؟
این هم کد اصلاح شده :
Program Test;
Uses WinCrt;
var
ST:String;
Len,i:Integer;
begin
Write(' Enter sentences :');
ReadLn(ST);
Len:=Length(ST);
for i:=Len downto 1 do
if st[i]=' ' then
Delete(ST,i,1);
WriteLn;
WriteLn(ST);
ReadLn;
end.
راستی چرا رشته رو از آخر به اول جست و جو کردی ؟
مرسييييييييي بالاخره اين يکي درست شد:لبخند::اشتباه:
آخه من داخلturbo pascal 7مينوشتم که crt ايش length رو نميشناسه و error ميده. الان رفتم پاسکال تحت win اين جواب ميداد واقعا" تشکر.
downto رو آقاي کشاورز گفتن فرقي نداره با to البته ...
من هم نگفتم فرق داره فقط میخواستم ببینم که کار خاصی مد نظرتون بوده که اینطور که معلومه دلیل خاصی نداشتید .نقل قول:
downto رو آقاي کشاورز گفتن فرقي نداره با to البته ...
برای اینکه میخواد فاصله ها رو از رشته حذف کنه، و با حذف هر کارکتر از رشته، ترتیب ایندکس های بعد از آن کارکتر در رشته تغییر میکنه.نقل قول:
راستی چرا رشته رو از آخر به اول جست و جو کردی ؟
منظورتون رو کامل متوجه نشدم ،درسته که ایندکس کارکترها تغییر میکنه ولی خوب این کد هم درست کار میکنه :
Program Test;
Uses WinCrt;
var
ST:String;
Len,i:Integer;
begin
Write(' Enter sentences :');
ReadLn(ST);
Len:=Length(ST);
for i:=1 to Len do
if st[i]=' ' then
Delete(ST,i,1);
WriteLn;
WriteLn(ST);
ReadLn;
end.
نه، اگر چند فاصله پشت سر هم وجود داشته باشند، درست عمل نمیکنه.نقل قول:
منظورتون رو کامل متوجه نشدم ،درسته که ایندکس کارکترها تغییر میکنه ولی خوب این کد هم درست کار میکنه