PDA

View Full Version : سوال: اصلاح برنامه



بانوی ایران
شنبه 28 آذر 1388, 11:59 صبح
سلام دوستان
من هر هفته باید یه سری برنامه بنویسم که راجع به مباحثیه که توی اون هفته یاد میگیرم
به همبن دلیل خیلی توشون دچار مشکل میشم ممنون میشم بهم در اصلاح برنامه هام کمک کنید و در یادگیری اونا کمک کنید
:چشمک:

بانوی ایران
شنبه 28 آذر 1388, 12:09 عصر
اخوب اولین برنامه
این برنامه باید مثلث خیام پاسکال رو چاپ کنه



1
1 1
1 2 1
1 3 3 1
1 4 6 1


سوال گفتهwrite a c function
من برنامه برو بدون استفاده از توابع نوشتم


#include <stdio.h>




#include <conio.h>

int main()
{
int n, i, j;
printf("enter number of row &col\n");
scanf ("%d", &n);
int A[n][n];
for(i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if (j=0)
{
A[i][j]=0;
}
else if(i=j)
{
A[i][j]=1;
}
else if(j>i)
{
A[i][j]=0;
}
else
{
A[i][j]=A[i-1][j]+A[i-1][j-1];
}
}
}
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf ("%d", A[i][j]);
}
printf ("\n");
}
getch();
return 0;
}



اول اینکه من بلد نیستم ارایه دو بعدی رو با استفاده از روش new int بنویسم کسی میتونه راهنمایی که؟
منظورم اینه


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];




این روش cppهست تویcچجوریه؟ و اینکه به صورت دو بعدی

دوم این برنامه اصلا اجرا نمیشه مشکلش چیه؟
چجوری از توابع استفاده کنم(این یکی رو فعلا خیلی توضیح ندید تا روش فکر کنم)

mortezamsp
یک شنبه 29 آذر 1388, 00:09 صبح
اول اینکه include نکرده بودی . اگه تو توربو کارمیکنی باراست کلیک رو اسم تابع توضیحاتشو میاره و نوشته کتابخانش چیه.
دوم اینکه برای شرط تساوی دوبار = بذار.
بعدشم مثلث خیام رو میشد قشنگ تر هم نوشت.تو هیمن انجمن ببین.



#include <conio.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, i, j;
printf("enter number of row &col\n");
scanf ("%d", &n);
int **A=(int**)malloc(n);
for(i=0;i<10;i++)
A[i]=(int*)malloc(n);

for(i=1;i<n;i++)
{
for (j=1;j<n;j++)
{
if (j==0)
A[i][j]=0;
else if(i==j)
A[i][j]=1;
else if(j>i)
A[i][j]=0;
else
A[i][j]=A[i-1][j]+A[i-1][j-1];
}
}


for (i=1;i<n;i++)
{
for(j=1;j<=i;j++)
printf (" %d", A[i][j]);
printf ("\n");
}

getch();
return 0;
}

بانوی ایران
یک شنبه 29 آذر 1388, 15:10 عصر
خيلي ممنون تغييرش دادم اجرا ميشه البته هنوز نياز به كمك داره ولي فعلا روش فكر ميكنم تا بهترش كنم
من از devاستفاده ميكنم
روش malloc رو كه استفاده كرديد فهميدمش ولي ميشه به طور كامل برام توضيح بديد؟
راستي mallocماله زبان c هست؟
و اينكه وقتي ميگهwrite a c functionمن بايد چي رو به صورت function بنويسم منظورم اينه كه كدوم قسمت برنامه رو به صورت function بنويسم؟

:چشمک:

بانوی ایران
یک شنبه 29 آذر 1388, 15:12 عصر
اينم يه برنامه ديگه دو تا ماتريس رو تو هم ضرب ميكنه
اينم بايد با توابع باشه كه نيست(من اول بدون توابع يه برنامه رو مينويسم كه ببينم خود راهش چيه بعد تغييرش ميدم)
ولي مساله اينه كه چرت و پرت چاپ ميكنه


