PDA

View Full Version : کسی می تونه این برنامه رو برای من توضیح بده؟



mario party
پنج شنبه 19 تیر 1393, 04:58 صبح
#include <stdio.h>
#define RETURN 0
main ()
{
char a_b_c[!0];
char basin = 122; /* nor isn't basin nothing but 'z'*/
int Cough_1 = ~0/-1, throat = !basin;
int Cough_2 = !!!!Cough_1, g_gut = ~-66 + -Cough_2+2;
int sweat = !!!'\0'+!throat;
(sweat > 0)?(sweat *= (2*2)):(RETURN);
sweat -= -EOF * -EOF;

for (sweat*=1.99*sweat; sweat <= basin; sweat+=(throat='\0'+2)) {
printf("%c ", a_b_c[-g_gut] = sweat);
if ((sweat % ((-EOF+!!--throat)*-EOF)) == -EOF) {
printf("%c\n", a_b_c[-sweat] = g_gut);
g_gut+=basin&3;
}}

for (--sweat, --g_gut; --g_gut >= 66 && --sweat >= 96; --g_gut, --sweat)
printf("%c %c\n", g_gut, sweat);

return RETURN;
}


خروجیش میشه:


a B
c D
e F
g H
i J
k L
m N
o P
q R
s T
u V
w X
y Z
Z y
X w
V u
T s
R q
P o
N m
L k
J i
H g
F e
D c
B a

ولی من از کدهاش سر درنمیارم. ممنون.

mario party
پنج شنبه 19 تیر 1393, 09:29 صبح
سلام.من از خواب پا شدم و هنوز کسی توضیحی نداده...

mario party
پنج شنبه 19 تیر 1393, 15:20 عصر
مثل اینکه وارد انجمن اشتباهی شدم.
یک ذره توضیح؟

emadrezvani
پنج شنبه 19 تیر 1393, 15:32 عصر
شما کدوم خط رو متوجه نمی شید؟‌ اینجا به اندازی کافی متخصص هست که جواب سوال پایه ای مثل این رو داشته باشن. مشکل نوع سوال پرسیدن شماست. مشکل زمان گذاشتن هست !!

emadrezvani
پنج شنبه 19 تیر 1393, 16:04 عصر
این کد در واقع یک نوع کد نویسی مبهم سازی هست. درواقع کار خاصی انجام نمی ده !!
خطوط اول که به این صورت هم میشه نوشت:

