تبليغاتX
دانشجویان دانشگاه پیام نور آبسرد
دانشجویان دانشگاه پیام نور آبسرد
سایت دانشجویان دانشگاه پیام نور واحد آبسرد

استفاده از توابع API ويندوز در اكسس

جهت استفاده از توابع API ويندوز در قسمتهاي مختلف يك برنامه به زبان اكسس يا ويژوال بيسيك بايد الگوي تابع مورد نظر را در يك ماژول به صورت Public تعريف نماييد در اين الگو شما نام تابع و نام كتابخانه DLL كه تابع مورد نظر در آن تعريف شده را همراه با پارامترهاي ورودي/خروجي آن مشخص كنيد . همچنين ميتوانيد از يك نام دلخواه براي فراخواني تابع استفاده كنيد در اينصورت بايد نام اصلي يا مستعار تابع در كتابخانه مربوطه اش را بعد از عبارت Alias مشخص كنيد.
به عنوان مثال ShellExecuteA يكي از توابع كتابخانه اي ويندوز است كه با همين نام در كتابخانه shell32.dll تعريف شده است. با اين تابع شما قادر خواهيد بود يك فايل دلخواهتان را در محيط برنامه اي كه ويندوزتان براي آن پسوندفايل رجيستر شده، باز كنيد مثلا يك فايل PDF‌ را در محيط آكروبات.
براي استفاده از اين تابع الگوي آنرا به شكل زير در يك ماژول تعريف نماييد
Public Declare Function ShellExecuteA Lib "shell32.dll" (ByVal hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String,
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
اگر بخواهيد از اين تابع با نام apiShellExecute در برنامه تان استفاده كنيد بايد به جاي الگوي فوق، الگوي زير را در ماژول استفاده كنيد.
Public Declare Function apiShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

حال تابعي به نام ShellExecuteA يا apiShellExecute در قسمتهاي مختلف برنامه قابل فراخواني است. در اين مرحله بايد تابع را با پارامترهاي مناسب صدا زد. مثلا به شكل زير:
Dim Lret As Long, LshowHow As Long


Dim stFile As String
LshowHow = 1
stFile = "C:\WO-Status Count8605.pdf"
Lret = ShellExecuteA (hWndAccessApp, vbNullString, stFile, vbNullString, vbNullString, LshowHow )

يا
Lret = apiShellExecute (hWndAccessApp, vbNullString, stFile, vbNullString, vbNullString, LshowHow )




ادامه مطلب + نوشته شده در  جمعه سیزدهم اردیبهشت 1387ساعت 15:22  توسط و.د  | 

ساختارهای کنترلی

در فصل ششم اشاره کردیم که در برنامه نویسی ساختیافته، هر برنامه از 3 ساختار کنترلی بنام: ساختار ترتیب، ساختار انتخاب و ساختار تکرار تشکیل می گردد. از آنجا كه اين 3 ساختار، نحوه و ترتيب اجراي برنامه را كنترل مي كنند، به آنها ساختارهاي كنترلي گفته مي شود. تا کنون فقط با برنامه هایی سروکار داشته ایم که از ساختار ترتیب استفاده می کرده اند، چرا که دستورهای زبان C در حالت عادی به همان ترتیبی که نوشته شده اند، یکی پس از دیگری اجرا می شوند.

اما زبان C دارای 3 نوع ساختار انتخاب می باشد که عبا رتند از : ساختار if یا ساختار تک انتخابی، ساختار if / else یا ساختار دو انتخابی و ساختار switch یا ساختار چند انتخابی. علاوه براین، این زبان دارای 3 نوع ساختار تکرار بنامهای while، for و do / while نیز می باشد که هریک را بطور کامل شرح خواهیم داد.

قرارداد: توجه کنید که در هنگام تشریح یک دستور، خود دستور با رنگ آبی و عملگرهای آن مانند () با رنگ قرمز نشان داده می شوند. قسمتهایی که در داخل <> قرار می گیرند، عبارت یا دستوری هستند که باید در هنگام استفاده جایگزین گردند.

ساختار انتخاب if

این دستور به شکل زیر استفاده می شود:

if () ;

نحوه کار بدینصورت است که ابتدا عبارت موجود در قسمت ارزیابی می شود. در صورتیکه درست ارزیابی گردد، دستور قسمت اجرا  خواهد  شد  و  در  صورتیکه  نادرست  باشد،  بدون  اینکه  دستور  قسمت   را اجرا کند به دستور بعدی خواهد رفت. این دستور می تواند بصورت زیر نیز استفاده گردد: 

if () ;
else ;

در اینصورت ابتدا عبارت موجود در قسمت ارزیابی می شود. در صورتیکه درست ارزیابی گردد، دستور قسمت اجرا خواهد شد، و در صورتیکه نادرست باشد، دستور قسمت اجرا خواهد شد. در هر حال فقط یکی از این دو قسمت اجرا خواهد گردید.

دقت کنید که پرانتز استفاده شده پس از دستور if برخلاف برخی زبانهای دیگر، اجباری است. علاوه براین، در این دستور نیازی به استفاده از then نمی باشد.

بعنوان مثال چنانچه متغیر grade حاوی نمره دانشجو باشد و بخواهیم بر مبنای نمره وی، پیغام مناسبی چاپ کنیم، می توانیم از دستور زیر استفاده کنیم:

if (grade> = 10) printf(“Passed !”);
else printf(“Failed!”);

در حالت عادی دستور if منتظر یک دستور در بدنه خود می باشد، اما چنانچه می خواهید چندین دستور را در بدنه یک دستور if دهید، باید آنها را در داخل آکولاد باز وبسته { } قرار دهید. این مجموع دستورات را یک دستور مرکب می گویند. بطور کلی در زبان C هرجا که می توان یک دستور قرار داد، می توان از یک دستور مرکب نیز استفاده کرد. به یک دستور مرکب، بلوک نیز گفته می شود. بنابراین صورت کلی دستور if به شکل زیر است:

if () {
;
;
….
;
}
else {
;
;
…….
;
}

توجه کنید که وجود قسمت else اختیاری است و در ضمن ممکن است یکی از دو قسمت دارای دستور ساده و دیگری دارای دستور مرکب باشد. بعنوان یک مثال کاملتر به برنامه زیر توجه کنید:

برنامه 1) برنامه ای بنویسید که ضرایب یک معادله درجه 2 را دریافت و ریشه های آن را محاسبه و چاپ نماید.

