PDA

View Full Version : حذف کردن فاصله ها در يک جمله



salvariana
پنج شنبه 05 آذر 1388, 22:49 عصر
يه برنامه به زبان پاسکال مي خوام که يه جمله رو بگيره اسپيساش يا همون بلنک هاشو حذف کنه و دوباره جمله ي اوليه رو و نتيجه رو بتايپه.خودم نوشتم اما error ميده ميشه کمک کنين...

vcldeveloper
جمعه 06 آذر 1388, 00:59 صبح
پاسکال میخواید یا دلفی؟ برای دلفی می تونید از تابع StringReplace استفاده کنید.
در ضمن، اونی که خودتون نوشتید کجا ست؟ آن را در اینجا قرار بدید، وگرنه تاپیک شما حکم درخواست برنامه یا درخواست حل تمرین را پیدا میکنه، و حذف میشه.

salvariana
جمعه 06 آذر 1388, 14:30 عصر
برنامه اي که نوشتم اينه: واسه پاسکال مي خوام.


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.

pezhvakco
جمعه 06 آذر 1388, 19:58 عصر
تو حلقه دوم j+1 از تعداد کاراکتر های a در هنگام j=nبیش تر میشه و خطا می ده .

salvariana
جمعه 06 آذر 1388, 22:07 عصر
تو حلقه دوم j+1 از تعداد کاراکتر های a در هنگام j=nبیش تر میشه و خطا می ده .

خوب چيکار کنم پس:-??

من گفتم بايد هر وقت به بلنک ميرسيم بايد کاراکتر يه دونه بياد عقب!:متفکر: ميشه بيشتر راهنمايي کنين لطفا":ناراحت:

vcldeveloper
شنبه 07 آذر 1388, 01:54 صبح
خب، الان این کد شما که جمله نمیگیره،کارکتر میگیره. اگر میخواید جمله بگیره، باید بجای اون آرایه از 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);

pezhvakco
شنبه 07 آذر 1388, 08:43 صبح
با همون حلقه ها بدون استفاده از تابع delete آقای مدیر می تونید بنویسید فقط باید حلقه دوم را تا n-1 ادامه دهید .

vcldeveloper
شنبه 07 آذر 1388, 09:04 صبح
با همون حلقه ها بدون استفاده از تابع delete آقای مدیر می تونید بنویسید فقط باید حلقه دوم را تا n-1 ادامه دهید .
اون روش کلا اشکال داره. اگر قرار هست ورودی بصورت کارکتر به کارکتر گرفته بشه، اصلا نیازی به اون حلقه ها نیست، میشه در همان زمان ورود کارکترها وجود فاصله را تشخیص داد، و اگر فاصله ایی وارد شد بود، آن را در آرایه وارد نکرد. اما به همچین کاری دیگه گرفتن جمله و تشخیص وجود فاصله در آن گفته نمیشه!

salvariana
یک شنبه 08 آذر 1388, 19:38 عصر
ببخشيد اما من اين برنامه و يک برنامه ديگه که از همين روش استفاده مي کنه رو مي نويسم تو پاسکال اما يه error ميده که ; لازمه اونم بعد end e آخر:متفکر: بعد اينو ميذارم ميگه begin مي خواد اونو ميذارم ميگه يه end. مي خواد باز اينو مينويسم error اولي رو ميده:عصبانی++:

من اين برنامه ها رو فردا بايد تحويل بدم:افسرده: ممنون ميشم کمک کنين.
چون وقت ندارم کدا رو دوباره بنويسم و از داخل پاسکال نميشه کپي کرد فايل.pas ش رو آپلود کردم:
http://www.2shared.com/file/9549264/3486b5fc/SPACE1.html

ممنون ميشم واقعا".

Felony
یک شنبه 08 آذر 1388, 19:53 عصر
:متعجب: 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.

راستی چرا رشته رو از آخر به اول جست و جو کردی ؟

salvariana
یک شنبه 08 آذر 1388, 20:53 عصر
مرسييييييييي بالاخره اين يکي درست شد:لبخند::اشتباه:

آخه من داخلturbo pascal 7مينوشتم که crt ايش length رو نميشناسه و error ميده. الان رفتم پاسکال تحت win اين جواب ميداد واقعا" تشکر.

downto رو آقاي کشاورز گفتن فرقي نداره با to البته ...

Felony
یک شنبه 08 آذر 1388, 21:06 عصر
downto رو آقاي کشاورز گفتن فرقي نداره با to البته ...
من هم نگفتم فرق داره فقط میخواستم ببینم که کار خاصی مد نظرتون بوده که اینطور که معلومه دلیل خاصی نداشتید .

vcldeveloper
یک شنبه 08 آذر 1388, 21:20 عصر
راستی چرا رشته رو از آخر به اول جست و جو کردی ؟
برای اینکه میخواد فاصله ها رو از رشته حذف کنه، و با حذف هر کارکتر از رشته، ترتیب ایندکس های بعد از آن کارکتر در رشته تغییر میکنه.

Felony
یک شنبه 08 آذر 1388, 22:17 عصر
برای اینکه میخواد فاصله ها رو از رشته حذف کنه، و با حذف هر کارکتر از رشته، ترتیب ایندکس های بعد از آن کارکتر در رشته تغییر میکنه.

منظورتون رو کامل متوجه نشدم ،درسته که ایندکس کارکترها تغییر میکنه ولی خوب این کد هم درست کار میکنه :


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.

vcldeveloper
یک شنبه 08 آذر 1388, 22:52 عصر
منظورتون رو کامل متوجه نشدم ،درسته که ایندکس کارکترها تغییر میکنه ولی خوب این کد هم درست کار میکنه
نه، اگر چند فاصله پشت سر هم وجود داشته باشند، درست عمل نمیکنه.

Felony
یک شنبه 08 آذر 1388, 23:35 عصر
نه، اگر چند فاصله پشت سر هم وجود داشته باشند، درست عمل نمیکنه.

ممنون حالا فهمیدم منظورتون چی هست ، من فکر میکردم از نظر تعداد فاصله ها میگید و دقت نکرده بودم که تو این حلقه اگر تعداد فاصله بیش از 1 عدد پشت سر هم بیاد مشکل پیش میاد .