char a_b_c[1]; //char a_b_c[!0];
char basin = 'z'; //char basin = 122; /* nor isn't basin nothing but 'z'*/
int Cough_1 = 1 , throat = 0;
int Cough_2 = 1, g_gut = 'B';
int sweat = 2;
برای حلقه هم که sweat برابر حرف 'a' هست و بصورت زیر تبدیل میشه :
for (sweat = 'a' ; sweat <= 'z' ; sweat += 2 ,throat= 2 ) {
در مورد if بعدی که باقیمانده رو با نقیض چک میکنه که عملا در اول شرط throat همشه 2 هست پس:
if ( (sweat % 2) == 1) {
جالبه اگه به step این if دقت کنیم معلومه که این شرط کاربردی نداره ! چرا که مقدار sweat داره دوتا دوتا افزایش پیدا مکنه پس عملا کار بیخودی هست !
نکته بعدی در مورد جمع g_gut هست. که این هم به دلیل & شدن همیشه ۲ میشه! پس همون ثابت 2 رو قرار میدیم. پس نهایتا بصورت زیر نوشته میشه:
for (sweat = 'a' ; sweat <= 'z' ; sweat += 2 ,throat= 2 ) {
printf("%c ", a_b_c[-g_gut] = sweat);
printf("%c\n", a_b_c[-sweat] = g_gut);
g_gut += 2;
}
حلقه بعدی هم معکوس این کار بصورت ساده تر ! دیگه حال نوشتن ندارم. فقط محض .... به شما بود.

emadrezvani
پنج شنبه 19 تیر 1393, 16:18 عصر
اینم کد نهایی شما صورت خلاصه تر:
#include <stdio.h>
#define RETURN 0
main ()
{
char a_b_c[1]; //char a_b_c[!0];
char basin = 'z'; //char basin = 122; /* nor isn't basin nothing but 'z'*/
int Cough_1 = 1 , throat = 2;
int Cough_2 = 1, g_gut = 'B';
int sweat;
for (sweat = 'a' ; sweat <= 'z' ; sweat += 2 ,throat= 2 ) {
printf("%c ", a_b_c[-g_gut] = sweat);
//if ((sweat % ((-EOF+!!--throat)*-EOF)) == -EOF) {
printf("%c\n", a_b_c[-sweat] = g_gut);
g_gut += 2;
}//}

for (sweat = 'y', g_gut = 'Z'; g_gut >= 'B'; g_gut -= 2, sweat -= 2)
printf("%c %c\n", g_gut, sweat);

return RETURN;
}

mario party
پنج شنبه 19 تیر 1393, 16:19 عصر
ممنون، اما ای کاش که روند تبدیل اعداد به یکدیگر رو هم توضیح می دادی.
اون پسره هم گفته بود که این برنامه خیلی سادست، منتها مبهم سازی شدست، که اگر تجربه کار با زبان سی رو داشته باشید، طی چند دقیقه یا کمتر، کل برنامه رو متوجه میشید.
درواقع مثال کوچکی از مبهم سازی کد برامون زد. هرچند، این برنامه رو بهم داد تا خودم متوجه بشم و چندتا اشکال ازش پیدا کنم که نتونستم. تا جایی متوجه شدم ولی در کل خیر.
ممنون.

emadrezvani
پنج شنبه 19 تیر 1393, 16:24 عصر
چند نکته توی این کد وجود داشت که به نظرم در مورد تحقیق کن:
1. کد اسکی حروف و اعداد
2. دسترسی به اندیس آرایه (‌که البته در کد شما میشه اون متغیر تک بعدی اول رو حذف کرد)
3. روند ترتیب اجرا و اولویت های عملگرهایی مثل -- ++ و ...
و ...
در کل مبهم سازی برای افرادی که دانش کافی در مورد یک زبان دارند کاملا ضروری به نظر میرسه.
حالا شما چه نیازی به این کار دارید؟

mario party
پنج شنبه 19 تیر 1393, 16:39 عصر
چند نکته توی این کد وجود داشت که به نظرم در مورد تحقیق کن:
1. کد اسکی حروف و اعداد
2. دسترسی به اندیس آرایه (‌که البته در کد شما میشه اون متغیر تک بعدی اول رو حذف کرد)
3. روند ترتیب اجرا و اولویت های عملگرهایی مثل -- ++ و ...
و ...
در کل مبهم سازی برای افرادی که دانش کافی در مورد یک زبان دارند کاملا ضروری به نظر میرسه.
حالا شما چه نیازی به این کار دارید؟

من تازه شروع به خوندن زبان برنامه نویسی C کردم، و این کد رو یکی از دوستانِ دوستم بهم داد و گفت چون که مبتدی هستی، چیزی متوجه نمیشی،%(

mario party
پنج شنبه 19 تیر 1393, 16:41 عصر
ای وای! تموم نوشته هام خود ه خود حذف شدن!
مجبورم دوباره بنویسمشون...

mario party
پنج شنبه 19 تیر 1393, 16:52 عصر
چند نکته توی این کد وجود داشت که به نظرم در مورد تحقیق کن:
1. کد اسکی حروف و اعداد
2. دسترسی به اندیس آرایه (‌که البته در کد شما میشه اون متغیر تک بعدی اول رو حذف کرد)
3. روند ترتیب اجرا و اولویت های عملگرهایی مثل -- ++ و ...
و ...
در کل مبهم سازی برای افرادی که دانش کافی در مورد یک زبان دارند کاملا ضروری به نظر میرسه.
حالا شما چه نیازی به این کار دارید؟

من تازه شروع به خوندن زبان برنامه نویسی C کردم، و این کد رو یکی از دوستانِ دوستم بهم داد و گفت چون که مبتدی هستی، چیزی متوجه نمیشی، و همونطور که با نکات جدیدی طی کتاب خوندن رو به رو میشی، هر خط از این برنامه رو بهتر متوجه میشی. اتفاقا یک برنامه دیگه شبیه به برنامه ای که شما نوشتی رو برام نوشت و گفت که این همون برنامه هست، منتها مبهم سازی شده نیست و تمیزه.
گفت که در برنامه مشکلاتی وجود داره و برخی از استانداردها رعایت نشدن، پس باید دنبالشون بگردم.
ازش پرسیدم که این برنامه برای مبتدی مثل من سخت نیست؟ گفت اگه آسون بود که تو مبتدی نبودی!
احساس می کنم چیزهای زیادی در این برنامه وجود داره که باید یاد بگیرم، نه؟
مثلا 'EOF ،~ ،& ،'\0' و ! چیکار می کنن؟

mario party
پنج شنبه 19 تیر 1393, 17:08 عصر
EOF- مساوی با 1 هست، پس میشه گفت که EOF درواقع 1- هستش که منفی در منفی میشه مثبت و جواب میشه 1.:لبخند: درست گفتم، نه؟

emadrezvani
پنج شنبه 19 تیر 1393, 17:36 عصر
بله. ثابت EOF مقدار 1- هست.
'\0' که همون 0 هست.
بقیه هم عملگرهای بیتی هستند.
http://en.wikipedia.org/wiki/Bitwise_operations_in_C

mario party
پنج شنبه 19 تیر 1393, 18:41 عصر
بله. ثابت EOF مقدار 1- هست.
'\0' که همون 0 هست.
بقیه هم عملگرهای بیتی هستند.
http://en.wikipedia.org/wiki/Bitwise_operations_in_C

ای بابا! اینها که همون عملگرهای منطقی خودمون هستن!
AND OR NOT که قبلا خونده بودیم!
همون 'درست' و 'غلط'.
پس اگه اشتباه نکنم، صفر اینجا به معنی غلط هست و یک به معنی درست (من درباره اعداد باینری خوندم).
پس با این حساب:
1011 (که عدد دهگانش = 11)
1101 (که عدد دهگانش = 13)
وقتی عملگر & وسطشون قرار بگیره، جواب میشه:
1001 (که عدد دهگانش = 9)
عملگر & تنها بیت 1 در مقابل 1 رو می کنه 1، بقیه رو می کنه 0.

همون ارقام رو اگر بخوایم توسط | که توی صفحه ویکی پدیا نوشته بود میشه OR حساب کنیم، میشه:
1111 (که عدد دهگانش = 15)
عملگر | تنها بیت 0 در مقابل 0 رو می کنه 0، بقیه رو می کنه 1.

NOT رو باید تکی حساب کرد. نوشته بود ~ همون NOT میشه که درواقع 1 ها رو 0 می کنه و 0 ها رو 1 می کنه. یعنی:
11111
میشه
00000


عملگر ^ رو نمی شناختم. اما نوشته که بیت های مشابه هم رو می کنه صفر و بیت های مخالف هم رو می کنه 1 و XOR صدا زده میشه. پس:
101011
111100
میشه
010111 (که عدد دهگانش = 23)
فقط نتونستم << و >> رو بفهمم...

emadrezvani
پنج شنبه 19 تیر 1393, 19:07 عصر
فقط نتونستم << و >> رو بفهمم...
شیفت دادن بیت ها به سمت راست و چت ... (‌ و صفر کردن بیت های جدید بعد از شیفت)

emadrezvani
پنج شنبه 19 تیر 1393, 21:32 عصر
فقط نتونستم << و >> رو بفهمم...
شیفت به راست و چپ بیت ها ! به ازای هر بیت شیف داده شده صفر قرار داده می شود.

mario party
پنج شنبه 19 تیر 1393, 21:48 عصر
int Cough_1 = 1 , throat = 2;

به گمونم این خط رو شما اشتباه کردید، چون مگه basin مساوی با 122 نیست؟ من basin! رو توسط تابع printf چاپ کردم که نوشته بود 0. اما شما نوشتید 2.
به تازگی فهمیدم که اگر مقدار متغیری بیشتر از 0 باشه و بعدش اون متغیر رو در کنار ! چاپ کنیم، جواب میشه 0 و اگر متغیری حاوی عدد 0 باشه و اون رو در کنار ! چاپ کنیم، جواب میشه 1.
حالا متغیر basin که بیشتر از 0 هستش (122) پس جواب میشه 0.
پس با این حساب، خط:


int sweat = !!!'\0'+!throat;

همونطور که شما گفتی '0\' همون 0 هستش، وقتی که ! کنار صفر قرار گرفته باشه، پس جواب میشه 1. بعدش دوباره یه ! دیگه وجود داره پس جواب میشه 0. بعد از اون هم یکی دیگه وجود داره پس جواب میشه 1.
throat هم که 0 بوده و کنارش یه ! وجود داره که میشه 1. در نتیجه 1 + 1 میشه 2 که 2 داخل متغیر sweat میره.

اون پسره یه نسخه ساده از همین برنامه برام نوشت که میشه گفت نسخه ای غیر-مبهم و ساده هستش:

#include <stdio.h>
main ()
{
int b, c;
for (b = 66, c = 97; b <= 90; b += 2, c += 2)
printf("%c %c\n", c, b);
for (b = 90, c = 121; c >= 97; b -= 2, c -= 2)
printf("%c %c\n", b, c);
return 0;
}

emadrezvani
پنج شنبه 19 تیر 1393, 22:18 عصر
به گمونم این خط رو شما اشتباه کردید، چون مگه basin مساوی با 122 نیست؟ من basin! رو توسط تابع printf چاپ کردم که نوشته بود 0. اما شما نوشتید 2.
یکبار روند پست های من رو دقت کن متوجه میشی که یکبار 0 قرار دادم و در طی مراحل بعد متوجه میشیم که از اول باید 2 باشه.


اون پسره یه نسخه ساده از همین برنامه برام نوشت که میشه گفت نسخه ای غیر-مبهم و ساده هستش:
اون پسره یه نسخه آموزشی از کارش رو به شما میداد بهتر بود هاااا.

mario party
پنج شنبه 19 تیر 1393, 22:47 عصر
اون پسره یه نسخه آموزشی از کارش رو به شما میداد بهتر بود هاااا.
آره اما در اون صورت به گمونم از تحقیق کردن سر باز می زدم.
به گمونم می خواست که به مغزم فشار بیارم:لبخندساده:.
اما خب به هرحال نتیجه اش خوب بود. اینکه باعث شد بیام اینجا و سوال بپرسم و کسی مثل شما کمکم کنه و ...
خیلی ممنون.

parisaaaa
پنج شنبه 26 تیر 1393, 13:51 عصر
سلام به همگی
نمیدونم این سوالم به این بخش مربوط میشه یا نه.اگر نیست به زودی پاک میکنم.
دوستان استادم یک برنامه برایم ارسال کرده چون اصلا به برنامه نویسی آشنا نیستم خواستم ازتون کمک بگیرم.
این برنامه باید برای تصاویر اثر انگشت عددی را بعنوان کیفیت آن برگرداند.
اصلا نمیدونم چطور بایدباهاش کارکنم
خیلی خیلی به کمکتان نیاز دارم اگر امکان دارد راهنمایی کنید.:افسرده:
برنامه در این لینک قرار دارد.
https://github.com/lessandro/nbis/ (https://github.com/lessandro/nbis/tree/master/misc/an2kconvert/convertutil)