#include
#include
#include
#include
void main() {
int a, b, c;
float x1, x2, delta;
clrscr();
printf(“Please enter a, b and c : “);
scanf(“%d %d %d”, &a, &b, &c);
if (a==0) {
printf(“wrong equation!”);
exit(1) ;
}
delta = b*b – 4*a*c;
if (delta <0)
printf(“No answer !”);
else if (delta == 0) {
x1 = -b / (2*a);
printf(“There is one answer, x = %f”,x1);
}
else {
delta = sqrt(delta);
x1 = (-b+delta) / (2*a);
x2 = (-b-delta) / (2*a);
printf(“There are two answers, x1= %4.2f and x2= %4.2f”, x1, x2);
}
}
Please enter a, b and c : 3 -7 2
There is two answers, x1 = 2.00 and x2 = 0.33

چندين نكته درمورد برنامه بالا قابل ذكر است.

1- در اين برنامه از 2 تابع جديد استفاده شده است.اولي تابع sqrt كه يك عدد را به عنوان ورودي دريافت و جذر آن را باز مي گرداند. اين تابع در فايل math.h تعريف شده است. و ديگري تابع exit كه باعث مي شود اجراي برنامه خاتمه يابد. اين تابع نيز در فايل stdlib.h تعريف شده است.

2- به نحوه دندانه گذاري در برنامه دقت كنيد، هرجا كه بلوك جديدي ايجاد شده است، دستورات آن حدود 3 كاراكتر جلوتر نوشته شده اند. اينكار باعث مي شود كه خوانايي برنامه افزايش يابد.

3- توجه كنيد كه همانطور كه قبلا نيز گفته شد، خروجي يك عبارت مقايسه اي، يك عدد است كه 0 نشانه نادرست و هر عدد ديگر نشانه درست است. بنابراين در قسمت شرط يك دستور if مي توان بجاي يك عبارت مقايسه اي، هر عبارت ديگري كه يك مقدار عددي بازگرداند نيز قرار داد! بعنوان مثال مي توان بجاي دستور

if (a==0) …

از دستور زير استفاده كرد:

if (!a) …

دراينصورت چنانچه a برابر صفر باشد، نادرست تلقي خواهد شد و در نتيجه نقيض آن يعني ! ، درست محسوب مي گردد.
يك روش متداول استفاده از دستور if، استفاده از if هاي تودرتو مي باشد كه در مثال بالا نيز ديده مي شود. دراينحالت مجموعه اي از عبارات if-else-if بصورت متداخل قرار داده مي شوند. بعنوان نمونه به مثال زير توجه كنيد:

if (grade> = 18) printf("good!");
else if (grade> = 15) printf("medium!");
else if (grade> = 12) printf("rather weak!");
else if (grade> = 10) printf("weak");
else printf("failed!");

در چنين دستوري، كليه شرطها بترتيب از بالا به پايين بررسي شده و به محض اينكه يكي از آنها درست باشد، دستور مربوط به آن اجرا شده و از بقيه دستورات صرفنظر مي گردد. درصورتيكه هيچ يك از شرطها درست نباشد، دستور مربوط به آخرين else اجرا مي گردد. درچنين حالتي توصيه مي گردد كه شرطهاي نادر را كه امكان وقوع آنها كم است، در انتهاي كار بررسي نماييد، تا تعداد مقايسه كمتري صورت پذيرد.

مشكلي كه در مورد if هاي تودرتو پيش مي آيد، مسئله تعيين if مربوط به هر else است. بعنوان مثال در مورد دستور زير، else به كدام if تعلق دارد؟