#include <stdio.h>
#include <conio.h>
int main()
{
int n, m, y, i, j, k, x;
printf ("enter row A=colB & col A & row B\n");
scanf ("%d%d%d", &n, &m, &y);
int list_A[n][m], list_B[m][y],new_list[n][y];
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
new_list[i][j]=0;
}
}

for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
printf ("enter list_A[%d][%d]\n", i, j);
scanf ("%d", &list_A[i][j]);
}
}
for (i=0;i<n;i++)
{
for (j=0;j<y;j++)
{
printf("enter list_B[%d][%d]\n", i, j);
scanf ("%d", &list_B[i][j]);
}
}
for (i=0;i<n;i++)
{
for (k=0;k<y;k++)
{
for (j=0;j<m;j++)
{
x=list_A[i][j]*list_B[j][k];
new_list[i][k]+=x;
}
}
}
for (i=0;i<n;i++)
{
for(j=0;j<y;j++)
{
printf("%d ", new_list[i][j]);
}
printf("\n");
}

getch();
return 0;
}

بانوی ایران
دوشنبه 30 آذر 1388, 13:18 عصر
كسي نيست؟
ميشه روش mallocرو يكي ياد من بده ؟

qwerty11
دوشنبه 30 آذر 1388, 16:45 عصر
شما مطمئن هستین که برنامتون اجرا میشه؟؟

شما تابع new_list رو یه تابع n*y در نظر گرفتین ، اونوقت واسه صفر گذاشتن اولیش اومدین دو تا for از n و y گذاشتین چرا ؟؟

بانوی ایران
دوشنبه 30 آذر 1388, 21:00 عصر
نه چرت چاپ ميكنه
منظورتون چيه؟
براي صفر كردنش اشتباه كردم بايد دو تا حلقه forكه i تا nبره وjتا y رو ميزاشتم و صفر ميكردم اشتباها نوشتم mولي تغييرشم كه ميدم بازم درست اجرا نميشه اعداده چرت چاپ ميكنه
ميشه اشكال برنامه رو بگيد؟

qwerty11
سه شنبه 01 دی 1388, 10:57 صبح
شما list_B رو یه آرایه ی m*y در نظر گرفتین ولی موقع خوندن دو تا حلقه ی n تایی و y تایی گذاشتین.

ولی من هنوز تعجب میکنم که چرا برنامه ی شما compile میشه !!؟؟ آخه شما حافظه رو به طور پویا در نظر گرفتین ولی چنین کاری تو c ممکن نیست !!

ویرایش : برنامتون رو تست کردم، درست بود. فقط مشکل همون استفاده از آرایه بود که نمیشه به صورت پویا در نظر گرفت. البته اون اشکالی که تو بالا اشاره کردم هم باید درستش کنی.
باید مثلاً اینجوری بنویسی :


int list_A[100][100], list_B[100][100],new_list[100][100];

بانوی ایران
سه شنبه 01 دی 1388, 23:32 عصر
خيلي ممنون درست شد يعني مشكل اجرا شدنش حل شد
ميشه چند تا چيز رو برام توضيح بديد ؟
ميشه بهم بگيد چجوري از mallocاستفاده كنم؟
و اينكه دريافت يك ماتريس از كاربر رو ميشه به صورت تابع در اورد
منظورم توي اين دو تا برنامه ايا ميشه قسمتي كه elementهاي ماتريس رو از كاربر ميخواد رو هم به صورت تابع نوشت؟

