کسي ميتونه در مورد C کمکي بکنه؟؟؟

در اين بخش مي‌توانيد در مباحث مربوط به زبانهاي بر پايه C به بحث بپردازيد

مدیران انجمن: athlon64x2, abbas.m.k, شوراي نظارت

ارسال پست
Rookie Poster
Rookie Poster
نمایه کاربر
پست: 44
تاریخ عضویت: شنبه 10 تیر 1385, 11:12 am
سپاس‌های ارسالی: 1 بار
سپاس‌های دریافتی: 11 بار

کسي ميتونه در مورد C کمکي بکنه؟؟؟

پست توسط sos1846 » شنبه 7 بهمن 1385, 5:25 pm

سلام
من یه برنامه تو محیط C نوشتم که قراره 20 تا عدد رو بگیره و چاپ کنه و ترتیب صعودی یا نزولی بودنشو بگه اما وقتی کامپایلش میکنم error میده نمیدونم چکار کنم؟؟؟؟؟؟؟
کسی میتونه error هاشو رفع کنه؟؟

کد: انتخاب همه


<stdio.h>
#include <stdlib.h>
#include <string.h>
extern int getline(char[], int);
main()
{
int i=0, temp,j;
char line[256];
int numb[20];
for(i=0;i<20;i++)
{
getline(line,256);
numb[i]=0 to i(line);
};
int get(char line[], int max);
for(i=0;i<20;i++)
{
for(j=i+1;j<20;j++)
{if(numb[i]<numb[j])
{temp=numb[i];
numb[i]=numb[j];
numb[j]=temp;}}}
printf("\n increasing or decreasing\n");
getline(line,20);
if(strcmp(line,"decreasing")==0)
{
for(i=0;i<20;i++)
printf("%d\t",numb[i]);
}
else
for(i=20;i>0;i--)
{
printf("%d\t",numb[i]);
}
return 0;}


Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج شنبه 9 شهریور 1385, 9:15 pm
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 » شنبه 7 بهمن 1385, 6:20 pm

سلام دوست عزيز

برنامه ايرادهاي بسيار اساسي داره که فراتر از مچ نبودن { .} ها است .

اصلا ساختاري براي دريافت 20 عدد و تبديل انها به int و قرار داده در يک ارايه وجود ندارد و در صورت ديباگ نمودن هم برنامه يک رشته 256 کاراکتري مثلا abnlajdsl;jkad;lsa دريافت ميکند که قرار است با numb[i]=0 to i(line); به 20 عدد تبديل شوند که علاوه بر اينکه چنين شکل دستور در سي غير مجاز است و غلط متد کار نيز درست نيست . وانگهي getline جزو iostream است و template based و در کتابخانه هاي سي که در include ذکر کرده ايد نيست . به تو رفتگي کد و هماهنگ نبودن شروع و پايان بلوک (حتما از يکي از دو روش در تمام کد پيروي کنيد روش ريچي يا استراستراپ) و نبود ساختار توجه نشده و ....

ارادتمند
نعيمي

Rookie Poster
Rookie Poster
نمایه کاربر
پست: 44
تاریخ عضویت: شنبه 10 تیر 1385, 11:12 am
سپاس‌های ارسالی: 1 بار
سپاس‌های دریافتی: 11 بار

پست توسط sos1846 » شنبه 7 بهمن 1385, 7:54 pm

سلام
ممنون که جواب دادي اما چيزي که من از اين سوال ميخام اينه که 20تا کاراکتر از کيبورد ( به صورت random) بگيره بعد اونارو به ترتيب صعودي يا نزولي بودن مرتب کنه.
ميتوني کمکي کني که بتونم run کنم اين برنامه رو؟؟
با تشکر
اونقدر ذهنتو باز کن٬ تا مطمئن بشی که نه چیزی می دونی نه کسی هستی٬ و هر وقت احساس کردی که کسی شدی٬ وقتشه که برگردي به جمله اول!

Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج شنبه 9 شهریور 1385, 9:15 pm
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 » شنبه 7 بهمن 1385, 11:41 pm