if (a if (c ;
else ;

همانطور كه از دندانه گذاري نيز مشخص است، else مربوط به دومين if مي باشد. يعني درصورتي اجرا خواهد شد كه a

if (a < b) if (a if (c ; if (c ;
else ; }
else ; else ;

بعنوان يك مثال ديگر، به نمونه زير دقت كنيد:

if () {
if ()
if () ;
else ; // this refer to if ()
}
else ;//this refer to if

برنامه 2) برنامه اي بنويسيد كه 3 عدد را دريافت و حداكثر آنها را چاپ كند.

#include
void main() {
int a, b, c, max;
printf("Please enter 3 numbers :");
scanf("%d %d %d",&a, &b, &c);
if (a> b)
if (a> c) max = a;
else max= c;
else if (b> c) max = b;
else max = c;
printf("Maximum is %d",max);
}

ساختار تكرار while

همانطور كه در بخش الگوريتمها نيز گفته شد، يك ساختار تكرار باعث مي شود تا زمانيكه شرط خاصي برقرار است، عمليات مشخصي تكرار گردد. دستور while نيز باعث ايجاد يك حلقه تكرار به شكل زير مي گردد:

while () ;

اين  دستور  باعث  مي  شود  تا  زمانيكه  شرط  موجود  در  قسمت  درست است،  دستور   قسمت  تكرار شود، و به محض اينكه شرط نادرست گردد، كنترل اجرا به دستور بعد از حلقه مي رود.

بازهم دستور موجود در قسمت مي تواند يك دستور مركب باشد، دراينصورت دستور بصورت زير درخواهد آمد:

while () {
;
;
…….
;
}

برنامه 3) برنامه اي بنويسيد كه يك عدد را دريافت و فاكتوريال آن را محاسبه و چاپ نمايد.

#include
void main() {
int i,number;
long int factorial;
printf("Please enter number :");
scanf("%d",&number);
factorial = 1;
i = 1;
while (i <= number) {
factorial *= i;
i ++;
}
printf("Factorial of %d is %ld"number,factorial);
}

برنامه 4) برنامه اي بنويسيد كه يك متن را از كاربر دريافت و آن را با حروف بزرگ چاپ كند.

#include
void main() {
char ch;
ch = getch() ;
while (ch != 13) {
if (ch>= 'a' && ch <= 'z')
ch -= 32;
putch(ch);
ch = getch();
}
}

ساختار تكرار for

همانگونه كه در مثال مربوط به حل مسئله فاكتوريال ديده مي شود، گاهي نياز به حلقه تكراري داريم كه به تعداد دفعات مشخصي تكرار گردد. در چنين مواقعي با استفاده از يك متغير شمارنده، تعداد تكرارها را تا رسيدن به مقدار مورد نظر می شماریم و سپس به حلقه پایان می دهیم. به چنین حلقه هایی، تکرار تحت کنترل شمارنده یا تکرار معین می گوییم، چرا که تعداد تکرار ها از قبل مشخص است. چنین حلقه ای دارای 3 جزء اصلی می باشد:

1- مقداردهی اولیه به متغیر شمارنده حلقه
2- شرط پایان حلقه (پایان شمارش)
3- نحوه افزایش متغیر شمارنده

از آنجا که در تمام حلقه هایی که تکرار معین دارند، همین ساختار استفاده می شود؛ در اکثر زبانهای برنامه سازی یک ساختار تکرار ویژه، بنام حلقه for، برای اینکار در نظر گرفته شده است. اما در این بین، حلقه تکرار for در زبان C دارای ویژگیهای خاصی است که آنرا از سایر زبانها متمایز کرده و به آن قدرت بسیار بالایی داده است. شکل کلی این دستور بصورت زیر است:

for ( ; ; ) ;

وظایف عبارات فوق بشرح زیر است :

1- ، مقداردهی اولیه به متغیر حلقه

2- ، شرط اجرای حلقه

3- ،نحوه افزایش متغیر حلقه

البته همانندموارد قبل بازهم قسمت می تواند یک دستور مرکب باشد. نحوه کار حلقه بدینصورت است که در ابتدای شروع حلقه فقط برای یکبار اجرا می شود. سپس عبارت بررسی می گردد و در صورتیکه درست ارزیابی شود (≠ 0)، آنگاه دستور اجرا شده و سپس به ابتدای حلقه باز می گردد. از اجرای دوم به بعد، ابتدا عبارت اجرا می گردد (یعنی متغیر حلقه افزایش می یابد) و سپس عبارت بررسی می گردد و مجددا درصورت درست بودن، حلقه تکرار می شود. اینکار تا زمانیکه مقدار عبارت نادرست ( = 0) ارزیابی شود، تکرار می گردد. به محض اینکه این اتفاق بیفتد، کنترل اجرا به دستور پس از حلقه انتقال می یابد.
درحقیقت هر حلقه for معادل با حلقه while زیر است:

;
while () {
;
;
}

بعنوان یک مثال ساده، تکه برنامه زیر اعداد بین 0 تا 100 را چاپ می نماید:

int count;
for (count = 0; count <= 100; count ++)
printf(“%d “,count);

اگر بخواهيم تنها مضارب 5 چاپ شوند، حلقه را به شكل زير تغيير مي دهيم:

for (count = 0; count <= 100; count += 5)

حتي مي توان مضارب 5 را از آخر به اول چاپ كرد:

for (count = 100; count> = 0; count -= 5)

قسمت شرط مي تواند يك شرط مركب نيز باشد، بعنوان مثال:

for (count = 0; count <100 && sw==1; count ++)

كه در اينصورت در هربار اجراي حلقه، علاوه بر مقدار شمارنده، مقدار متغير sw نيز بررسي مي گردد.

نكته آخر اينكه قسمت مقدار دهي اوليه و افزايش متغير نيز مي توانند شامل چند عبارت باشند كه در اينصورت با كاما از يكديگر جدا مي شوند. بعنوان مثال:

for (a = 0, b = 100; b – a> 50; a++, b--)

در ادامه یک مثال کاملتر برای تشریح این حلقه آمده است:

برنامه 5) برنامه ای بنویسید که تعدادی عدد را از کاربر دریافت و 2 عدد بزرگتر و مجموع آنها را محاسبه و چاپ نماید.

#include
void main() {
int i, n, number;
int sum, max1, max2;
printf(“please enter n : “);
scanf(“%d”,&n);
sum = 0;
max1 = max2 = -1;
for (i=1 ; iprintf(“enter number : “);
scanf(“%d”,&number);
sum += number;
if (number> max1) {
max2 = max1;
max1 = number;
}
else if (number> max2)
max2 = number;
} //end for
printf(“Sum = %d, Maximum 1=%d, Maximum 2= d”, sum, max1, max2);
}

نكته جالب در مورد حلقه for آنستكه مي توان هريك از 3 عبارت فوق را حذف كرد. به مثالهاي زير توجه كنيد:

for (;i<100; i++)

مقداردهي اوليه حذف شده است. اين در صورتي است كه بنحوي قبل از شروع حلقه، مقدار متغير i تعيين شده باشد.

for (i= 0;i<100;)

نحوه افزايش متغير حلقه حذف شده است. اين مورد زماني بكار مي رود كه نحوه افزايش متغير حلقه پيچيده بوده و توسط برنامه نويس در داخل حلقه انجام شود.

for (;i<100;)

هر دو مورد فوق حذف شده است.

for (i=0; ;i++)

شرط ادامه حلقه حذف شده است. اين مورد زياد متداول نيست و ممكن است باعث شود حلقه براي هميشه اجرا شود. در چنين مواردي حتما بايد در داخل حلقه با استفاده از دستور break (كه در قسمتهاي بعدي توضيح داده خواهد شد)، راهي براي خروج از حلقه قرار داده شود.

حلقه do / while

همانگونه كه در قسمت الگوريتمها توضيح داده شد، در بعضي مواقع لازم است كه شرط ، در انتهاي حلقه بررسي گردد. دستور do / while از نوع حلقه هايي است كه ابتدا دستورات را اجرا كرده و سپس شرط ادامه حلقه را بررسي مي نمايد. شكل كلي اين دستور بصورت زير است:

do
;
while () ;

