PDA

View Full Version : سوال: كار با اراي



بانوی ایران
پنج شنبه 19 آذر 1388, 01:13 صبح
سلام دوستان من كار كردن با اراي رو تازه ياد گرفتم و درست بلد نيستم
يه برنامه اي نوشتم انقدر بيخوده كه خودمم فهميدم
در كل بفهمم يا نفهمم جواب نميده
از رو ي اين يكم كار با اراي رو برام توضيح بديد چون پر از اشكاله



#include <stdio.h>




#include <conio.h>

int main()
{
int n, m, l, i;
int numa[n], numb[m];
printf("enter n,m");
scanf ("%d%d", &n, &m);
for (i=1;i<=n;i++)
{
printf("enter numa[i]");
scanf ("%d", &numa[i]);
}
for(l=1;l<=m;l++)
{
printf ("enter numb[l]");
scanf("%d", &numb[l]);
}
if (numa[i]==numb[l])
{
printf("numn[i]\n");
}
getch();
return 0;
}


برنامه قراره ليستa با nعضو ليست bبا mعضو رو دريافت كنه اشتراكشون رو توي ليست جديد چاپ كنه
ميشه راهنماييم كنيد:افسرده:

shask00l
پنج شنبه 19 آذر 1388, 02:05 صبح
شما برای بدست آوردن اشتراکات باید از دوتا حلقه ی تودرتو استفاده کنید . حلقه ی اول برای n و دومی برای m . دقت کنید که حلقه ی دوم رو میشه با while هم پیاده کرد که اصولی تره . بعد هر عنصر آرایه ی اول رو با تمام عناصر دومی چک کنید هرجا برابر بود چاپ کنید و برید روی اندیس بعد .

ضمنا این تیکه رو اینجوری مینوشتی قشنگ تر میشد .


for (i=1;i<=n;i++)
{
printf("enter numa[%d]",i);
scanf ("%d", &numa[i]);
}

بانوی ایران
پنج شنبه 19 آذر 1388, 02:28 صبح
شما برای بدست آوردن اشتراکات باید از دوتا حلقه ی تودرتو استفاده کنید . حلقه ی اول برای n و دومی برای m . دقت کنید که حلقه ی دوم رو میشه با while هم پیاده کرد که اصولی تره . بعد هر عنصر آرایه ی اول رو با تمام عناصر دومی چک کنید هرجا برابر بود چاپ کنید و برید روی اندیس بعد .

ضمنا این تیکه رو اینجوری مینوشتی قشنگ تر میشد .


for (i=1;i<=n;i++)
{
printf("enter numa[%d]",i);
scanf ("%d", &numa[i]);
}


ممنون الان درستش ميكنم ولي
برنامه اي كه نوشتم در استفاده از اراي غلط نيست؟

بانوی ایران
پنج شنبه 19 آذر 1388, 02:31 صبح
#include <stdio.h>




#include <conio.h>

int main()
{
int n, m, l, i;
int numa[n], numb[m];
printf("enter n,m");
scanf ("%d%d", &n, &m);
for (i=1;i<=n;i++)
{
printf("enter numa[%d]", i);
scanf ("%d", &numa[i]);
for(l=1;l<=m;l++)
{
printf ("enter numb[%d]", l);
scanf("%d", &numb[l]);
}
if (numa[i]==numb[l])
{
printf("%d\n",numa[i]);
}
}
getch();
return 0;
}






اصلا if رو اجرا نميكنه
مشكلش چيه؟
جاي دستور if مشكل داره؟

xxxxx_xxxxx
پنج شنبه 19 آذر 1388, 02:45 صبح
اصلا if رو اجرا نميكنه
مشكلش چيه؟
جاي دستور if مشكل داره؟



سلام،
چون if خارج از هر دو حلقه هست پس بنابراین فقط دو عنصر آخر آرایه ها باهم مقایسه میشن.
خود if رو هم باید درون دو حلقه تو در تو قرار بدید. (اگر طول آرایه ها برابر بود با یک حلقه میشد)
پس یک حلقه دیگه بزارید که آرایه اول رو پیمایش کنه و درون آن یک حلقه دیگه که آرایه دوم رو پیمایش میکنه. در حلقه داخلی (آرایه دوم) این if رو با دستور printf قرار بدید.

موفق باشید/

tdkhakpur
پنج شنبه 19 آذر 1388, 13:31 عصر
اگر برنامه بالای شما درست باشه مرحله بعدی کار شما به این شکل میشود