sos1846 نوشته شده:سلام
ممنون که جواب دادي اما چيزي که من از اين سوال ميخام اينه که 20تا کاراکتر از کيبورد ( به صورت random) بگيره بعد اونارو به ترتيب صعودي يا نزولي بودن مرتب کنه.
ميتوني کمکي کني که بتونم run کنم اين برنامه رو؟؟
با تشکر


سلام دوست خوبم

اين برنامه C کاري که شما ميخوايد رو انجام ميده البته C هست نه C++ وگرنه خيلي ميشه منظم تر و ساختيافته تر نوشت . سعي کردم طبق الگوي برنامه خودتون باشه اما اگر صرفا ديباگ همون برنامه مد نظرتونه بفرماييد تا ارسال کنم. شرمنده که اديتور اينجا تمام فرمتينگ کد رو بهم ميريزه


کد: انتخاب همه

/*start of code*/


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

typedef enum
{
   none = 0,
   descending = -1,
   ascending = 1,
} Sort_Order;

int main()
{
   void   sort_chars();
   Sort_Order   order;
   char   buffer[21], c;

   scanf ("%20s", buffer);

   puts  ("Choose sort order (A)scending, (D)escending or press any key to continue");
   c = getch();

   order = tolower (c) == 'a' ? ascending : tolower (c) == 'd' ? descending : none;
   sort_chars (buffer, 0, strlen(buffer), order );

   printf ("%s\n", buffer );
}

void sort_chars ( char buf[], int start, int count, Sort_Order order )
{
   void swap_char ();
   int      l , r;

   for (l = start ; l < count - 1; l++ )
      for ( r = l + 1; r < count ; r++ )
         if ( ((int)buf[l] - buf[r]) * order > 0  )
            swap_char( buf + l, buf + r);
}

void swap_char ( char *l, char *r )
{
   char t = *l;

   *l = *r;
   *r = t;
}

/*end of code*/


ارادتمند
نعيمي

Administrator
Administrator
نمایه کاربر
پست: 15674
تاریخ عضویت: جمعه 7 بهمن 1384, 7:51 pm
سپاس‌های ارسالی: 70844 بار
سپاس‌های دریافتی: 31298 بار
تماس:

پست توسط Mahdi1944 » یک شنبه 8 بهمن 1385, 12:40 am

athlon64x2 عزيز
ممنون از اينکه به سوالات دوستان با حوصله پاسخ مي ديد :D
براي جلوگيري از به ريختن فرمت، کدها رو در تگ code قرار بديد، کدهاي پست شما رو در تگ code قرار دادم
موفق باشيد :razz:
زندگي صحنه يکتاي هنرمندي ماست هرکسي نغمه خود خواند و از صحنه رود
صحنه پيوسته به جاست خرم آن نغمه که مردم بسپارند به ياد


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] | [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] | مجله الکترونيکي سنترال کلابز

[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] | [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید] | [لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]

لطفا سوالات فني را فقط در خود انجمن مطرح بفرماييد، به اين سوالات در PM پاسخ داده نخواهد شد

Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج شنبه 9 شهریور 1385, 9:15 pm
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 » یک شنبه 8 بهمن 1385, 5:04 am

Mahdi1944 نوشته شده:athlon64x2 عزيز
ممنون از اينکه به سوالات دوستان با حوصله پاسخ مي ديد :D
براي جلوگيري از به ريختن فرمت، کدها رو در تگ code قرار بديد، کدهاي پست شما رو در تگ code قرار دادم
موفق باشيد :razz:


Mahdi1944
دوست و سرور گرامي

از اينکه محبت کرديد و سورس کد رو مرتب فرموديد بي نهايت سپاسگزارم من متاسفانه از اين قابليت اديتور خبر نداشتم .

ارادتمند
نعيمي

Rookie Poster
Rookie Poster
نمایه کاربر
پست: 44
تاریخ عضویت: شنبه 10 تیر 1385, 11:12 am
سپاس‌های ارسالی: 1 بار
سپاس‌های دریافتی: 11 بار