نحوه كار اين حلقه به اين صورت است كه ابتدا دستور اجرا مي گردد، سپس شرط حلقه بررسي شده و درصورتيكه درست بود، به ابتداي حلقه باز گشته و آن را مجددا اجرا مي كند. البته دستور مي تواند يك دستور مركب باشد.

بعنوان يك مثال كوچك، ممكن است شما از كاربر خواسته ايد كه اعلام كند آيا مايل به ادامه هست يا خير؟ وي بايد پاسخ y يا n بدهد، اما ممكن است يك حرف اشتباه (مانند m) وارد كند. قصد داريم تكه برنامه اي بنويسيم كه عمل دريافت پاسخ را تا زمانيكه يك حرف درست وارد شود، تكرار كند. مسلم است كه بايد ابتدا يك پاسخ وارد شود و سپس درستي آن بررسي گردد.

char answer;
do {
printf("Do you want to continue (y/n) ?");
answer = getch();
} while (answer != 'y' && answer != 'n') ;

بعنوان يك نمونه كاملتر به مثال زير توجه كنيد.

برنامه 6) فرض كنيد نمرات يك گروه از دانشجويان بصورت درجه بندي (A, B, C and D) آماده شده است. برنامه اي بنويسيد كه نمرات دانشجويان را دريافت و در پايان درصد هريك از نمرات را محاسبه و چاپ نمايد. در ضمن از آنجا كه تعداد دانشجويان از قبل مشخص نيست، كاربر در انتهاي نمرات، حرف Q (مخفف Quit) را وارد مي نمايد.

#include
void main() {
int aCount, bCount, cCount, dCount, n;
char grade;
aCount = bCount = cCount = dCount = n = 0;
do {
printf("Enter grade (Q for Quit) : ");
grade = getch() ;
n ++;
if (grade == 'A') aCount ++;
else if (grade == 'B') bCount ++;
else if (grade == 'C') cCount ++;
else if (grade == 'D') dCount ++;
else if (grade == 'Q') n --;
else {
printf("Wrong grade, try again.\n");
n --;
}
} while (grade != 'Q' ) ;
printf("Statistics :\n");
printf("Grade A : %f percent\n", float(aCount)/float(n));
printf("Grade B : %f percent\n", float(bCount)/float(n));
printf("Grade C : %f percent\n", float(cCount)/float(n));
printf("Grade D : %f percent\n", float(dCount)/float(n));
} // end main
ساختار switch / case

اگر مجددا به برنامه 6 دقت كنيد، خواهيد ديد كه در بعضي موارد قصد داريم برحسب مقادير مختلف يك عبارت (در اينجا مقدار متغير grade)، عمليات متفاوتي را انجام دهيم. گرچه اينكار با استفاده از دستورات if / else متداخل قابل انجام است، اما ساختار مناسبتري نيز براي اينكار وجود دارد، كه به آن ساختار چندانتخابي مي گوييم. شكل كلي ان ساختار بصورت زير است:

switch () {
case : ;
;

;
case : ;
;

;

default : ;
;

;
}

برنامه 7) برنامه 6 را با استفاده از دستور switch / case بازنويسي نماييد. برنامه را بگونه اي بنويسيد كه حروف بزرگ و كوچك هردو مورد قبول واقع شود.

#include
void main() {
int aCount, bCount, cCount, dCount, n;
char grade;
aCount = bCount = cCount = dCount = n = 0;
do {
printf("Enter grade (Q for Quit) : ");
grade = getch() ;
n ++;
switch (grade) {
case 'A' :
case 'a' : aCount ++; break ;
case 'B' :
case 'b' : bCount ++; break ;
case 'C' :
case 'c' : cCount ++; break ;
case 'D' :
case 'd' : dCount ++; break ;
case 'Q' :
case 'q' : n--; break ;
default : printf("Wrong grade, try again.\n");
n --;
} //end switch
} while (grade != 'Q' ) ;
printf("Statistics :\n");
printf("Grade A : %f percent\n", float(aCount)/float(n));
printf("Grade B : %f percent\n", float(bCount)/float(n));
printf("Grade C : %f percent\n", float(cCount)/float(n));
printf("Grade D : %f percent\n", float(dCount)/float(n));
} // end main

برنامه 8) برنامه اي بنويسيد كه يك عدد، يك عملگر و يك عدد ديگر را از كاربر دريافت و پس از اعمال عملگر برروي دو عدد، حاصل را چاپ نمايد.

#include
void main() {
int number2, number2, result;
char op ;
printf("Please enter number1 operator number2 : ");
scanf("%d %c %d",&number1, &number2, &op, &number3);
result = 0;
switch (op) {
case '+' : result = number1 + number2 ; break;
case '-' : result = number1 - number2 ; break;
case '*' : result = number1 * number2 ; break;
case '/' : if (number2 != 0) result = number1 / number2 ;
else printf("There is no answer!\n");
break;
case '%' : if (number2 != 0) result = number1 % number2 ;
else printf("There is no answer!\n");
break;
default : printf("invalid operator!\n");
}
printf("Result = %d",&result);
}

دستورات break و continue

اين دستورات قادرند مسير اجراي برنامه را در يك حلقه تكرار تغيير دهند. البته اين تغيير مسير بصورت كنترل شده بوده و همانند دستور goto نمي توان به هرجاي دلخواه پرش كرد.

چنانچه دستور break در يك ساختار while، for، do/while ويا switch بكار رود، باعث مي شود كه بلافاصله كنترل اجراي برنامه از ساختار خارج شده و به اولين دستور پس از ساختار برود. قبلا كاربرد اين دستور را در switch ديده ايد. در اينجا به مثال زير دقت كنيد:

برنامه 9) برنامه 5 را بگونه اي تغيير دهيد كه فقط اعداد مثبت را بپذيرد، و درصورتيكه عدد منفي وارد شد، بلافاصله به عمليات خاتمه داده و نتايج تا همين نقطه را چاپ نمايد.