#include <stdio.h>
#include <conio.h>
int main()
{
int n, m, l, i;
int *numa, *numb; // اصلاح شود
printf("enter n,m");
scanf ("%d%d", &n, &m);
numa = new int[n]; // اضافه شود
numb = new int[m]; // اضافه شود
for (i=1;i<=n;i++)
{
printf("enter numa[%d]", i);
scanf ("%d", &numa[i]);
for(l=1;l<=m;l++)
{
printf ("enter numb[%d]", l);
scanf("%d", &numb[l]);
if (numa[i]==numb[l])
{
printf("new=%d\n",numa[i]);
}
}
}
delete [] numa; // اضافه شود
delete [] numb; // اضافه شود

getch();
return 0;
}

بانوی ایران
پنج شنبه 19 آذر 1388, 19:21 عصر
اگر يك توضيح كو چيك هم بديد خيلي ممنون ميشم
مگه كاري كه من كردم در استفاده از ارايه ها غلطه؟ و چرا بايد اين كار رو بكنم؟



int *numa, *numb; // اصلاح شود
printf("enter n,m");
scanf ("%d%d", &n, &m);
numa = new int[n]; // اضافه شود
numb = new int[m];


جوري كه من ارايه هام رو تعريف كردم غلطه؟(كار ميكنه ها)

int num_A[n], num_B[m];
printf ("enter n,m\n");
scanf ("%d%d", &n, &m);
البته برنامه رو به اين شكل نوشتمش كه همه رو اخر سر پشت سر هم چاپ كنه


//eshterake A,B
#include <stdio.h>
#include <conio.h>
int main()
{
int n, m, l, i, c=0;
int num_A[n], num_B[m], new_num[c];
printf("enter n,m\n");
scanf ("%d%d", &n, &m);
for (i=1;i<=n;i++)
{
printf("enter num_A[%d]\n", i);
scanf ("%d", &num_A[i]);
for(l=1;l<=m;l++)
{
printf ("enter num_B[%d]\n", l);
scanf("%d", &num_B[l]);
if (num_A[i]==num_B[l])
{
c++;
printf ("enter num_A[%d] again\n", i);
scanf("%d", &num_A[i]);
}
}
}
for (i=1;i<=c;i++)
{
printf ("new_num[%d]=%d\n", i, num_A[i]);
}
getch();
return 0;
}

tdkhakpur
پنج شنبه 19 آذر 1388, 20:48 عصر
ما نگفتیم غلطه بلکه خواستیم برنامه قبلی شما رو اصلاح کنم و به درخواست شما تبدیل شود(استفاده و ایجاد با New)

بانوی ایران
پنج شنبه 19 آذر 1388, 23:30 عصر
ممنون دوست عزيز گفتم شايد اين كه من نوشتم شانسي جواب ميده
واين كه چرا اون كه شما نوشتيد بهتره؟
بهتره؟

tdkhakpur
پنج شنبه 19 آذر 1388, 23:40 عصر
ممنون دوست عزيز گفتم شايد اين كه من نوشتم شانسي جواب ميده
واين كه چرا اون كه شما نوشتيد بهتره؟
بهتره؟
یعنی چی؟؟؟؟؟

بانوی ایران
پنج شنبه 19 آذر 1388, 23:45 عصر
منظورم اينه كه اين روش اصولي تره؟(كه اول n,mرو وارد كنيم بعدش اراي رو بسازيم)
راستي برنامه رو ميتونم از اين بهترش كنم(اون كه اخر صفحه ي قبل زدم)؟

BackTrace
جمعه 20 آذر 1388, 12:25 عصر
سلام، چند نکته رو میگم امیدوارم به درد بخوره: :چشمک:

1) اگه نتیجه قراره تویه لیستی چاپ بشه پس اون لیست یه آرایه هست.(بر اساس توضیحی که درباره برنامه نوشتین. چون a و b هم لیست هستن که به صورت آرایه گرفتین)
2) اگه یادتون باشه آرایه ها تو C++‎‎‎/C از اندیس صفر شروع میشن. پس باید مقدار اولیه تو for از 0 و تا زمانیکه i<n هست ادامه پیدا کنه. البته کار ما با یه 1- هم راه می افتاد ولی...
3) نمیتونی به صورت runtime طول آرایه رو مشخص کنی، تنها برای اینکار میتونی به صورت پویا عمل کنی(همون روشی که tdkhakpur جان، گفتن)
4) از اونجایی که معلومه اعداد از کاربر گرفته میشن، پس احتمال داره زمانی پیش بیاد که حداقل 2 عدد تویه آرایه یکی باشن. اونوقت یا باید از قبل فیلترینگ رو انجام میدادی، یا در لیست انتهایی یکی از اعداد تکراری رو حذف کنی و یا اینکه موقع اضافه کردن اشتراک ها تویه لیست، چک کنی که عدد تکراری وارد نمیکنی. که من از همین روش آخر استفاده کردم. البته خوب فقط توضیحاتش رو نوشتم.
من خودم برنامه رو تو لینوکس نوشتم و اجرا گرفتم. تویه ویندوز هم به احتمال 99.9% اجرا میشه.