qwerty11
چهارشنبه 02 دی 1388, 06:29 صبح
خيلي ممنون درست شد يعني مشكل اجرا شدنش حل شد
ميشه چند تا چيز رو برام توضيح بديد ؟
ميشه بهم بگيد چجوري از mallocاستفاده كنم؟
و اينكه دريافت يك ماتريس از كاربر رو ميشه به صورت تابع در اورد
منظورم توي اين دو تا برنامه ايا ميشه قسمتي كه elementهاي ماتريس رو از كاربر ميخواد رو هم به صورت تابع نوشت؟
عملگر sizeof تعداد بایتهای اشغال شده توسط عملوند خودش رو یرمیگردونه. به عنوان مثال میدونیم که هر عدد int در زبان c 2 بایت از حافظه را اشغال میکند. پس مقدار sizeof(int) برابر با 2 خواهد بود.
برای تخصیص حافظه به طور پویا از تابع malloc استفاده میکنیم که در کتابخانه ی stdlib وجود دارد. دستور کلی این تابع به صورت void *malloc(size_t size); است که size بایت از حافظه را تخصیص میدهد. اگر موفق به انجام اینکار شد یک اشاره گر به آن ناحیه که حافظه در آن تشخصیص داده شده برمیگرداند. در غیر این صورت یک اشاره گر NULL برمیگرداند.
مثال :



int n = 5;
int *p = (int *)malloc(n * sizeof(int));
if(p==NULL) // can’t allocat
eelse printf(“%d %d %d %d %d”, p[0], p[1], p[12], p[3], p[4]);
در مثال فوق p در واقع به ابتدای محلی اشاره میکند که 10 بایت حافظه در آن تخصیص داده شده است.امیدوارم همینقدر توضیح کارت رو راه بندازه. اگر هم سوالی بود میتونی بپرسی. و البته قبل از پرسیدن اگه یه search تو گوگل انجام بدی حتماً به جواب میرسی.

qwerty11
چهارشنبه 02 دی 1388, 06:44 صبح
و اما درباره ی دریافت آرایه با استفاده از تابع. تو همین سوال دیدی که خودت برای اینکه دو تا آرایه رو بخونی اومده بودی واسه هر کدوم 2 تا for گذاشته بودی و ... . حالا اگه قرار باشه تعداد این آرایه ها زیاد بشه دیگه این روش روش خوبی نیست ...

فرض کن قراره عناصر یه آرایه ی 2 بعدی رو بخونی. یه آرایه ی 2 بعدی چند تا مشخصه داره : تعداد سطرهاش و تعداد ستون هاش. حالا فرض کن قراره یه تابع بنویسی که بیاد عناصر هر آرایه ی 2 بعدی رو بخونه. به نظرت تابع باید چه پارامترهایی داشته باشه !؟ چه نوع خروچی داشته باشه !؟ میدونیم که آرایه ها تو c با آدرس فرستاده میشن و تغییرات رو حفظ میکنن. پس دیگه نیازی نیست تابع ما خروجی خاصی داشته باشه و خروجیش رو void میزاریم و فقط کافیه خود تابع 2 بعدی رو بعنوان آرگومان بفرستیم به اون تابع. از دیگر آرگومانهای این تابع باید تعداد سطرها و ستونهای تابعی باشه که میخوایم عناصرش رو بخونیم. امیدوارم توضیحاتم کافی بوده باشه. نخواستم کدش رو بنویسم چون اینجوری برای شما بهتره. فقط معمولاً اسم تابعی که عناصر یه ماتریس رو میخونه get_matrix میزارن، ولی شما هرجور که راحتی.

در مورد سوال آخرت هم بله میشه. فقط کافیه به اون تابعی که قراره عناصر آرایه رو بخونه یه پارامتر دیگه هم اضافه کنی که نشون میده آرایه ی A در حال خونده شدنه یا آرایه ی B ??.

بانوی ایران
پنج شنبه 03 دی 1388, 00:50 صبح
خيلي ممنون
ولي مشكل من با mallocدو بعديه

حالا با mallocنوشتم توي قسمت ضربش ايراد ميگيره



#include <stdio.h>




#include <conio.h>

#include <stdlib.h>