#include
void main() {
int i, n, number;
int sum, max1, max2;
printf(“please enter n : “);
scanf(“%d”,&n);
sum = 0;
max1 = max2 = -1;
for (i=1 ; iprintf(“enter number : “);
scanf(“%d”,&number);
if (number <0) break; // this is the difference
sum += number;
if (number> max1) {
max2 = max1;
max1 = number;
}
else if (number> max2)
max2 = number;
} //end for
printf(“Sum = %d, Maximum 1=%d, Maximum 2= d”, sum, max1, max2);
}

اما دستور continue فقط در حلقه هاي while، for و do/while بكار مي رود. نحوه عمل آن بدين صورت است كه به محض آنكه كنترل اجرا به اين دستور برسد، بلافاصله از باقيمانده حلقه صرفنظر كرده و مجددا به ابتداي حلقه باز مي گردد و اجراي آن را از سر مي گيرد. در مورد حلقه for، پس از بازگشت به ابتداي حلقه، عمل افزايش مقدار متغير حلقه نيز صورت مي پذيرد.

بعنوان مثال، چنانچه بخواهيم برنامه 9 را بگونه اي تغيير دهيم كه از اعداد منفي صرفنظر كند و آنها را در محاسبات لحاظ نكند، كافيست دستور

if (number <0) break;

را به دستور زير تبديل كنيم:

if (number <0) continue;

دراينصورت، چنانچه عدد منفي باشد، بدون اينكه محاسبات بعدي انجام شوند، كنترل به ابتداي حلقه بازگشته و عدد بعدي را دريافت مي كند.




ادامه مطلب + نوشته شده در  شنبه بیست و نهم دی 1386ساعت 17:21  توسط و.د  | 

PHP چيست؟

PHP يک زبان برنامه نويسی با کد باز (Open-Source) است که اگرچه در ابتدا صرفا جهت برنامه نويسی تحت وب توليد شد، امروزه کارآييهای فراوانی پيدا کرده است. PHP يک زبان تحت سرور است (Server-Side) که طبيعتا برای اجرا نياز به يک برنامه سرويس دهنده وب (Web Server) دارد.

کسانيکه مانند خود من قبلا با PERL کار کرده اند و حالا قصد دارند با PHP کار کنند، احتمالا مثل من در ابتدا به مشکلاتی بر خواهند خورد اما مطمئن باشيد که PHP را سريع خواهيد آموخت. آنچه به نظر من از خصوصيات خوب PHP بشمار می آيد آن است که با وجود شباهت PHP با PERL، PHP پيچيدگيهای PERL را کمتر دارا می باشد. هرچند که قدرت PERL بر روی متن ها غير قابل انکار است اما فراموش نکنيد که PHP را صرفا برای محيط وب ساخته اند پس به اندازه کافی ( و حتی بيش از حد کافی ) امکانات کار با stringها را به شما ارائه خواهد کرد. فکر می کنم مقدمه چينی بيش از اين هم حوصله شما را سر می برد و هم من را از موضوع دور می کند پس بر می گرديم به PHP.

برای شروع کار با PHP چه نياز داريم؟

PHP برای اجرا نياز به يک Web-Server دارد. دم دست ترين Web-Server برای شما احتمالا IIS خواهد بود، چرا که با استفاده از سی دی Windows قابل نصب است. نمی خواهم در اين مقاله به شرح نصب IIS (يا وب سرورهای ديگر) بپردازم اما اگر نياز به شرح آن داريد لطفا با من تماس بگيريد تا بطور مفصل آن را شرح دهم (آدرس پست الکترونيکی من در انتهای اين مقاله آمده است). برای کسانيکه بقول يکی از دوستان من، "مرام Open Source" گلوی آنها را می فشارد شايد بهتر باشد از Apache به عنوان Web-Server استفاده کنند. (البته اگر از حق هم نگذريم Apache خيلی از IISبهتره!!!)

اگر Web-Server مورد علاقه شما به درستی بر روی دستگاه شما نصب شده است، حالا نياز داريد که PHP را بر روی آن نصب کنيد. برای بدست آوردن کد PHP از آدرس http://www.php.net/downloads.php استفاده کنيد.

طبيعتا برای مشاهده نتيجه اجرای فايلهای PHP نياز به يک مرورگر وب (Web Browser) داريد که مسلما رايجترين آن Internet Explorer است. برای درست کردن هر فايل PHP هم نياز به يک ويرايشگر ساده متنی داريد (مثلا Word pad يا Note pad ) توجه کنيد که از ويرايشگرهای حرفه ای مانند Microsoft Word نمی توانيد استفاده کنيد زيرا اين ويرايشگرها از کاراکترهای پنهانی فراوانی استفاده می کنند که در هنگام ذخيره فايل متنی اين کاراکترها هم ذخيره خواهند شد که باعث عدم اجرای دستورات PHP می شوند. با هم يک کد ساده PHP بنويسيم.
حالا می خواهيم اولين کد PHP را با هم درست کنيم. ويرايشگر متن را باز کنيد (مثلا Word pad) و در آن چنين بنويسيد:

 

echo (“Hi! I am the first PHP script you have made!”);
?>

 

حالا فايلتان را با عنوان 1st.php و در Web Server Local Folder ذخيره نماييد (اگر از IIS استفاده می کنيد اين فولدر در درايوی که Windows را در آن نصب کرده ايد، با نام Inetpub وجود دارد. در داخل آن فولدر ديگری به نام wwwroot وجود دارد که بايد فايلتان را در آن بريزيد.)

حالا مرورگر وب خود را باز کنيد (مثلا Internet Explorer) و در قسمت آدرس آن ابتدا //:http و سپس نام کامپيوتر خود و يا آدرس IP آن را تايپ نماييد (نام کاميوتر را در Control panel/System/Network Identification و IP را در صورتيکه تعيين کرده باشيد در قسمت Command Prompt و با اجرای دستور ipconfig می توانيد مشاهده کنيد) و پس از يک Backslash (/) نام فايل (1st.php) را تايپ نموده و Enter را بزنيد. بعنوان مثال نام کامپيوتر من siamak است. پس بايد در قسمت آدرس مرورگرم خط زير را بنويسم:

http://siamak/1st.php