پست توسط sos1846 » یک شنبه 8 بهمن 1385, 10:12 am

سلام باز هم ممنون از لطفتون اما اگر محبت کنيد و برنامه رو با همون debug قبلي بنويسيد متشکرم
اونقدر ذهنتو باز کن٬ تا مطمئن بشی که نه چیزی می دونی نه کسی هستی٬ و هر وقت احساس کردی که کسی شدی٬ وقتشه که برگردي به جمله اول!

Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج شنبه 9 شهریور 1385, 9:15 pm
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 » یک شنبه 8 بهمن 1385, 8:24 pm

sos1846 نوشته شده:سلام باز هم ممنون از لطفتون اما اگر محبت کنيد و برنامه رو با همون debug قبلي بنويسيد متشکرم


سلام دوست گلم

اگر ديباگ کد اولتون مد نظر شماست همونطور که در پست اول گفتم بايد چند اشکال اساسي رو برطرف کنيد که البته فراتر از تغيير چند کلمست . من اينکارو انجام دادم ولي بازهم خيلي با نسخه شما فرق ميکنه که فکر ميکنم مد نظر شما نيست . يک خط باقيمانده هم بايد به سي تبديل بشه . به نظر سورس برنامه به زبان ديگه اي است (احتمالا بيسيک) و قصد شما تبديل خط به خط به معادلش هست ولي درست انجام نشده. بخش ورود اطلاعات نقص فراواني داره و سورت در يکي از جهاتها پياده سازي نشده .

ميبينيد که صرفا ديباگ ساده نيست. اگر خواستيد نعييرت رو اعمال کنيد و سپس گد رو ارسال کنيد يا دست من رو براي اعمال تغييرات مورد نظر باز بگذاريد

ارادتمند
نعيمي

Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج شنبه 9 شهریور 1385, 9:15 pm
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 » دو شنبه 9 بهمن 1385, 2:51 am

سلام

دوست عزيز اين ديگه حداقل تغييري است که ميشه در کد شما داد .

1. توجه کنيد که getline جزو iostream است و نيازمند c++ structured error handling که با منظور شما که برنامه C باشد مغايرت دارد.
2. فرموديد هدف شما دريافت 20 کاراکتر و نمايش مرتب آنهاست . در لوپ اول 20 بار رشته اي بطول 256 کاراکتر قابل تايپ شدن بود در صورتيکه اصلا نيازي به آرايه کاراکتر نيست و خود کاراکترها در زمان دريافت ميتوانند در ارايه int ذخيره شوند در سي برخلاف بيسيک کاراکتر يک بايت است يعني عدد است و اصلا نيازي به تبديل ندارد. اگر اصرار به دريافت رشته کارکتر داريد الزامي براي جلوگيري از buffer overflow خطر بايد مشابه سورس کدي که پيشتر فرستادم اقدام کنيد (در انجا سعي کردم الگوي شما رو حفظ کنم) که البته در کد نويسي تفاوت بسياري با کد اول شما خواهد کرد که مطابق خواست شما نبود.
3. گرفتن يک کاراکتر از ارايه 256 کاراکتري و ذخير کد اسکي که قاعدتا بايد اولين کاراکتر ميبوده اشتباه بود numb[i]=0 to i(line);
4. بجاي کاراکتر در انتهاي کار کد اسکي رو نشون ميداد
5. ضرورتي به الزام کاربر به تايپ کامل عبارت decreasing براي سورت معکوس چندان منطقي نبود (باگ نيست البته)
6. برنامه همانند بيسيک اجرايي خطي يا linear دارد که البته طبق فرمايش شما حفظ شد ولي همانطور که قبلا گفتم با اين رويه موافق نيستم چراکه سي زباني procedural است .
7. هنوز هم کاراکترها رو با فاصله يک tab پرينت ميکنه که کمي ناخواناست (با توجه به سورت شدن) بهتره زير هم و پياپي باشن که البته بازهم تصميم با شماست.


کد: انتخاب همه

#include <stdio.h>
#include <conio.h>

