PDA

View Full Version : دو تا برنامه نوشتم ولی یه اشکال کوچیک توشون هست



paradise_human
سه شنبه 17 آذر 1388, 16:18 عصر
سلا م دوستان ....
سوالا دقیقا اینان:
برنامه ای بنویسید که با گرفتن وررودی از کاربر (کارکتر عدد کارکتر عدد ) یعنی 4 تا ورودی از کاربر بگیره که یکیش تعداد شیفت ها به راست باشه و یکیش کارکتر نشان دهنده ی راست و یکیش تعداد شیفت ها به چپ باشه و کارکتر نشان دهنده ی چپ باشه و عملیات شیفت کردن رو روی یک آرایه ی 4 عنصری کارکتری مثل ABCD انجام دهد.(مثلا وارد کنیم 3 چپ 4 راست و بعد این عناصر رو به این صورت جابه جا کنه یعنی توی این حالت اینطوری برامون چاپ کنه DABC ) حالا من برنامه اش رو به این صورت نوشتم

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
char a[4]={'A','B','C','D'};
int i,m,k;
puts("Please enter left shift:");
scanf("%d",&m);
puts("Please enter right shift:");
scanf("%d",&k);
for(i=0;i<4;i++)
{
if(i+m-k+4>0)
printf("%c",a[(i+m-k+4)%4]);
else if(i+m-k<0)
printf("%c",a[(i+k-m+4)%4]);

}

}
فقط توی دوحالت مشکل داره یکی وقتی وارد میکنیم یکی به چپ 6 تا به راست و وقتی وارد میکنیم یکی به چپ 8 تا به راست
میتونید مشکلش رو برام رفع کیند ؟
البته استاد این برنامه رو ازم قبول کرد ولی گفت روش ساده ترشم هست ...
در مورد روش ساده ترش هم میونید یه توضیحی بدین؟
و اما در رابطه با سوال دوم.
سوال دوم اینه:
برنامه ای بنویسید که یک آرایه ی اعشاری و یک عدد صحیح از کاربر بگیرد و و در صورتی که عناصر
آرایه از عدد صحیح وارد شده کوچکتر بودند آن عناصر را حذف کرده و عناصر باقی مانده را چاپ کند
من این برنامه رو نوشتم و هیچ مشکلی هم نداره
فقط استادمون کلید کرده میگه از شیفت کردن توی این برنامه استفاده کنید
من منظور استاد رو متوجه نمیشم میتونید کمکم کنید ؟
اینم برنامم:

#include <stdio.h>
#include <string.h>
void main()
{
float a[100],b[100],c[200];
int i,n,m,j,t;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%f",&a[i]);
scanf("%d",&m);
i=j=t=0;
while(i<n)
{
if(a[i]<m)
{
c[t]=a[i];
i++;
t++;
}
else
{
b[j]=a[i];
i++;
j++;
}

}
for(j=0;j<i-t;j++)
printf("%f-",b[j]);


}

mortezamsp
چهارشنبه 18 آذر 1388, 12:35 عصر
برنامه اول :

int sh=( m>k ? (m-k)%4 : -((k-m)%4) );
for( int i=0 ;i<4 ;i++)
{
print( a[(i+4+sh)%4] );
}

برنامه دوم:
باشه براي بعد...

paradise_human
چهارشنبه 18 آذر 1388, 12:54 عصر
برنامه اول :

int sh=( m>k ? (m-k)%4 : -((k-m)%4) );
for( int i=0 ;i<4 ;i++)
{
print( a[(i+4+sh)%4] );
}

برنامه دوم:
باشه براي بعد...
برنامه تصحیح شد .....
فقط میتونید اون خط تعریف sh رو برام تحلیل کنید ؟
اون علامت سوال و نقل قول چه کاری انجام میدن ؟

mortezamsp
چهارشنبه 18 آذر 1388, 14:33 عصر
x= ( A ? B : C )
اگر A درست بود X=b وگرنه x=C