اگر همه چيز را تا اينجا درست انجام داده باشيد، متن زير در مرورگرتان پديدار می شود: 

 

همانطور که احتمالا متوجه شديد، بايد کد PHP خود را در داخل تگ قرار دهيد. البته می توانيد از روشهای ديگر نيز استفاده کنيد اما متداولترين روش همين است.

دستور ()echo در PHP وظيفه چاپ در خروجی را بر عهده دارد.
می توانستيم همين کد را با کمک تگهای HTML و بصورت زير نيز بنويسيم:



echo ("Hi! I am the first PHP script you have made!");
?>




ادامه مطلب + نوشته شده در  شنبه بیست و نهم دی 1386ساعت 17:18  توسط و.د  | 

مقايسه خواص عمومي يك كلاس در C++ و C#

قبل از بررسي تفاوت بين كلاسها بين C++ و C# ابتدا خاصيت هاي عمومي يك كلاس را بررسي كرده سپس به بررسي تفاوت بين اين دو زبان قدرتمند خواهيم پرداخت.

تعريف. كلاس در حالت ساده مجموعه اي از خواص(attributes) و روش ها (methodes) است كه در رابطه با هم هدف مشتركي را دنبال مي كنند و خدماتي را ارائه مي كنند. البته اين تعريف در حد يك تعريف علمي مي باشد ولي ذكر اين نكته ضروري است كه اكثر تعاريف در شي گرايي در طبيعت وجود دارد و در ساده ترين حالت براي تعريف يك كلاس مي توان از تعريف انسان استفاده كرد كه  اين بحث در اين مقاله نمي گنجد. در هر حال ما به تعريف فوق اكتفا كرده و بحث را ادامه مي دهيم.

 خواص ها و روش ها كه در تعريف كلاس ارائه شد مي تواند نحوه دسترسي متفاوتي مانند public و private و protected داشته باشد كه براي برنامه نويسان C++ نيازي به توضيح نيست.

  

تفاوت در تعريف يك كلاس:

چنانچه در مقاله لايه ها در C# نيز اشاره شد يك كلاس در يك برنامه C# در داخل يك لايه تعريف خواهد شد(اجباري نيست). تعريف يك كلاس در C# تفاوتهايي با C++ دارد كه سعي خواهيم كرد اين تفاوت ها را با چند مثال توضيح دهيم.

فرض كنيد كلاس زير در C++ تعريف شده است كه اين كلاس را به يك كلاس C# تبديل خواهيم كرد.

      // Test.h

      class CTest{

            private:

                  int   m_at1;

                  int   f1();

            public:

                  float m_at2;

                  int   f2();

                        CTest();

                        ~CTest();

      };

     

      // Test.cpp

      #include "test.h"

      CTest::CTest(){

            m_at1 = 0;

            m_at2 = 0.0;

      }

      CTest::~CTest(){

            // cout << "destructor call";

      }

      int CTest::f1(){

                  return m_at1;

      }

      int CTest::f2(){

            return m_at1+(int)m_at2;

      }

   

تفاوت اول:

بر خلاف C++ در C# تعريف و نحوه عملكرد يك تابع يا Method در خود تعريف كلاس قرار داده مي شود. در C++ غالبا تعريف كلاس در فايل .h و بدنه توابع در فايل .cpp قرار مي گرفت. البته ذكر اين نكته ضروري است كه مي توان همين عمل را در .h نيز قرار داد ولي در يك برنامه بزرگ اين عمل كنترل برنامه را از دست برنامه نويس خارج كرده و همچنين مشكلات ديگري را براي برنامه نويسان ايجاد مي كند كه برنامه نويسان C++ با اين مشكلات آشنا هستند.

تفاوت دوم:

بر خلاف C++ در C# يك دسته از متغييرها را نمي توان بصورت public يا private و ... تعريف كرد و براي هر متغيير بايد نحوه دسترسي به آن نيز مشخص شود.

 

تفاوت سوم:

بر خلاف C++ در C# تابع destructor وجود ندارد و خود C# مسئول از بين بردن يك شي مي باشد كه اين از بين بردن با توجه به محدوده تعريف اين شي انجام مي شود. البته تعريف destructor وجود دارد ولي نمي توان destructor را فراخواني كرد . در C++ فراخواني Destructor با استفاده از عملگر delete قابل انجام بود ولي چون C# مديريت object ها را خود بعهده مي گيرد شي ايجاد شده نميتواند توسط برنامه خراب شود. اين مطلب در مقالات بعدي مورد بررسي قرار خواهد گرفت.

با توجه به تفاوتهاي ذكر شده مي توان اين كلاس را به صورت زير براي يك كلاس C# ارائه كرد.

     

      // Test.cs

      using System;

      namespace NS

      {

            publicclass CTest

            {

                  privateint   m_at1;

                  public  float m_at2;

                  privateint   f1()

                  {

                              return m_at1;

                  }

                  public  int   f2()

                  {

                              return m_at1+(int)m_at2;

                  }

                  public CTest()

                  {

                        m_at1 = 0;

                        m_at2 = 0.0f;

                  }

                  ~Test()

                  {

                        // Console.WriteLine("destructor call");

                  }

            }

      }

 

ايجاد يك كلاس در ++ و #

در موقع استفاده از يك كلاس اگر از default constructor براي ايجاد يك كلاس استفاده مي شود در C# بايد constructor بصورت void فراخواني شود ( مانند توابع void معمولي)

به مثال زير دقت كنيد.

            // C++ code

            CTest            *a;

            a = new CTest;

 

            // C# Code

            CTest             a;

            a = new CTest();

 

 ذكر اين نكته ضروري است كه در C# وقتي كلاسي تعريف مي شود در واقع اشاره گر به آن كلاس معرفي مي شود بنابراين با تعريف CTest    a كلاسي از CTest ايجاد نمي شود و فقط يك اشاره گر از CTest تعريف مي شود و براي ايجاد يك كلاس استفاده از عملگر new اجباري است.

ولي در C++  تعريف CTest     a به منزله ايجاد يك كلاس و فراخواني Default Constructor مي باشد.