#include <stdio.h>
int main()
{
int n=2, m=3, l, i, k=0;
int c=n>m?n:m; // It's better to use "c=n>m?:n", when we are using from IsRep() function
int numa[n], numb[m];
int numc[c];


for(i=0;i<n;i++)
{
printf("enter numa[%d/%d]: ",i+1,n);
scanf ("%d", &numa[i]);
}
printf("\n----------------------------------------\n");

for(l=0;l<m;l++)
{
printf("enter numb[%d/%d]: ",l+1,m);
scanf ("%d", &numb[l]);
}
for(i=0;i<n;i++)
for(l=0;l<m;l++)
if(numa[i]==numb[l]){
//if (!IsRep()){ //Check if this item is repeated in the numc[], so don't add it to the numc[]
numc[k++]=numa[i];
break;
//}
}
for(i=0;i<k;i++) printf("%d-",numc[i]);
printf("\n");
//getch();
return 0;
}

بانوی ایران
جمعه 20 آذر 1388, 17:58 عصر
ممن.ن از توضيحتون اما چند تا نكته
اين برنامه كه من بايد بنويسم اعداد رو به صورت تكراري بايد چاپ كنه تو اجتماع يعني اشتراكشون دو بار چاپ بشه در نتيجه لازم نيست چك بشه (البته ممنون كه بهم گفتيد چه جوري نزارم تكراري بشه اگر ميشه توضيح بديد
if (!IsRep()){
چي كار ميكنه)
اما مساله اينجاست در اخر كه ليست چاپ ميشه بايد به ترتيب از بزرگ به كوچيك چاپ بشه
حواسم به اين نبود:اشتباه:
دارم روش كار ميكنم
اما قاطي پاتي شده
ممنون ميشم يكي كمك كنه:افسرده:

بانوی ایران
جمعه 20 آذر 1388, 23:56 عصر
يكي به داد من برسه
هر كاري ميكنم مرتبش نميكنه
چرا درست نميشه:عصبانی++::گریه:


//ejtemae A,B




#include <stdio.h>

#include <conio.h>
int main()
{
int i ,j; //counter
int n ,m; //aray size
int *num_A ,*num_B ,*num_C;


printf ("enter n,m\n");
scanf ("%d%d", &n, &m);
num_A=new int[n];
num_B=new int[m];
num_C=new int[n+m];


for (i=0;i<n;i++)
{
printf("enter num_A[%d]=\n", i);
scanf ("%d", &num_A[i]);
}
for (i=0;i<m;i++)
{
printf ("enter num_B[%d]=\n", i);
scanf ("%d", &num_B[i]);
}
printf("\n\n\n");


for (i=0;i<n;i++)
{
num_C[i]=num_A[i];
}
for (j=0;j<m;j++)
{
num_C[i+j]=num_B[j];
}
int temp, sw;
for (i=0;i<m+n;i++)
{
if (num_C[i]>num_C[i+1])
{
temp=num_C[i+1];
num_C[i+1]=num_C[i];
sw=0;
while (i>0 && sw==0)
{
if (num_C[i-1]>temp)
{
num_C[i]=num_C[i-1];
i-=1;
}
else
{
sw=1;
}
num_C[i]=temp;
}
}
printf ("\new_num[%d]=%d" ,i ,num_C[i]);
}


getch();
return 0;
}

tdkhakpur
شنبه 21 آذر 1388, 00:49 صبح
#include <stdio.h>
#include <conio.h>
int main()
{
int i ,j; //counter
int n ,m; //aray size
int *num_A ,*num_B, *num_C;
printf ("\n enter n,m = ");
scanf ("%d%d", &n, &m);
num_A=new int[n];
num_B=new int[m];
num_C=new int[n+m];
for (i=0;i<n;i++)
{
printf("enter num_A[%d]=\n", i);
scanf ("%d", &num_A[i]);
}
for (i=0;i<m;i++)
{
printf ("enter num_B[%d]=\n", i);
scanf ("%d", &num_B[i]);
}
printf("\n\n");
for (i=0;i<m;i++)
num_C[i]=num_A[i];
for (i=0;i<m;i++)
num_C[n+i]=num_B[i];
int temp, sw;
for (i=0;i<n+m;i++){
sw = num_C[i] ;
for (j=i;j<n+m;j++)
if( num_C[j]< sw ){
temp = num_C[j];
num_C[j] = sw;
sw = temp;
}
num_C[i] = sw;
}
for (i=0;i<n+m;i++)
printf ("\new_num[%d]=%d" ,i ,num_C[i]);
delete num_A;
delete num_B;
delete num_C;
getch();
return 0;
}

بانوی ایران
شنبه 21 آذر 1388, 01:16 صبح
ممنون دوست عزيز
دوستان من يه ليست از اعداد دارم ميخوام كاربر بگه عدد yرو از تو ليست پاك كن
برنامه بايد عدد رو پيدا كنه يعني پيدا كنه عددyعنصرnام هست و پاكش كنه
چجوري اين كار رو كنم؟

tdkhakpur
شنبه 21 آذر 1388, 01:24 صبح
یه چیزی تو این مایه هاست


int y=10;
for( int i=0; i<n; i++)
if( num_A[i]==y){
memcpy(&num_A[i], &num_A[i+1], (n-i-1)*sizeof(int));
n--;
}

بانوی ایران
شنبه 21 آذر 1388, 01:42 صبح
#include <stdio.h>
#include <conio.h>
int main()
{
int n, i=0, x, m, y;
int *num;
printf("enter max size of list \n");
scanf("%d", &n);
num= new int[n];
for (i=0;i<n;i++)
{
num[i]=0;
}
printf ("enter number of your list m\n");
scanf ("%d", &m);
for(i=0;i<m;i++)
{
printf("enter num[%d]\n", i);
scanf("%d", &num[i]);
}
printf("enter the number:x");
scanf ("%d",&x);
for (i=0;i<n;i++)
{
if (num[i]==x)
{
n--;
num[i]=num[i-1]

}
getch();
return 0;
}
برنامه تا اينجا رو نوشتم
ليست رو از كاربر ميگيره بعد كاربر ميخواد مقدار xرو removeكنه
جاش رو تو ifپيدا ميكنم جچوري حذفش كنم؟
اون دستور كه شما نوشتيد چيه ؟من بلد نيستم
راه ديگه اي ميدونيد؟

tdkhakpur
شنبه 21 آذر 1388, 02:04 صبح
#include <stdio.h>
#include <conio.h>
int main()
{
int n, i=0, x, m;
int *num;
printf("\n enter max size of list = ");
scanf("%d", &m);
num= new int[m];
for (i=0;i<n;i++)
{
num[i]=0;
}
for(i=0;i<m;i++)
{
printf("\n enter num[%d] = ", i);
scanf("%d", &num[i]);
}
printf("\n enter the number: x = ");
scanf ("%d",&x);

for( int i=0; i<m; i++)
if(num[i]==x){
memcpy(&num[i], &num[i+1], (m-i-1)*sizeof(int));
m--;
n = i;
}
printf("\n number in index %d removed.", n);
for(i=0;i<m;i++)
printf("\n num[%d]", num[i]);
delete num;
getch();
return 0;
}

بانوی ایران
شنبه 21 آذر 1388, 02:08 صبح
اون دستوري كه زديد چيه من بلدش نيستم (بدون اون نميشه؟) تو حلقه forاخر ليست جديد چاپ ميشه؟

memcpy(&num[i], &num[i+1], (m-i-1)*sizeof(int));
اگر لطف كنيد و يه سري به تاپيك اصلاح برنامه بزنيد خيلي خيلي ممنون ميشم

tdkhakpur
شنبه 21 آذر 1388, 02:19 صبح
خوب اون لیست اخر نتیجه کار رو برای شما نشان میده.
درمورد دستور بالا بعث میشه که اگر عدد پیدا شد لیست را یک واحد به شمت چپ بکشه یعنی ایندکس پیدا شده حذف بشود

بانوی ایران
شنبه 21 آذر 1388, 02:22 صبح
اها مشكل من همينه اگر بخوام بدونه اين دستور ليست رو يه دونه بكشم عقب حلقه for رو چه جوري بنويسم و كجا؟ داخلif؟

tdkhakpur
شنبه 21 آذر 1388, 02:30 صبح
خب اون خط از دستور را که برایتان مبهم بود حذف کنید به جاش کد زیر را قرار بدید.


for(int j=i; j<m-1; j++)
num[j]= num[j+1];

موفق باشید.