void main()
{
   int i, j, temp;
   int numb[20];
   
   for (i = 0 ; i < 20 ; i++)
      numb[i]= getche();

   for (i = 0 ; i < 20 ; i++)
      for(j = i + 1 ; j < 20 ; j++)
         if( numb[i] < numb[j] ) {
            temp=numb[i];
            numb[i]=numb[j];
            numb[j]=temp;
         }

   puts("\n increasing or decreasing\n");
   i = getch();

   if ( i == 'd' || i == 'D' )
      for(i = 0 ; i < 20 ; i++)
         printf("%c\t" , (char)numb[i]);
   else
      for(i = 19 ; i >= 0 ; i--)
         printf("%c\t" , (char)numb[i]);

   puts("\n");
}




ارادتمند
نعيمي

Major II
Major II
نمایه کاربر
پست: 258
تاریخ عضویت: پنج شنبه 29 تیر 1385, 3:36 am
محل اقامت: دانشگاه
سپاس‌های ارسالی: 6 بار
سپاس‌های دریافتی: 25 بار
تماس:

پست توسط borhan » جمعه 13 بهمن 1385, 3:38 am

سلام
من میخوام یه برنامه بنویسم که درخت B رو پیاده سازی کنه،تو پیاده سازیشم عملیات لازم روش انجام بده،از جمله حذف،اضافه،جستجو و پیمایش..
ضمنا اطلاعات رو از رو فایل بخونه...
اگه شما کدی با این رابطه دارین یا پیشنهادی برا من دارین ازتون میخوام منو راهنماییم کنین .. :(
زود ازدواج کردن اشتباهه،ولي دير ازدواج کردن اشتباهي بزرگتر..

Colonel II
Colonel II
پست: 90
تاریخ عضویت: پنج شنبه 9 شهریور 1385, 9:15 pm
سپاس‌های دریافتی: 9 بار

پست توسط athlon64x2 » جمعه 13 بهمن 1385, 3:56 am

borhan نوشته شده:سلام
من میخوام یه برنامه بنویسم که درخت B رو پیاده سازی کنه،تو پیاده سازیشم عملیات لازم روش انجام بده،از جمله حذف،اضافه،جستجو و پیمایش..
ضمنا اطلاعات رو از رو فایل بخونه...
اگه شما کدی با این رابطه دارین یا پیشنهادی برا من دارین ازتون میخوام منو راهنماییم کنین .. :(


سلام دوست گرامي و عزيز

در مورد کد ميتونين سايت زير رو ببينين که پياده سازي خوب و مناسبي از b-tree به زبان c++ داره و از کتابخانه خاصي استفاده نکرده و اصلاحا پياده سازي pure هست که براي يادگيري عاليه.
[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]

اين سايت هم اطلاعات خوبي در مورد مشخصات و بهينه سازي داره البته سورس کد به سي++ نيست
[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]

در مورد پيشنهاد هم واقعا بسته به تبحر شما در کتابخانه هاي مختلف داره . 6 يا 7 کتابخانه سي و سي++ ميتونيد پيدا کنيد که پياده سازي استاندارد لينک ليست ها و tree ها و ... رو داشته باشن . مثلا من stl رو با اينکه خيلي انتزاعي تر بوده و فاقد tree هاست اما بخاطر ساختار استثنايي کلاس هاش به همه ترجيح ميدم و مثلا اگر بخوام btree درست کنم از mao يا با اکستند کردن iterator اون استفاده ميکنم.

براي خوندن از فايل هم بهتره از fstream استفاده کنيد ولي با c buffered هم کاملا امکانپذيره و مشکلي پيش نمياد چرا که با stdio , stout سر و کارندارين و فايل پويتنر جديد ميسازين اما در يک روتين دو روش رو مخلوط نکنيد . اگر به سمت stl رفتين به شدت fstream توصيه ميشه چرا که خيلي راحت stl براتون alloc/destroy رو انجام ميده و نيازي به مديريت حافظه نخواهيد داست .

ارادتمند
نعيمي

ارسال پست

بازگشت به “C Base Programming”