ادامه مطلب + نوشته شده در  پنجشنبه بیست و هفتم دی 1386ساعت 0:52  توسط و.د  | 

آرایه ها در برنامه نویسی c

آرايه در C عبارتست از مجموعه اي از داده هاي همنوع كه تحت يك نام مشترك و در خانه هاي متوالي حافظه ذخيره مي گردند. براي دسترسي به عناصر آرايه، بايد از نام آرايه بعلاوه انديس استفاده كرد. در قسمتهاي بعدي، نحوه تعريف و استفاده از آرايه ها را تشريح خواهيم كرد.

آرايه هاي يك بعدي

پيش از آنكه بتوان از يك آرايه يك بعدي استفاده كرد، بايد آن را اعلان كرد. اعلان آرايه ها بصورت زير انجام مي گردد:

[] ;

بعنوان مثال:

int A[10];

خط بالا يك آرايه 10 تايي از اعداد صحيح بنام A ايجاد مي نمايد. هر كدام از عناصر اين آرايه مي توانند بعنوان يك متغير مستقل مورد استفاده قرار گيرد. براي دسترسي به عناصر اين آرايه بايد از انديس استفاده نمود. در زبان C انديسها در داخل كروشه [] قرار مي گيرند. نكته بسيار مهمي كه بايد بدان توجه كرد آنستكه در C انديس يك عدد صحيح است كه از 0 آغاز مي گردد. به مثال زير توجه نماييد:

int A[10] ;
A[2] = 8;

و يا چنانچه بخواهيم مقدار خانه سوم را بر 2 تقسيم و در متغير x بريزيم، داريم:

x = A[3] / 2;

اكنون به يك مثال دقت كنيد.

برنامه 1) برنامه اي بنويسيد كه شماره دانشجويي و معدل تعدادي دانشجو را دريافت، و سپس چنانچه معدل دانشجو از ميانگين كلاس :

- بيش از يك نمره بيشتر باشد، چاپ كند : عالي
- حداكثر يك نمره بيشتر يا كمتر باشد، چاپ كند : خوب
- بيش از يك نمره كمتر باشد، چاپ كند : ضعيف

#include
void main() {
float average[100] ;
long int id[100] ;
int i, n ;
float totalAverage;
printf("enter number of students : ");
scanf("%d", &n);
for (i = 0; i < n ; i ++) {
printf("enter id and average : ");
scanf("%ld %f", &id[i], &average[i]);
totalAverage += average[i];
}
totalAverage /= n;
for (i = 0; i < n ; i ++) {
if (average[i] > = totalAverage + 1)
printf("%ld : excellent !\n", id[i]);
else if (average[i] > = totalAverage – 1)
printf("%ld : good !\n", id[i]);
else printf("%ld : weak !\n", id[i]);
}
}

چند نكته مهم راجع به آرايه در C وجود دارد كه حتما بايد به آنها دقت كنيد:
1- اندازه آرايه ها در C ثابت بوده و حتما بايد توسط يك مقدار ثابت صحيح تعيين گردد. بعنوان مثال اعلان زير خطاي نحوي محسوب مي گردد:

int n ;
n=100 ;
int A[n];

اما مي توان با استفاده از متغير هاي ثابت (ثابتهاي داراي نام)، اندازه آرايه را تعيين كرد، كه در قسمتهاي بعدي به آن اشاره خواهد شد.

2- انديس آرايه ها در C عدد صحيح بوده و هميشه از 0 شروع مي شود. لذا به تفاوت "عنصر چهار آرايه" يعني A[4] و "چهارمين عنصر آرايه" يعني A[3] دقت كنيد. اين مسئله معمولا باعث بروز خطاهاي منطقي مي گردد.

3- در C مرز آرايه ها بررسي نمي گردد. بدين معنا كه چنانچه انديسي خارج از محدوده مجاز يك آرايه استفاده شود، باعث ايجاد خطا توسط كامپايلر نمي گردد، اما مسلما برنامه را دچار يك خطاي منطقي خواهد كرد. بعنوان مثال:

int A[10] ;
A[12] = 20 ; //this is not a syntax error but a logical error


لذا بررسي مرزهاي آرايه بعهده خود برنامه نويس است و بايد از درستي برنامه خود و خارج نشدن از محدوده مجاز مطمئن گردد.

4- مقداردهي اوليه به آرايه هاي يك بعدي بصورت زير انجام مي پذيرد:

int A[3] = {5, 2, 8};


كه در اينجا A[0] برابر 5 ، A[1] برابر 2 و A[2] برابر 8 خواهد شد.
علاوه براين مي توان فقط به تعدادي از عناصر آرايه مقدار داد، دراينصورت مقدار عناصر باقيمانده آرايه اتوماتيك 0 خواهد شد.

int B[10] = {5, 8} ;

در اينجا عناصر B[2] به بعد مقدار 0 خواهند گرفت. بنابراين مي توان براي 0 كردن كليه عناصر يك آرايه به شكل زير عمل كرد :

int C[10] = {0};

چنانچه به آرايه مقدار دهي اوليه كرده باشيم، مي توان تعداد عناصر آرايه را نيز ذكر نكرد، دراينصورت اندازه آرايه بطور اتوماتيك برابر تعداد مقادير مشخص شده خواهد شد.

int C[] = {10, 15, 20};

در مثال فوق آرايه C با 3 عضو درنظر گرفته مي شود.




ادامه مطلب + نوشته شده در  پنجشنبه بیست و هفتم دی 1386ساعت 0:48  توسط و.د  | 

ايجاد فايل XML با استفاده از يک بانک اطلاعاتی