int *input_array(int row, int column)
{
int *array=(int *)malloc(row*column*sizeof(int));
int i, j;
for (i=0;i<row;i++)
{
for(j=0;j<column;j++)
{
printf ("enter array[%d][%d]\n", i, j);
scanf ("%d", array);
array++;
}
}
return array- row*column;
}
int *multiply (int *first,int *second, int rowA, int columnA, int columnB)
{
int *result=(int*)malloc(rowA*columnB*sizeof(int));
int i,j,k,x;
for (i=0;i<rowA;i++)
{
for (k=0;k<columnB;k++)
{
for (j=0;j<columnA;j++)
{
x=first[i][j]* second[j][k];//اين قسمت ايراد ميگيره
result[i][k]+=x
}
}
}
}
void print_array(int *array,int row, int column)
{
int i, j;
for (i=0;i<row;i++)
{
for(j=0;j<column;j++)
{
printf("%4d ", *array);
array++;
}
printf("\n");
}
}
int main()
{
int n, m, y,*list_A,*list_B,*new_list;
printf("enter n,m,y\n");
scanf ("%d%d%d", &n, &m, &y);
list_A=input_array (n, m);
list_B=input_array(m,y);
new_list=multiply (list_A,list_B,n,m,y);
print_array(new_list,n,y);
getch();
return 0;
}







ميزنه
29 invalid types `int[int]' for array subscript

qwerty11
پنج شنبه 03 دی 1388, 16:01 عصر
اینکه چرا برنامتون کامپایل نمیشه به خاطر اینه که شما تو تابع ضرب، اشاره گرهای first و second رو به صورت int* تعریف کردین و اینجوری دیگه 2 بعدی نمیتونه باشه و مثلاً عبارت first[0[0] اشتباهه.
راستش من malloc دو بعدی رو خودمم دقیق نمیدونم. ولی میتونین با آرایه ی یک بعدی هم حلش کنین و یا اینکه میتونین یکی از بعدهارو یه عدد بزرگ مثلاً 100 در نظر بگیرین.

بانوی ایران
جمعه 25 دی 1388, 22:42 عصر
سلام كسي ميتونه به من بگه چرا اين قسمت برنامم مشكل داره
توي كامپايل كردنش مشكلي نداره ولي توي اجرا به اين خط كه ميرسه ارور ميده

for(j=0;j<(n+1);j++)
list[j]=matrics[0][j];
من يه ماتريس دارم كه ميخوام سطر اولشو نگه دارم
و اومدم يه متغير listتعريف كردم به صورت يه ارايه يه بعدي تا سطر اول رو بريزم توش
حالا مشكل چيه؟(فكر ميكنم ماله اينه كه دارم ارايه دو بعدي ميريزم توي ارايه يه بعدي ولي نميدونم چجوري رفع مشكل كنم)

mabbaszadegan
جمعه 25 دی 1388, 22:52 عصر
چرا j<n+1 ؟ فک کنم ایرادش همین باشه ،

j<n رو امتحان کن

بانوی ایران
جمعه 25 دی 1388, 22:56 عصر
اخه برنامم اينجوريه كاربر عدد nرو وارد ميكنه بعد من يك ماتريسn*n+1دارم كه سطر اولش حفظ ميشه و سطر اول n+1عضو داره با اين حال اين رو هم امتحان كردم بازم ارور ميده نميدونم مشكلش چيه

clover
شنبه 26 دی 1388, 05:56 صبح
ولی دوست داشتم mallocدوبعدی رو هم یاد بگیرم
شما قبلا یک تاپیک در این مورد مطرح کردید و در اون تاپیک کاملا در مورد تخصیص حافظه به صورت پویا از همه نوعش بحث شده. تعجب می کنم دوباره این سوال را می بینم.

بانوی ایران
شنبه 26 دی 1388, 09:56 صبح
نه دوست عزیز مشکلم با mallocحل شده این تاپیک ماله قبلا هست بعد از این توی اون تاپیک شما برام توضیح دادید
دیشب یه سوال کوچیک داشتم و نمیخواستم یه تاپیک جدید درست کنم توی همین تاپیک سوالمو پرسیدم
تحصیص حافظه رو خیلی خوب یاد گرفتم:چشمک:
او پست رو هم حذف کردم که اشتباه نشه:لبخند: