نزدیک به 5 ماه از مسابقه دوم سیسوگ میگذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالشها هیچ وقت بیحاشیه نیستند مثل دو مسابقه قبل، در واقع مساله اینه که کنار هم چیزهای جدیدی یاد بگیریم نه اینکه بخواهیم بگیم کی بهتره! هرکسی هرچقدر هم عالی باشه توی سطح خودش باز چیزهای جدید برای فراگرفتن هست. پس خواهش میکنم به این چالشها نه به چشم این که ثابت کنیم کی بهتره بلکه به فرصتی برای یادگیری جزییات بیشتر نگاه کنید.
مقدمه
معمولا در طراحی دستگاههای الکترونیکی، همهی دادهها در درون برنامه و میکروکنترلر تولید نمیشوند و لازم است که برخی از دادهها از منابع خارجی تامین شود مثل دادههای انواع سنسور و یا ماژول مخابراتی یا …! برای اینکه بتوانیم از این دادهها در برنامه استفاده کنیم لازم است بعد از صحتسنجی، دادهها را به شکل قابل استفاده تبدیل کنیم.
پایداری تابع تبدیل داده خیلی مهم و تعیینکننده است چرا که اگر به هر دلیلی عملکرد این تابع دچار مشکل شود میتواند عملکرد کل برنامه را تحت تاثیر قرار دهد و خروجیهای پیشبینی نشدهای را تولید کنند! توجه داشته باشید که دادههای ورودی ممکن است تحت تاثیر نویزهای خارجی تغییر کنند و اگر صحتسنجی دادهها انجام نشود قطعا خروجیهای پیشبینی نشدهای ایجاد خواهد شد که در مواردی بسته به حساسیت دستگاه میتواند خسارتهای جبرانناپذیری را ایجاد کند.
این مسابقه تاکیدی بر این مهم است که همه جوانب ممکن را در استخراج اطلاعات در نظر بگیریم تا شاهد عملکرد غیرمنتظره دستگاه نباشیم.
صورت مساله
تابعی بنویسید (به زبان C) که یک رشته را با فرمت زیر در ورودی دریافت کند و ساختار دادهای آن را استخراج کند.
record{ID},{Some number, delmiter is ‘,’},{NAME},{Some Alphabet, delmiter is ‘,’},{POSTALCODE},{Some number, delmiter is ‘,’},{STATUS true/false},End
در رشته فوق دادههای آیدی، نام، کد پستی، و وضعیت برای ما مهم است که باید از این رشته استخراج شوند و در ساختاری به شکل زیر بارگذاری شوند.
دقت داشته باشید اعداد میتوانند + و − باشند و ممکن است با $,%,# ترکیب شده باشند.
1 2 3 4 5 6 7 | typedef struct { int id; char name[16]; int PostalCode; bool Status; } personal_t; |
1 2 3 4 | bool DeserializePersonalData(char *str,personal_t *pptr) { ... } |
مثالهایی برای روشن شدن ورودیهای ممکن:
1 | record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End |
1 | {ID = 15, Name = sisoog, PostalCode=5463213 , Status = true} |
1 | record18,$65535,sisoog,do,5463213,33436,12,18,-17,+16,78,trUe,End |
1 | {ID = 18, Name = sisoog, PostalCode=5463213 , Status = true} |
1 | record16,55,-35,sisoog,End,use,wait,5463213,#88,15,5485,False,End |
1 | {ID = 16, Name = sisoog, PostalCode=5463213 , Status = false} |
1 | record17,15,-45,351,sisoog,do,wait,smit,5463213,33-436,faLse,End |
1 | {ID = 17, Name = sisoog, PostalCode=5463213 , Status = false} |
1 | record17,15,-45,351,sisoog,do,smit,5463213,3436,End |
شرایط داوری و جایزه
با توجه به مقدمه توضیح داده شده و حساسیت کارکرد درست چنین توابعی، کد برنده کدی خواهد بود که در کنار این که نسبت به ورودی های مختلف خروجی درست ایجاد کند باید امنیت بالایی در اجرا داشته باشد و احتمال کرش کردن آن تا جای ممکن کم باشد. بعد از آن کیفیت کد نوشته شده حائز اهمیت است! بذارید به درجه اهمیت پارامترهای مهم در بررسی کد را لیست کنم:
۱− عملکرد درست تابع
۲− امنیت در اجرای صحیح کد با دریافت ورودیهای نامتعارف
کسانی که بتوانند تابع را با توجه به شرایط پیادهسازی کنند به قید قرعه مبلغ پنج میلیون ریال جایزه نقدی دریافت خواهند کرد.
ارسال جواب
پاسخهای خود را در زیر همین پست کامنت کنید.
ممکن است که وقتی کد را برای ما کامنت میکنید، در قسمت کامنت نظم کد به هم بریزد، پس به همین خاطر لازم است که ابتدا به سایت paste.ubuntu.com بروید، Syntax را زبان C انتخاب کنید و کد خود را در قسمت Content کپی کرده و بر روی Paste کلیک کنید و در نهایت فقط URL را در قسمت کامنت برای ما ارسال کنید.
مهلت پاسخ هم تا اخر روز جمعه ۲۴ مرداد ماه ۱۳۹۹ است. {حدود ۷ روز}
پایان و جواب چالش سوم سیسوگ
باز تاکید میکنم همونطور که قبلاً هم گفتم مهم برنده شدن و یا نفر اول بودن نیست!، مسئله اصلی اینه که بتونیم از هم یاد بگیرم و مشکلات احتمالی خودمون رو متوجه بشیم و حلشون کنیم، بگذریم!، فکر میکردم این مسابقه از مسابقه شماره دو خیلی سادهتر باشه! ولی انگار اینطور نبوده، اینو دارم از تعداد مشارکت دوستان میگم، واقعاً فکر میکردم دوستان خیلی بیشتری توی مسابقه شرکت کنند با این از همه دوستانی که شرکت کردند تشکر میکنم.
یکی از دوستان سؤال خیلی خوبی پرسید که لازم میدونم جوابش رو مقداری توضیح بدم. سؤال ساده بود “چه دستگاهی ممکنه چنین خروجیای تولید کنه”! اما جواب ساده نیست اول این که این مسابقه به این دلیل طراحی نشده چون دستگاهی چنین خروجیای ایجاد میکنه! در واقع این مسابقه طراحی شده تا کاربر علاوه بر این که مهارت برنامه نویسی خودش رو تقویت میکنه بتواند نیم نگاهی هم به اتفاقات پیش بینی نشده داشته باشد. مثلاً وقتی دیتایی رو از طریق پروتکل سریال منتقل میکنید به هیچ وجه نمیتوانید مطمئن باشید که دیتا صحیح به مقصد میرسد و باید فرض این باشه که دیتا احتمالاً اشتباه میرسه! اما وقتی داری با tcp/ip کار میکنید فرض بر اینه که دیتا صحیح میرسد، مرز باریک بین دنیای برنامه نویسی برای کامیپوتر و الکترونیک همینجاست، اطمینان و عدم اطمینان! (باعث سوء تفاهم دوستان برنامه نویسی کامپیوتر نشه البته که این مثال ساده برای روشن کردن شرایط متفاوت است.)
بگذارید بریم سر توضیح مسئله، قرار بود دیتایی که به شکل رشته ذخیره شده و هیچ اطمینانی از صحیح بودنش نداریم و یه امنترین روش ممکن دکد کنیم بله در ظاهر به همین سادگی و در باطن اما مقداری چالشی.
پیش از حل بیاید حالتهای مختلف رو لیست کنیم.
۱. لازمه ۴ تا پارامتر رو استخراج کنیم که ممکنه هر کدوم حذف شده باشه.
۲. ممکنه کاراکترهای ناخواسته در جای نادرستی قرار بگیرن مثلاً وسط جایی که باید عدد باشه حروف الفبا باشه یا برعکس یا هر اتفاق دیگه ای
۳. در متغیرهای مورد نیاز رشتهای داریم که طول محدود ۱۶ کاراکتری دارد! باید به این مسئله دقت شود چون ممکنه باعث خطای مهلک سگمنت فالس شود.
اگر برنامهای بنویسیم که در مواجه با این سه فرض ساده، عملکرد معقولی داشته باشد احتمالا برنامه قابل قبولی نوشتهایم. برای تست حالتهای ممکن 11 رشته زیر طراحی شدن:
1 2 3 4 5 6 7 8 9 10 11 | record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End |
رشته اول و دوم و سوم و چهارم کاملاً درسته و نباید توی اطلاعات استخراج شده تناقضی باشه.
در رشته پنجم عبارت end از انتهای رشته حذف شده است و انتظار میرود تابع خروجی false برگرداند.
در رشته ششم پارامتر name بیش از ۱۶ کاراکتر طول دارد و انتظار میرود که تابع عبارت false را برگرداند.
در رشته هفتم مقدار کد پستی اشتباه است چرا که در آن جز عدد کاراکتر حرف هم وجود دارد.
در رشته هشتم ترتیب کاراکترهای وضعیت (status) صحیح نیست و به جای false به شکل fasle ظاهر شده است که انتظار میرود که تابع عبارت false را برگرداند.
در رشته نهم و دهم در جایگاه status کاراکترها به شکل درست در محل درست قرار دادند فقط طول آنها غیرمجاز است و انتظار میرود که تابع عبارت false را برگرداند.
در رشته یازدهم id حذف شده است و انتظار میرود که تابع عبارت false را برگرداند.
و اما برنامهای که برای استخراج دادهها با توجه به شرایط پیش رو مینویسم به شکل زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | bool DeserializePersonalData_Zeus(char* str, personal_t* pptr) { char tfdata[10] = {0}; char temp[10] = {0}; char name[20]; int rlen = sscanf(str,"record%d,%*[-$#%%+,0-9]%19[^,]%*[^0-9]%i%*[-$#%%+,0-9]%5[^,]%8s", &pptr->id,name,&pptr->PostalCode,tfdata,temp); if(rlen!=5 || strlen(name)>15 || strcmp(temp,",End")!=0) return false; strcpy(pptr->name,name); for (char *p = tfdata; *p; ++p) *p = tolower(*p); if(strcmp(tfdata,"true")==0 && strlen(tfdata)==4) pptr->Status = true; else if(strcmp(tfdata,"false")==0 && strlen(tfdata)==5) pptr->Status = false; else return false; return true; } |
حدس میزنم مقداری کد نامتعارف باشد! مخصوصاً رشته فرمت داخل دستور sscanf! اگه داکیومنت های جامع این دستور رو ببینید این نامتعارف بودن مقداری حل میشه. متأسفانه توی کتب درسی و خیلی از سایتها این شکل از فرمت در scanf پرداخته نمیشه و باید اعتراف کنم اولین باری که خودم چنین کدی رو دیدم برام گنگ بود قضیه برمیگرده به سالها پیش که میخواستم رشتههای ارسال شده از طریق gps رو به خونم و کتابخانهای برای این کار دانلود کرده بودم و مشغول مطالعه کدش بودم.
همیشه توصیه میکنم اگه میخواید برنامههای بهتری بنویسید بهتره برنامههای زیادی رو مطالعه کنید و تحلیل کنید به همین سادگی شما هر روز بهتر خواهید بود.
این کد رو زیاد توضیح نمیدم به این دلیل که میخوام یه تمرین برای شما باشه، بگید این برنامه چطور کار می کنه؟:)
مهمتر از آن رشتهای رو با الگوی مطرح شده این مسابقه درست کنید که این تابع نتواند منطقی به آن پاسخ دهد (میدونم که چنین رشتهای وجود دارد!)
همین ۱۱ رشته را به برنامه دوستان داده شد و جواب هر کدام از اون ها لیست شده که میتواند شرح آن را در زیر مشاهده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | Testing Code of Zeus Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Work OK-> record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Work OK-> record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End Work OK-> record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Testing Code of siavash mollayi Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Work OK-> record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Not match output: record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End -> false Not match output: record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End -> false Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End Work OK-> record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Testing Code of mohammad yosefi Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Work OK-> record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Work OK-> record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End -> false Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End -> false Work OK-> record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Testing Code of kamin Jalili Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Work OK-> record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Not match output: record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End -> false Not match output: record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End -> false Not match output: record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End -> false Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End -> false Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End -> false Not match output: record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End -> false Testing Code of ali alaee Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Work OK-> record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Not match output: record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End -> false Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End Not match output: record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End -> false Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End -> false Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End -> false Not match output: record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End -> false Testing Code of moein Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Work OK-> record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Not match output: record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End -> false Not match output: record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End -> false Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End -> false Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End -> false Not match output: record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End -> false Testing Code of cthulhu sea Not match output: record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End -> true Not match output: record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End -> true Not match output: record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End -> true Not match output: record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End -> true Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Work OK-> record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End Work OK-> record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Testing Code of ali torabi Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Work OK-> record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End Not match output: record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End -> true Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Work OK-> record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End Not match output: record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End -> false Testing Code of poya moradi Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Work OK-> record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End Error personal data:record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End name not match sisoog812->do Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Not match output: record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End -> false Not match output: record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End -> false Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End Not match output: record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End -> false Testing Code of sina Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,End Not match output: record1605,55,-35,$45,#65,25658,zeus,End,use,wait,123852,#88,15,5485,False,End -> true Error personal data:record1825,$65535,sisoog812,do,35212367,33436,12,18,-17,+16,78,trUe,End PostalCode not match 35212367->12367 Not match output: record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End -> true Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE Work OK-> record1605,55,-35,$45,#65,25658,ZeusFromSisoogZeus,End,use,wait,123852,#88,15,5485,False,End Work OK-> record65,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,1238d52,#88,$15,5485,FalsE,End Work OK-> record16650,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FaslE,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,Truee,End Work OK-> record15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,FalsEe,End Work OK-> record,55,-35,$45,#65,3623677,zeussisoog,End,false,wait,123852,#88,15,5485,FalsE,End |
متأسفانه هیچ کدام از برنامههای ارسال شده به هر ۱۱ رشته جواب صحیح ندادند! اما برنامه آقای سیاوش مولایی و محمد یوسفی کمترین خطا رو داشتند. برنامه آقای سیاوش مولایی هم خوب نوشته شده و هم خوب عمل می کنه اما به دلیل این که طول رشته name رو چک نمیکنه احتمال این که برنامه دچار segment fault بشه. اینجا کد آقای محمد یوسفی رو برنده اعلام میکنیم.
آقای یوسفی با تلگرام سیسوگ هماهنگ بشید جهت دریافت جایزه:).
سلام
من یک کامنت گذاشتم که نمیدونم چرا تایید نکردید. برنامه ای که به عنوان جواب گذاشتید تو یک حالت درست کار نمیکنه و اون وقتیه که بلافاصله بعد از فیلد اول (id) ، فیلد دوم (name) بیاد .(بعد از یک کاما) به عنوان مثال رشته زیرکه طبق الگوی درست هست ولی خروجی درست نمیده (rlen=1) :
record11,sisoog,1234567,true,End
که در اینجا باید حداقل یک کامای دیگه بین دوتا فیلد اول قرار بدیم تا خروجی درست بده . که به نظرم علت این مشکلم این هست که توی الگویی که که در فرمت استرینگ sscanf گذاشتید بعد از record%d, حداقل یک بار از کاراکترهای داخل اون کروشه رو باید پیدا کنه و نادیده بگیره ( به خروجی نفرسته ) که چون اولین کاراکتر با این ویژگی کامای بعد از sisoogهست ، فیلد name رو پیدا نمیکنه و رشته رو نامعتبر تشخیص میده
حالا برای حل این مشکل چکار میشه کرد؟
سلام
والا من تمام کامنتت های جوابی که دریافت شده بود توی سایت رو تایید کردم و کامنتی نیست که تایید نشده باشه – احتمالا کامنت به دلیلی دریافت نشده و از این بابت متاسفم 🙁
در مورد رشته ای که گفتید بله درسته ولی ببینید توی الگویی که معرفی شده وجود یک عدد حاقل بعد از آیدی و قبل از نام الذامی است با این فرض برنامه ها نوشته شده
https://paste.ubuntu.com/p/D9SgjXNqJK/
از کد https://gist.github.com/ianmackinnon/3294587 به عنوان کد پایه استفاده کردم گفتم تو سورس بگم!
با تشکر از شما برای حفظ کپی راست و حق مالف اولیه 🙂
کد قبلی یک ایراد کوچک داشت که بر طرف کردم
در این روش از regex استفاده شده. البته احتمال در mingw کار نخواهد کرد.
ممنونم – بله واقعا ریجکس عالیه برای استخراج الگوها از رشته ها 🙂
دست شما درد نکنه 🙂
گفتم برای آموزش هم که شده این کد را تکمیل کنم و بفرستم شاید بعدا به کار کسی آمد.
برای حل مساله از regex استفاده کردم و از توابع استاندارد gnu c library
بسیار عالی 🙂
تسلط بر کتابخانه استاندارد سی که حاوی توابع خوب و کاربردی بسیاری هست که قطعا در نوشتن این توابع سرعت و کارایی و امنیت لحاظ شده باعث کوتاه شدن کد نویسی و سرع و کارایی بیشتر برنامه خواهد شد.
در مورد کارکرد برنامه، تابع sscanf ورودی را بر اساس فرمتی که تعریف کردید پردازش میکند و اجزا مورد نظر را استخراج میکند.
بررسی فرمت “record%d,%*[-$#%%+,0-9]%19[^,]%*[^0-9]%i%*[-$#%%+,0-9]%5[^,]%8s”:
۱- record%d : مقدار عددی بعد از کلمه record را استخراج میکند
۲- %*[-$#%%+,0-9]: همه کارکترهایی که داخل کروشه هست را شامل میشود یعنی عدد و +-%#$ و خود کارکتر کاما چون با ٪* شروع شده به خروجی ارسال نمیگردد.
۳- %19[^,]: ۱۹ کارکتر بعدی (حالا چرا ۱۹تا!) بجز کارکتر کاما انتخاب میشوند و به عنوان name ذخیره میشود
۴- %*[^0-9] : شامل تمام کارکترها به جز اعداد هست که چون با ٪* شروع شده این هم به خروجی ارسال نمیشود
۵- %i : عددی که شناسایی شده درpostalcode قرار میگیرد
۶- %*[-$#%%+,0-9] : مثل قسمت ۲
۷- %5[^,] : به طول ۵ کارکتر همه کارکترها بجز کاما انتخاب میشود و در tfdata قرار میگیرد
۸- %8s : به طول ۸ کارکتر استرینگ انتخاب میشود در temp قرار میگیرد
حالا با توجه به این فرمت بالا این رشته که به نظر نباید خروجی صحیح داشته باشد به عنوان رشته صحیح پردازش میگردد
record-15,#15,25,45,si1s*o#o@g abc,s,is,oog,-5463213,6,-7,78,33-43,True,End
سلام – ممنونم برای توضیح مفصل در خصوص کارکرد برنامه نوشته شده
بسیار عالی – اگر اجازه بدید این توضیحات شما رو به پست اضافه کنیم تا دوستان بتوانند استفاده کنند
در خصوص رشته ای که پیشنهاد دادید متوجه نشدم چرا نباید خروجی صحیح داشته باشد ؟ میشه بیشتر توضیح بدید
متشکرم
record-15,#15,25,45,si1s*o#o@g abc,s,is,oog,-5463213,6,-7,78,33-43,True,End
درست هست که id را از نوع int تعریف کردید ولی در همه مثالها ما id منفی داشته باشیم برای همین فکر کردم شاید عدد منفی در id مد نظر نیست و مقدار name باز در همه مثالهای فقط کارکترهای a-z هست که به نظرم آمد که در مقدار name اعداد و کارکترهای دیگر و علامت دیگر قابل قبول نیست. در مورد postalcode هم باز مقدار منفی در مثالها نبود
برای اغداد ذکر کردیم که وجود چه کارکتر هایی مجاز هست و برای name هم کارکتر غیر مجاز ذکر نکردیم و انتهای اون با کاما مشخص میشه و البته طول خوب متغییر
سلام
خیلی ممنون از این مسابقه و آموزش خوبتون . این که این آموزش خیلی خوب رو در قالب یک مسابقه گذاشتید واقعا عالی بود. چالش جواب دادن به سوال مسابقه خیلی به یادگیری و فهم مطلب کمک میکنه . من خودم تقریبا مساله رو حل کرده بودم ولی به روش خیلی سختتر . لطفا از این دست مسابقه ها بیشتر قرار بدید.
اون رشته ی استثنایی هم که مطابق با الگوی مطرح شده هست ولی تابع پاسخ درستی بهش نمیده به عنوان مثال این میتونه باشه:
“record133,sisoog,98214512,FalsE,End ”
برای این که جواب درست بده باید بعد از record 133 دوتا کاما قرار بگیره یعنی به فرم زیر:
record133,,sisoog,98214512,FalsE,End
سلام دوست عزیز
خوشحالم که از این روند خوشتون اومده، در واقع هدف ما هم آموزش حین کار هست که خیلی گیرایی بیشتری داره 🙂
در مورد رشته باید بگم بله این رشته ای که پیشنهاد دادید باعث میشه که برنامه کار نکنه ولی آیا الگوی ما رو هم رعایت کردید ؟ توی الگو گفتیم حداقل اینجا باید یک دیتایی باشه اگر نه خرابه 🙂
داداش این کدتون در کدبلاکز خطا میده _ در توضیحات نوشتین کمی نامتعارف ولی خطا دادن را نگفتین _ اصلا بیلد نمیشه _ به عبارت personal ایراد میگیره
برنامه درسته – باید ببینید خطایی که دریافت می کنید چی هست البته باید بگم نیازه که کتابخانه های stdio و stdlib رو include کنید
اگر مشکل حل نشد – خطا رو قرار بدید تا با هم بررسی کنیم ببینیم مشکل کجاست
سلام، اینکار اختراع کردن دوباره چرخ هست همچنین فرمت اعلامی استاندارد نیست و در توسعه های آتی میتونه مشکل ایجاد کنه. بهترین راه همون استفاده از کتابخانه json برای c هست یا بصورت آماده یا نوشتن خود کتابخانه. در اینصورت اگه سنسور شما یا سرورهای شما و … به هر زبانی باشند مثل پایتون، جاوا، سی و … با یک استانداردی در سریعترین زمان در ارتباط هستند.
بله دوست عزیز توضیح دادم که این مسابقه است و برای چالش چنین چیزی طراحی شده
فرمایش شما هم کاملا صحیح هست اما در نظر بگیرید که توی میکروکنترلرها اینقدر حافظه در دسترس نیست که بخوایم چیزهایی مثل json رو پیاده سازی کنیم هر چند که نشدنی هم نیستند ولی بهتره بگم بهینه نیستند
سلام.
لینک حذف شده است
ممنون – هر چند زمان مسابقه تمام شده بود در زمان ارسال شما – ولی کد شما رو هم بررسی کردم
با سلام
حدودا ساعت 4 صبح است
بالاخره تونستم با توجه به مشغله ای که داشتم طی چند روز از دیدگاه خودم کامل ترین نرم افزار رو بنویسم
یه سری توضیحات در کدها آمده است ، لطفا مطالعه بفرمایید. با تشکر
لینک حذف شده است.
سلام دوست عزیز
ممنون برای وقتی که گذاشتید ولی چرا برنامه رو با سی پلاس پلاس نوشتید ؟!
ذکر کردیم که حتما با سی برنامه رو بنویسید
اگر اجازه و وقت بدید تا اخر همین امروز نرم افزار رو تبدیل به زبان سی خواهم کرد.
جهت سادگی و همچنین تست سخت افزاری ما کدنویسی ها در محیط آردوینو انجام دادیم.
تا اخر همین امروز تبدیل شده رو ارسال میکنم.
چون از دیدگاه خودم نرم افزار به صورت کامل و صحیح کار میکند
سلام دوست عزیز
دارم جواب دوستان رو چک میکنم اگه میتونید تا ساعت ۳ کدتون رو کامنت کنید بررسی میکنم اگر پیش از این طول بکشه چون میخوام جواب ها رو منتشر کنم امکان پذیر نیست متاسفانه
پس لطفا تا همین زمان صبر کنید دارم سهی میکنم تبدیل کنم
ممنون
اوکی منتظر هستم
متاسفانه سعی خودم رو کردم اما زمان بر خواهد بود و تبدیل یه سری توابع کار داره،
به هر حال برنامه بنده در نزم افزار آردوینو نوشته و تست شده است و بدون هیچ مشکل و به صورت کامل کار میکند. خواستین تست برید تو آردوینو باید تست شود.
ممنون از مسابقه خوب تون
خواهش میکنم 🙂
هدف همین تلاشی است که انجام دادید 🙂
متشکرم
کد:
لینک حذف شده است.
سلام چرا در انتهای کد متغییر pptr رو مقدار دهی نکرده بودید – کد شما بررسی شد و به زودی نتیجه اعلام میشود.
بله، فراموش کرده بودم!
تو این کد پرینت تو یه تابع دیگه انجام میشه و personal_t های اولیهی main پر میشن:
لینک حذف شده است.
نمایش:
https://asciinema.org/a/uHbxDVakgCWFeZNzQTI23Haew
سلام – ممنون – کدتون رو خودم اصلاح کردم برای تست 🙂
سلام آیا از روش استیت ماشین میشه استفاده کرد؟
هیچ محدودیتی برای هیچ روشی وجود ندارد 🙂
لینک حذف شده است.
سلام دوست عزیز
الان این که چه ربطی به مسابقه داره – ظاهرا کد برای دیکد کردن رشته ارسالی gps هست فکر میکنم
با عرض سلام و خسته نباشید خدمت جناب زئوس و همکاران
این هم از برنامه من ؛ یک سری توضیحات کوچک داخل یه فایل pdf گزاشتم یه نگاهی هم به اون بیندازید برنامه هم داخل code block 20.03 نوشته و به خوبی کامایل شده و حالات متفاوتی را برای ورودی امتحان کردم.
لینک دوم : http://s10.picofile.com/file/8405656950/ali_torabi.zip.html
با تشکر?
ای کاش کد رو توی همون آدرس ذکر شده قرار می دادید – با این کد شما رو بررسی کردم و به زدوی نتیجه رو اعلام میکنم
با سلام و خسته نباشید از مسابقه خوبتون ?
حداقل اون آخر که اسم اون دو عزیز رو نوشتید و گفتید برنامه شون کمترین خطا را داشته برنامه من هم اندازه اونا ۲ خطا داشته. آخر اسم من رو هم می نوشتید?. یا به خاطر برنامه عجیب و غریب و خارج از اصولی که داشتم ?
بحث خودنمایی نیست یه وقت ها?!! فقط می خوام ضعف خودم رو بدونم اینکه راهکار شما برای حرفه تر شدن در برنامه نویس چی هست؟
اینم بگم که من کلا از اول فرض رو گذاشته بودن که name فقط حروف الفبا است والا موندم چرا اینطور فکر می کردم !
سلام
ببخشید دقت نکرده بودم – بله کاملا درسته – فکر کردم همه بیش از دو خطا دارند -برنامه خوبی نوشتید اتفاقا
در مورد خطای اسم – خیلی از دوستان این تصور رو داشتن اگه نتایج رو نگاه کنید به خوبی مشخص است.
برنامه شما کاملا پتانسیلش رو داشت که اول باشه
انشالله در چالش های آتی
توصیه من تمرین و تمرین هست البته در کنار مطالعه سورس های رایگان و آزاد.
به سلام
یه چیزی که یادم رفته بود بگم (البته یادم که نرفته بود! ) اینکه اون تابع دریافت رشته بدون محدودیت رو از اینجا استفاده کرده بودم:
https://stackoverflow.com/questions/16870485/how-can-i-read-an-input-string-of-unknown-length
متشکرم برای این که به اشتراک میذارید 🙂
الآن این موارد که پایینه همش باید true برگدونه و درسته یعنی هیچ خطایی وجود نداره چون دیدم یکی از دوستان سوال پرسیده بودند در مورد بزرگ یا کوچک بودن End شما گفتید هر جایی ممکنه اتفاق بیافتد مگه نباید طبق قاعده عمل نکرد تو قاعده شما record نوشتید End نوشتید خوب مگه همیشه اون مازول یا دستگاه همین رو نمیده اگر حروفش بزرگ شد یا حرف اول End بزرگ شد یه خطا محسوب میشه.
الآن اینا با اون چیزی که می خواهید درست هستند همشون: یعنی باید true برگردونیم؟
rEcorD15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,TrUe,End
RecOrd15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,END
reCORD15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,TrUe,enD
ReCoRd15,#15,25,45,sisoog,s,is,oog,5463213,6,-7,78,33-43,True,end
اگه کوچک و بزرگی حروف مدنظر باشه – باید صرف نظر کرد ازش
ممکنه end به شکل هایی که مثال زدید استفاده بشه
ولی احتمالا چون ممکنه این برداشت رو برخی دوستان نداشته باشند – ازش صرف نظر میکنم و مطابق همون الگو ی که گفتید رفتار میکنیم
یعنی رکرود به شکل حرف کوچک و End به همین شکل استفاده میکنیم
لینک حذف شده است.
twitter: cthulhu_sea
لینک حذف شده است.
قبلی اشتباه بود… :\
بسیار عالی – این که از فانکشن ها به خوبی استفاده کردید خوشم اومد
کد شما بررسی شد و نتیجه به زودی اعلام میشود.
با عرض سلام و خسته نباشید
کد اولی که ارسال کردم مشکل داشت
این لینک اصلاح شده کده لینک حذف شده است.
سلام دوست عزیز
ممنونم برای این که در مسابقه شرکت کردید – فقط این که چرا تابع DeserializePersonalData را انطور که خواسته شده بود پیاده سازی نکردید به لحاظ ورودی ها منظورم هست
با این کد کدتون رو بررسی کردم و نتیجه به زودی اعلام خواهد شد.
سلام.با تشکر از از مسابقه خوب تون
راستش من تاره کارم توی کدنویسی و هنوز با استراکچر ها و اشاره گر ها کار نکردم
سلام خواهش می کنم – من خوشحالم که توی این مسابقه شرکت کردید، همونطور که اول پست هم اشاره کردم این مسابقه های برای اینه که دور هم چیز های جدید یاد بگیریم 🙂
با سلام
یکی میشه بگه این کارکتر فاصله چیه???? هی کپی می کنم هی می بینم اشتباهه همه درست و فقط همین یکی رشته خطا عجایب علم !!!
http://s11.picofile.com/file/8405609492/Screenshot_11_.png
الان مشکل چیه ! شما فرض کن d آخرین کارکتر است 🙂
لینک حذف شده است.
سلام دوست عزیز 🙂
از جمله کد های خوبی که توی مسابقه شرکت کردند.
کد شما رو بررسی کردم و به زدوی نتیجه رو اعلام میکنم
درود زئوس نازنینم.
همه رو روش تست کردم جواب داده.
لینک حذف شده است.
سلام آقای جلیلی عزیز
ای کاش کدتون رو با توجه به خواسته های به لحاظ ورودی و خروجی می نوشتید – با این کد شما رو بررسی کردم و به زودی نتیجه رو اعلام خواهم کرد.
با سلام .
سپاس بابت ترتیب دادن این مسابقه .
راستش من کد رو به صورت فایلهای .h و .c نوشتم برای همین اونها را به همراه یک فایل توضیحات آپلود کردم .
اینجا :http://www.mediafire.com/file/tl6dy7g9c2cb57o/file
امیدوارم مشکلی برای بررسی کدها پیش نیاد .
با سپاس فراوان.
سلام من کد شما رو نتونستم کامپایل کنم :/
تا بعد از ظهر به دستم برسونید و لطفا همون جایی که گفتم آپلود کنید.
نمونه خطایی که میده مثلا خط ۲۰ فایل c رو ببینید یه کارکتر اشتباه هست.
سلام زئوس گرامی.
بله درسته کاراکتر / اضافه هست .
زئوس جان کد برای pc هست نه میکروکنترلر .
از توابع مربوط به لایبرری های pc استفاده کدم .
سپاس بابت زحمتی که کشیدید .
منم سعی کردم روی کامپیوتر کامپایل کنم که نشد فکر کردم بخاطر یونی کد بهم ریخته
درواقع کد یک کتابخانه هست و مثال اجرایی ننوشتم .
متاسفانه مقدور نیست بیشتر روی این وقت بگزارم .
هر چه که خودتان صلاح دانستید بنده هم قبول دارم .
سپاس بابت مطالب بسیار خوبتان .
سلام
آیا Some number می تواند اعشاری نیز باشد؟
سلام خیر اعداد اعشاری نداریم
سلام، من قبلاً کد برنامه را ارسال نموده بودم، تغییراتی در آن ایجاد کردم و مجددا ارسال می کنم. با خارج نمودن خطوط 66 و 174 از حالت توضیحات امکان پذیرفتن اعداد اعشاری نیز به وجود می آید.
https://paste.ubuntu.com/p/MjY9Xctfxx/
سلام دوست عزیز – ممنون که توی مسابقه شرکت کردید
اعداد اعشاری نیازی نبود 🙂
کد شما رو بررسی کردم و نتیجه رو به زودی اعلام میکنیم
سلام،
واقعا چالش جالبی بود.
از این که کد من رو به عنوان برنده اعلام کردین متشکرم.
چون هدف این چالش آموزش است من کد رو اصلاح کردم که اون دو مورد را هم به درستی دیکود نماید.
لینک حذف شده است.
بد نیست نکته ای رو که خودم با آن در پروژه ها برخورد کردم بگم، چیزی که اینجا به آن توجه نشده تشخیص ابتدای داده ها توسط برنامه است چون ممکنه کاراکترهایی از داده قبلی به صورت خطا قبل این داده ارسال شود بنابراین کد ما باید قادر به تشخیص ابتدای رکورد باشد.
سلام خواهش میکنم
ما که کاری نکردیم – زحمتش رو خود شما کشیده بودید
ممنونم برای اصلاح برنامه – بله این حالتی که مثال زدید اتفاقا زیاد پیش هم میآد 🙂
سلام
یا زمانی که Some Alphabet یا Some number علاوه بر قاعده ای که تعریف کردید شامل کاراکتر های دیگه باشد ولی چهار داده اصلی وجود داشته باشند باید false برگردونیم ؟
بله همینطوره اگر قاعده رعایت نشده باشه باید false برگردانده شود.
مثل مسابقه قبلی توضیحات هم خیلی مهمه یا لازمه که مثلا کامنت بزاریم تو برنامه ؟
کامنت که بذارید خوبه ولی همین که کد درست کار کنه و مشلی پیش نیاره اوکی هست به نظرم
در زمان خطا خروجی تابع که از نوع bool هست باید false که همون 0 هست.
و در زمان درستی باید true که 1 هست برگونه؟؟
چون معادل false رو نگاه کردم تو خود کتاب خونه های c دیدم نوشته define
برای اطمینان از کتابخانه stdbool.h استفاده کنید ! و البته از مقادیر true و false نباید مشکلی باشه
البته این مقادیری هم که نوشتید باز نباید مشکلی باشه ولی برای محکم کاری عرض کردم
الآن فقط STATUS ممکن هر کدوم از حروفش بزرگ یا کوچک باشد ایا End همون End هست ؟ یعنی همیشه حرف اول بزرگ و دو حرف بعدی کوچک است؟
فرض اینه که هرجای عبارت این شکل ممکنه اتفاق بیفته
یعنی record هم می تونه هر کدون از حروفش بزرگ یا کوچک باشه??
تو قاعده با حروف کوچک نوشتید نمیشه بیخیال این بزرگ و کوچیک بودن بشید همه با حروف کوچک باشه؟
بذارید تجدید نظر کنم چون یه سری ها با این پیش فرض که تغییر نمیکنه رفتن جلو
ما هم بنا رو همین میذاریم – تغییر نمیکنه
سلام.
در صورتی که در اولین فیلد دیتای مدنظر استخراج نشود،برنامه با خطا متوقف میشود یا باید برای استخراج بقیه فیلد ها تلاش کرد و نهایتا فالس برگرداند؟
وقتی اولین خطا به وجود میآد انتظار میره عملیات متوقف و false برگردانده شود.
با سلام،
خروجی این ورودی چی هست؟
record17,15,-45,351,sisoog,do,wait,smit,End,5463213,33-436,faLse,
false
چون با end تمام نشده منطقا false
سوال اینجاست که چرا باید همچین خروجی توسط یک دستگاه تولید بشود! ارسال و دریافت اطلاعات اگر بر اساس استاندارد و پروتکل مشخص باشه پردازشش سریعتر خواهد بود با فرمتی که شما گفتید میشه اطلاعات با حجم خیلی بالا تولید کرد شاید چند پتابایت! در این صورت دستگاه شما برای بازیابی و استخراج ۴ تا رکورد باید ساعتها یا روزها منتظر باشد در شرایط فوق اگر این اطلاعات را بر روی کاغذ با پست معمولی ارسال میگردند زودتر جواب میگرفتید. حداکثر طول رشته ورودی را مشخص کنید بعد از پردازش چند کارکتر اگر همه فیلدها بازیابی نشد باید پردازش را متوقف کرد؟
خوب دلایل زیاده !!
براش بیشتر روشن شدن مساله خروجی ماژول های gps مثلا !
در ضمن دوست عزیز این مسابقه است تا مهارت دوستان در استخراج اطلاعات از یک رشته به چالش کشیده بشه 🙂
بله راه های خیلی زیادی هست که میشه داده ها رو انتقال داد. مثلا تا حالا فکر کردید چرا html اصلا یه شکل text داره عرضه میشه ؟ خیلی راه های بهتری هست چرا اونا رو استفاده نمی کنند ؟
هرچقدر مساله طرح شده مابهازای خارجی داشته باشد خوب به نظر من جذاب تر خواهد شد چون با حلش یک مشکلی حل خواهد شد. در مورد ارسال و دریافت اطلاعات در شبکه بر اساس پروتکل tcp/ip که مشتق شده از مدل OSI هست خوب پروتکل http که مسئول دریافت و ارسال html هست پروتکل لایه اپلیکیشن هست که بر اساس نیاز زمان خودش و توسط یک فیزیکدان طراحی و اجرا شده، چرا تکست اجرا شده، در ذهن طراحان html قرار نبود دنیا این شکلی باشد، قراربود یکسری صفحه ساده دارای لینک به صفحات دیگر تهیه و نمایش داده بشود، که خوب الان شده پایه اطلاعرسانی در اینترنت، شاید اکثر مردم اینترنت را فقط به اسم همین وب بشناسند. ولی در لایه ip ارسال و دریافت اطلاعات بر اساس یک پروتکلی است که تقریبا اکثر ارتباطات شبکهای الان بر اساس این پروتکل هست که پردازش این پروتکل بسیار سریع و راحت هست. بگذریم
من با regex انجام دادم در gcc یک کتابخانه وجود دارد که اطلاعاتش را از اینجا می توانید ببینید
https://www.gnu.org/software/libc/manual/html_node/Regular-Expressions.html
regex و مثالهای شما از اینجا قابل نمایش هست
https://regex101.com/r/hhK1tT/1
سلام دوست عزیز
البته توی الکترونیک دقیقا مصداق های زیادی براش داریم 🙂
ممنوم برای مشارکت شما
سلام، چالش خوبی بود. با توجه به تعریف name به صورت 16 کاراکتری در کد من در صورتی که نام از 16 کاراکتر بیشتر شود (با احتساب کاراکتر null انتهای رشته) تابع false برمی گرداند. امیدوارم همین مد نظر شما هم باشد. خیلی متشکرم.
لینک حذف شده است.
با سلام
1- شما طول name رو 16 تا تعیین کردید از آن جایی که 16 امین کاراکتر؛ کاراکتر NULL برای تعیین انتهای رشته است یعنی name که در آخر قرار چاپ بشه 15 کارکتر داره.؟
2- بیشترین اندازه postalcode و id چه قدره چون که int تعریف کردید میشه 2,147,483,647+ و 2,147,483,648 – که شما گفید این دو منفی نمی شن.
3- در آخر یه سوال دیگه اینکه اگر به اون وضیعتی که انتظار نداریم رسیدیم(هنوز نفهمیدم چه حالتی به جز نبودن یکی از داده ها است!!) و خواستیم خروجی false بدیم ایا از اون چهار تا داده اونایی که پیدا کریدم رو چاپ کنیم یا کلا بگیم false ?
۱. میشه فالس برگرداند و میشه تا ۱۵ رو کپی کرد.
۲. همون نوعی که تعریف ساختار تعریف شده همون 2,147,483,647 قابل قبول هست
۳. وقتی عملیات false بشه خوب یعنی یه مشکلی بوده و چیزی چاپ نمیشه اصلا در مورد غیر منتظره بودم مثلا وقتی انتهای رشته end نداریم یا با record شروع نشده باشه و از این دست دیگه
با سلام
من برنامه ام رو داخل code block 20.03 نوشتم دقیق هم درست کار میکنه کلی حالت غیر منظره هم امتحان کردم gcc 8.0.1 x64 ولی حالا که اومدم تو لینکوس امتحانش کنم با این کد build می کنم به کلی خراب کار می کنه گفتم درستش کنم چون شما رو لینکوس تست می کنید مشکلی نداشته باشه
اینم کد build :
gcc main.c -o linux-main
سلام دوست عزیز 🙂
تابع سی که دیگه لینوکس و ویندوز نداره ، همون کد بلاکس هم داره از gcc استفاده میکنه – اگر اونجا کار میکنه پس نباید مشکلی برای لینوکس هم داشته باشه
با سلام مشکل به نحوه غیر منظره ای حل شد.
به کلی ماجرا code block رو ubuntu نصب کردم با اون اومدم بیلد کنم ارور داد که نوع size_t تعریف نشده البته خودش هم راهنمایی کرد که باید stddef.h رو اضافه کنید
این کار رو کردم ولی باز کردم کار نمی کرد با code blockخط به خط دیباگ کردم کاملا درست بود تا اینکه
دست به گزینه ای زدم که هیچ گاه از اش استفاده نمی کردم
من همیشه تو بیشتر IDE هایی که کار میکنم نوع build روی debug هست (که پیش فرض هست) گذاشتم رو release دیدم (آب در کوزه و ما تشنه لبان گرد جهان می گردیم ??) بله درست شد رفتم کد بیلد خود code block رو نگاه کردم دیدم یه O2- اضاف داره . فقط برای یک فلگ O2 چهار ساعت !!!
یکم عجیبه باز – ولی خوب خدارو شکر که حل شد مساله 🙂
سلام سیسوگ (زئوس)
خیلی ممنون برای چالش جدید 🙂
یک سوالی از regex که اجازه نداریم استفاده کنیم درسته؟ (البته در هر صورت من کار کردن با regex رو بلد نیستم)
سلام دوست عزیز
خواهش میکنم
اگه میتوانید این کار رو با ریجکس انجامش بدید که خوب چه خوب انجامش بدید
ولی تا اونجا که من میدونم تو سی ما ریجکس نداریم مگر این که براش کتابخانه ای بنویسید
با سلام بنده دقیق متوجه نشدم که چطوری می خوایم خطا رو برطرف کنیم توی مخابرات وقتی می خوایم گیرنده بهینه داشته باشیم میایم روی سمبل های ممکن یجور arg max می گیریم یعنی حدس می زنیم چیزی که دریافت کردیم به کدوم نزدیک تره.
توی مثال ها این طور که من متوجه شدم صرفا بزرگ و کوچک بودن حروف کلمه ای مانند true ملاک است و اگر برای true یک بیت خطا داشته باشیم ممکنه truf دریافت کنیم.
توی این حالت باید بگیم درست تشخیص دادیم یا خیر؟
با تشکر
امم – منطقا نمی خوایم خطا رو برطرف کنیم !! در اون حالت خیلی بحث پیچیده میشه
کوچک و بزرگ بودن رو نادیده گرفتیم و گفتیم نباید فرقی بینشون گذاشته بشه – اما جابجا شدن بیت ها برامون مهمه و مثلا توی مثال خود شما خروجی باید false باشه
ولی از نگاهتون به مساله خوشم اومد.
سلام
توی عبارات مثلا 33-43 را عدد در نظر گرفتید و خروجی تابع true بود، در حالی که عدد نیست و یک عبارت ریاضی است
سلام
متشکر برای سوالتون – این جزو همون عبارت هایی است که گفتم میتونه با اعداد ترکیب بشه – میشه اول باشه – وسطش باشه یا آخرش
سلام .
شما در یک مثال نشان دادید که status ممکنه حذف شده باشد
آیا ممکن است این اتفاق برای ID یا کد پستی و یا نام هم بیافتد؟
بله چنین احتمالی هست، ممکن است یکی یا چند تا فیلد الزامی حذف شده باشد
با سلام طول کل رشته ورودی البته به یکی از دوستان گفنید محدودیت ندارد ولی میشه بگید مثلا از 500 تا بیشتره یا بیشتر از 1000 تا کاراکتراست ؟
بله ، تا چند کیلوبایت حساب کنید مثلا ده کیلو مثلا
منظور اینه که محدودیت طولی خاص در نظر نگیرید
با سلام
1-ایا همه داده ها حتما با” , “از هم جدا شده اند؟
2-شما گفنید اعداد ممکن است مثبت و منفی باشد و شامل $,%,# ایا این مربوط به postalcode و ID می شود؟
3-مقدار برگشتی تابع(( که می تونه true و false باشه) ایا وضیعت false را فقط زمانی باید برگردانیم که یکی از چهار داده را پیدا نکردیم؟
۱. بله تمام داده ها با کاما از هم جدا می شوند
۲. نه این فیلد ها چنین چیزی را ندارند و فقط شامل اعداد هستند
۳. بذارید اینطور بگم اگه چیزی که انتظارش رو نداریم دریافت کنیم یاید خروجی خطا بدیم
سلام،
حداکثر طول رشته ورودی چقدر است؟
پردازنده میزبان از چه خانوادهای است؟
سیستم میزبان رو یه کامپیوتر بدون محدودیت در نظر بگیرد!
طول رشته ورودی هم محدودیتی براش نداریم
ممنون،
و دو سوال دیگه اینکه:
ممکنه که اعداد در مبنای ۱۰ نباشند؟
ممکنه اعداد اعشاری باشند؟
خواهش میکنم
همه اعداد مبنای ده هستن – اعشاری هم نداریم به لطف خدا :دی
پاسخ:
لینک حذف شده است.
لینک حذف شده است.
یه مسئله ای هست توی سوال. شما postalcode رو با تعداد ارقام بالا دادین توی یکی از مثالها. توی زبان سی بعضی جاها int دو بایتی هست بعضی جاها 4 بایتی. ممکنه برا مواردی که با مقدار 2 بایتی کار میکنن جواب با اون چیزی که شما دادید نخونه چون کلا مقدار postalcode نمیتونه اینقد مقدار بزرگی باشه.
فرض اینه که ما یه برنامه سی داریم می نویسم! توی استاندارد سی مقدار int چهار بایت است 🙂
البته گفته شما کاملا درسته توی میکروکنترلر های 8 بیتی مقدار int دو بایتی است! برای همین مقدار پستال کد رو عددی بیش از 65535 انتخاب کردم که این نکته رفع ابهام بشه.
و نکته بعدی که باید توجه داشته باشید اینه که طول رشته ورودی میتونه هرمقداری باشه !
اصولا فرض این که برای میکروکنترلر دارید برنامه مینویسید رو کنار بذارید – فرض یه کامپیوتر ۳۲ بیتی است
سلام .دوتا سوال دارم ولی اگه میشه این کامنت رو نشون ندین
اینکه گفتین فرض کار با میکروکنترلر رو کنار بگذارید ینی حجم زیاد مهم نیست ؟ چون میخواستم از روش استرایپ استفاده کنم (بر اساس کاما رشته رو تکه تکه کنم و بعد یکی یکی بررسیشون کنم )
مورد بعد کل الگو های جستجو باید دوباره نویسی بشن یا مشکلی نیست از توابع string.h و کتابخانه های استاندارد سی استفاده بشه ؟
خوب اگه بخوام جوابتون رو بدم باید کامنت رو تایید کنم
البته سوال خوبی است و فکر میکنم سوال خیلی از دوست ها باشد
ببینید اگر قرار بود محدودیتی اعمال بشه حتما توی شرط های مسابقه لحاظ میشد. پس وقتی چیزی از محدودیت ننوشتیم ، یعنی می توانید به سادگی از هر تابعی که فکر میکند استفاده کنید.
البته سریع و سبک بودن برنامه امتیاز حساب میشه
امکانش هست کدتون رو مجددا بفرستید ؟ – من نمیتونم کدتون رو ببینم تا بررسی کنم
متشکرم
سلام
بخش هایی که (some number) و (some alphabet) هستند، امکانش هست که تو رکورد موجود نباشند؟ مثلا بعد از record15 خود name باشه؟
سلام دوست عزیز
فرض این هست که حداقل یک بار این پترن وجود داره – میتونه یکی باشه – یا مثلا ده تا !ولی حتما یک بار رو هست
با سلام .
ایا نظم و ترتیب اجزادر رشته ی ارسالی رعایت میشه ؟
یعنی ممکنه جای status با id عوض بشه؟
سلام بله رعایت میشه و ممکن نیست عوض بشه