paradise_human
چهارشنبه 18 آذر 1388, 14:49 عصر
x= ( A ? B : C )
اگر A درست بود X=b وگرنه x=C
ممون بابت توضیحتون .....
منتظر راهنمایی شما برای برنامه ی دوم هم هستم ...

mortezamsp
چهارشنبه 18 آذر 1388, 20:50 عصر
for(i=0;i<n;i++)
{
if( floor(a[i]) < m )
{
for(int j=i;j<n;j++)
a[j]=a[j+1];//از اين مکان تا انتهاي آرايه را يک خانه به عقب شيفت ميدهد تا عنصر مورد نظر حذف شود.
}
}

for(i=0;i<n;i++)
print( a[i] );

paradise_human
چهارشنبه 18 آذر 1388, 21:20 عصر
for(i=0;i<n;i++)
{
if( floor(a[i]) < m )
{
for(int j=i;j<n;j++)
a[j]=a[j+1];//از اين مکان تا انتهاي آرايه را يک خانه به عقب شيفت ميدهد تا عنصر مورد نظر حذف شود.
}
}

for(i=0;i<n;i++)
print( a[i] );
منظورتون از اون floor چیه توی اون قسمت ؟

mortezamsp
چهارشنبه 18 آذر 1388, 21:36 عصر
floor یعنی جزء صحیح .

include<math.h>

آها! حواسم نبود! برنامت میخواست اعداد کوچکتر رو حذف کنه؟
خب پس floor رو حذف کن.

paradise_human
چهارشنبه 18 آذر 1388, 21:54 عصر
floor یعنی جزء صحیح .

include<math.h>

آها! حواسم نبود! برنامت میخواست اعداد کوچکتر رو حذف کنه؟
خب پس floor رو حذف کن.

آره قرار بود اعداد کوچکتر رو حذف کنه ....
ولی در همه موارد جواب نمیده ...
مثلا شما 10 تا عدد 30و20و10و5و7و8و9و1و11و12 رو بزنید و بگید اعداد کوچکتر از 10 رو حذف کنه ...
جواب این رو میده :
9و1و11و12 که درست نیست .
یا مثلا 5 تا عدد 1و2و3و4و5 رو وارد کنید و بگید اعداد کوچکتر از 4 رو حذف کنه که فقط 5 رو مینیویسه در صورتی که 4 رو هم باید بنویسه .


#include <stdio.h>
#include <string.h>

void main()
{
float a[100];
int i,n,m,j,t=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%f",&a[i]);
scanf("%d",&m);
for(i=0;i<n;i++)
{
if(a[i]<m)
{
for(j=0;j<n;j++)
a[j]=a[j+1];
t++;
}
}

for(i=0;i<n-t;i++)
printf("%f-",a[i]);
}

راستی برنامه ی اول رو به این صورت هم نوشتم و جواب داد :

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
char a[4]={'A','B','C','D'};
int i,m,k;
puts("Please enter left shift:");
scanf("%d",&m);
puts("Please enter right shift:");
scanf("%d",&k);
for(i=0;i<4;i++)
printf("%c",a[(i+4+((m-k)%4))%4] );

}

mortezamsp
پنج شنبه 19 آذر 1388, 10:02 صبح
#include <stdio.h>
#include <string.h>
#include<conio.h>

int main()
{
clrscr();

float a[100];
int i,n,m,j,t=0;

scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%f",&a[i]);
scanf("%d",&m);

i=0;
while(i<n)
{
if(a[i]<float(m))
{
for(j=i;j<n;j++)
a[j]=a[j+1];
n--;
}
else
{
i++;
}
}


for(i=0;i<n;i++)
printf("%f-",a[i]);

getch();
return 0 ;
}

اشکال تو اشاره گر آرایه بود.وقتی شیفت میدی باید سرجات بایستی،چون عدد جدید میاد تو مکان فعلی قرار میگیره.