از بانک های اطلاعاتی به منظور ذخيره و مديريت داده ها استفاده می گردد . در صورتی که قصد ارسال داده های ذخيره شده در يک بانک  اطلاعاتی را برای يک سرويس گيرنده داشته باشيم  ، XML گزينه ای  مطلوب در اين رابطه است . با استفاده از XML داده ها در ساختاری ذخيره و سازماندهی می شوند که سرويس گيرندگان با هر نوع پلت فرم قادر به استفاده از آنان با توجه به اهداف عملياتی خود می باشند. در حقيقت ،  XML مکانيزم استانداردی به منظور مبادله داده بين دو نقطه مبداء و مقصد را فراهم می نمايد . بدين ترتيب بخش های متفاوت يک نرم افزار و يا نرم افزارهای مختلف ، قادر به مبادله داده بين خود خواهند بود .
XML در دات نت دارای نقشی محوری و اساسی بوده و نظير چسبی است که تمام بخش های فريمورک دات نت را به يکديگر متصل و مرتبط می نمايد .مثلا"  ADO.NET اساس کار خود را بر روی DataSet استوار نموده که بطور کامل از XML حمايت می نمايد . کلاس DataSet دارای مجموعه وسيعی از متدهای لازم به منظور پردازش اسناد XML است . برخی از متداولترين آنان عبارتند از :

  • ReadXml

  • WriteXml

  • GetXml 

  • GetXmlSchema

  • InferXmlSchema

  • ReadXmlSchema

  • WriteXmlSchema.

در اين مقاله با نحوه ايجاد يک سند XML  که محتويات آن متاثر از اجرای يک query در ارتباط با يک بانک اطلاعاتی می باشد ،  آشنا خواهيم شد. بدين منظور مراحل زير را دنبال خواهيم کرد :

  • مرحله اول :  ايجاد بانک اطلاعاتی (  از يک بانک اطلاعاتی  Access استفاده خواهيم کرد )

  • مرحله دوم : مشخص نمودن يک ساختار برای فايل XML

  • مرحله سوم : ايجاد يک فرم وب که ليست محصولات را در يک DataGrid نمايش داده و کاربر بتواند  با استفاده از Button تعبيه شده بر روی آن اقدام به ايجاد فايل XML و Schema مربوط به آن نمايد .

  • مرحله چهارم : ايجاد يک DataSet و پر نمودن داده در آن با استفاده از يک SQL query ( اين کار را در روتين Page_Load انجام خواهيم داد )

  • مرحله پنجم : نوشتن روتين مربوط به ايجاد فايل XML

مرحله اول : ايجاد بانک اطلاعاتی 
بانک اطلاعاتی Products و جدول OurProducts

مرحله دوم : مشخص نمودن يک ساختار برای فايل XML
فايل XML که قصد ايجاد آن را داريم دارای ساختار زير است :

 

فا يل XML نمونه

s>
Spec>
       
       
        
Spec>
  ...
s>

مرحله سوم : ايجاد يک فرم وب
در فرم وب از دو کنترل DataGrid و Button  استفاده شده است . از کنترل DataGrid به منظور نمايش محتويات Dataset و از کنترل Button به منظور ايجاد فايل XML ، استفاده خواهيم کرد .

فرم وب

<%@ Page Language ="VB" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data.OleDb" %>


ليست محصولات


  AutoGenerateColumns="False"
  Font-Names="Tahoma"
  Font-Size="8pt"
  CellPadding="1"
  GridLines="Horizontal"
   ...

asp:DataGrid>





مرحله چهارم :  ايجاد يک DataSet و پر نمودن داده در آن 
اين کار از طريق  روتين Page_laod  انجام می شود . در اين روتين پس از ارتباط با بانک اطلاعاتی Products و  اجرای يک query در ارتباط با جدول OurProducts ، داده  مورد نظر در  DataSet  قرار گرفته و در نهايت با نسبت دهی آن به  خصلت DataSource کنترل DataGrid ، داده ها در کنترل DataGrid  نمايش داده می شوند .

روتين Page_Load

Sub Page_Load(s As Object, e As EventArgs)
  If Not Page.IsPostBack Then
    Dim myDataSet As New DataSet("myXMLProduct")
    Dim myConn As New OleDbConnection( "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\Products.mdb")
   Dim mydataAdapter As New OleDbDataAdapter  _
        ("SELECT ProductID,ProductName,UnitPrice FROM OurProducts" ,myConn)
mydataAdapter.Fill(myDataSet,"ProductSpec")
ProductGrid.DataSource=myDataSet.Tables(0)
ProductGrid.DataBind
Session("Ds")=myDataSet
End If
End Sub

 

مرحله پنجم :  روتين MakeXml
در اين مرحله فايل های  myXMLData.xml    و   myXMLData.xsd   ايجاد خواهند شد . بدين منظور يک DataSet ايجاد و داده آن از طريق متغير Session ايجاد شده در روتين Page_Load پر می گردد .

روتين  MakeXml

Sub MakeXML(s As Object, e As EventArgs)
Dim myFs1 As New FileStream (Server.MapPath _
    
("myXMLData.xml") ,FileMode.Create ,FileShare.ReadWrite)
Dim myFs2 As New FileStream(Server.MapPath _
    
("myXMLData.xsd"),FileMode.Create,FileShare.ReadWrite)
Dim myDataSet As New DataSet
myDataSet=Session("Ds")
myDataSet.WriteXml(myFs1)
myFs1.Close()
myDataSet.WriteXmlSchema(myFs2)
myFs2.Close()
End Sub
 

 

پس از ذخيره تمامی کدهای اشاره شده در فايل  MakeXmlFromDataBase.aspx و مشاهده آن در مرورگر ، خروجی زير را خواهيم داشت :  

پس از فعال نمودن دکمه "ايجاد فايل XML " ، فايل های myXMLData.xml  و  myXMLData.xsd  ايجاد می گردند .

فايل myXMLData.xml  

 

 

myXMLData.xsd  





ادامه مطلب + نوشته شده در  سه شنبه هجدهم دی 1386ساعت 2:54  توسط و.د  | 

درباره
مجموعه ای که مشاهده ميکنید حاصل تلاش شما و دوستان شماست .
هدف از راه اندازی اين مجموعه آشنا کردن هرچه بيشتر شما با علوم کامپيوتری ميباشد.

پيوندها
پيوندها ي روزانه
نويسندگان
آرشيو مطالب

دیکشنری آنلاین
This Template Designe By vahid - All Rights Reseived By absardpnu.Blogfa.Com