یک برنامه ساده دیگر: جمع اعداد صحیح
در برنامه بعدی از شی جریان ورودی std::cin و عملگر استخراج >>، برای بدست آوردن دو عدد صحیح تایپ شده از سوی کاربر از طریق صفحهکلید، جمع آنها و نمایش نتیجه بدست آمده با استفاده از std::cout میپردازیم. برنامه شکل ۵-۲ عمل جمع و خروجی حاصل از این برنامه را نشان میدهد.
شکل ۵-۲ | برنامه جمع که مجموع دو عدد صحیح دریافتی از صفحه کلید را محاسبه میکند.
توضیحات موجود در خطوط ۱ و ۲
// Addition program that displays the sum of two numbers.
نشاندهنده نام فایل و هدف برنامه هستند. رهنمود پیشپردازنده C++
در خط ۳ حاوی محتویات سرآیند فایل iostream در برنامه است.
همانطوری که قبلاٌ هم گفته شد، هر برنامهای با اجرای تابع main آغاز میشود(خط ۶). براکت سمت چپ (خط ۷) ابتدا و آغاز بدنه main و براکت متناظر سمت راست (خط ۲۵)، انتها و پایان بدنه را نشان میدهد.
خطوط ۹-۱۱
int number2; // second integer to add
int sum; // sum of number1 and number2
بخش اعلان میباشند. کلمات number1، number2 و sum اسامی متغیرها هستند. متغیرها مکانهای در حافظه کامپیوتر هستند که میتوان مقادیری را برای استفاده برنامه در آنها ذخیره کرد. این اعلانها مشخص میکنند که متغیرهایnumber1، number2و sum از نوع داده int هستند، به این معنی که این متغیرها قادر به نگهداری مقادیر صحیح همانند اعداد ۷, -۱۱, ۰, ۳۱۹۱۴ و غیره میباشند. تمامی متغیرها بایستی دارای نام و یک نوع داده باشند تا بتوان از آنها در برنامه استفاده کرد. چندین متغیر از یک نوع را میتوان در خط یا چند خط مجزا از هم اعلان کرد. میتوانیم هر سه متغیر فوق را در یک خط و بصورت زیر اعلان کنیم:
با این همه، در این حالت خوانائی برنامه کاهش یافته و مانع میشود تا توضیحات مناسب برای هر متغیر و هدف از آن متغیر در برنامه را وارد سازیم. اگر بخواهیم بیش از یک متغیر در یک خط اعلان کنیم (همانند مورد بالا) باید اسامی را با یک ویرگول(,) از یکدیگر جدا کنیم. که به این حالت لیست جدا شده با ویرگول گفته میشود.
بزودی در مورد نوع داده double (خاص اعداد حقیقی، اعداد با نقطه اعشار همانند۳.۴ و -۱۱.۱۹) و نوع داده char (خاص داده کاراکتری، یک متغیر از نوع char فقط میتواند یک حرف کوچک، یک حرف بزرگ، یک رقم یا یک کاراکتر خاص همانند $ یا * را در خود ذخیره سازد) صحبت خواهیم کرد.
غالباً به نوعهای همانند double، int وchar نوعهای بنیادین، نوعهای اصلی یا نوعهای توکار (built-in) میگویند. انواع نوعهای بنیادین از جمله کلمات کلیدی هستند و از اینرو باید تماماً با حروف کوچک به نمایش درآیند.
نام یک متغیر (همانند number1) میتوانند هر شناسه معتبری که یک کلمه کلیدی نیست، باشد. یک شناسه متشکل از دنبالهای از کاراکترها شامل حروف، ارقام و خط زیرین ( _ ) است. یک شناسه نمیتواند با یک رقم آغاز شود. زبان C++ از جمله زبانهای حساس به موضوع است، به این معنی که مابین حروف کوچک و بزرگ تفاوت قائل میشود. از اینرو شناسههای a1 و A1 با هم برابر نیستند.
از اختصار یا کوتهسازی شناسهها اجتناب کنید، تا خوانایی برنامه افزایش یابد.
خط ۱۳
مبادرت به چاپ رشته Enter first integer (بعنوان رشته لیترال نیز شناخته میشود) بر روی صفحه نمایش میکند. به چنین پیغامهای prompt گفته میشود، چراکه به کاربر میگویند که چه کاری باید انجام دهد. خط ۱۴
با استفاده از شی ورودی cin (از فضای نامی std ) و عملگر >>، مقداری از صفحهکلید دریافت میکند. با استفاده از عملگر>> به همراه std::cin کاراکترها از یک ورودی استاندارد که معمولا صفحهکلید است، دریافت میشوند. در واقع میتوان گفت که std::cin مقداری برای number1 دریافت میکند.
هنگامی که برنامه اجرا شده و به عبارت فوق میرسد، منتظر میماند تا کاربر مقداری برای متغیر number1 وارد سازد. کاربر با تایپ یک مقدار صحیح و سپس فشردن کلید Enter (گاهاٌ به این کلید، کلید Return هم میگویند) به برنامه پاسخ میدهد. با این عمل مقدار تایپ شده به کامپیوتر ارسال میشود. سپس کامپیوتر کاراکترهای دریافت شده را به یک عدد صحیح تبدیل و این عدد (یا مقدار) را به متغیر number1 نسبت میدهد. از این نقطه به بعد هر مراجعهای به number1 در این برنامه مترادف با استفاده از این مقدار خواهد بود.
شیهای std::cout و std::cin تعامل مابین کاربر و کامپیوتر را تسهیل میبخشند. بدلیل اینکه این تعامل بفرم یک گفتگو است، غالباٌ به اینحالت محاسبه تعاملی یا محاورهای گفته میشود.
خط ۱۶
مبادرت به چاپ Enter second integer بر روی صفحه نمایش میکند. این عبارت به کاربر اعلان می کند که چه کاری انجام دهد. خط ۱۷
مقداری برای متغیر number2 از سوی کاربر بدست میآورد.
عبارت تخصیص دهنده در خط ۱۹
مجموع متغیرهای number1 و number2 را محاسبه و نتیجه آنرا به متغیر sum تخصیص میدهد. از عملگر تخصیص = به این منظور استفاده شده است. مفهوم عبارت فوق به این مضمون است “sum مقدار خود را از number1 + number2 بدست میآورد.” اکثر محاسبات در بین عبارات تخصیصی صورت میگیرند. به عملگر = و عملگر + ، عملگرهای باینری گفته میشود چرا که هر کدامیک از آنها دارای دو عملوند هستند. در مورد عبارت فوق، عملگر + ، دارای دو عملوند number1 و number2 است. همچنین عملگر =، دارای دو عملوند sum و مقدار بدست آمده از number1 + number2 است.
خط ۲۱
مبادرت به چاپ رشته کاراکتری Sum is و بدنبال آن مقدار عددی متغیر sum توسط عبارت std::endl میکند.end1 کوتاه شده “end line” بوده و متعلق به فضاینامی std میباشد. کنترل کننده جریان std::endl یک خط جدید به خروجی منتقل و سپس “بافر خروجی را خالی میکند.” به این معنی که، در برخی از سیستمها خروجی در ماشین انباشته میشود تا زمانیکه “ارزش” نمایش در صفحه نماش را پیدا کنند، عبارت std::endl خروجیهای انباشته شده را مجبور میکند تا در یکباره به نمایش در آیند.
دقت کند که عبارت قبلی دو مقدار از انواع مختلف را خارج میسازد. عملگر << از نحوه ارسال هر نوع داده به خروجی مطلع است. به روش استفاده از چندین عملگر << در یک عبارت، عملیات زنجیر کردن، متصل کردن یا فرآیند آبشاری گفته میشود. از اینرو، داشتن چندین عبارت خروجی برای خارج کردن چند داده متمایز ضروری نیست.
البته میتوان محاسبات را در بین عبارات خروجی هم انجام داد. میتوانیم عبارات موجود در خطوط ۱۹ و ۲۱ را در یک عبارت، بفرم زیر داشته باشیم
بنابر این دیگر نیازی به متغیر sum نخواهد بود. براکت راست، {، به کامپیوتر اطلاع میدهد که به انتهای تابع main رسیده است.
از جمله توانمندیهای C++ این است که به کاربران اجازه میدهد تا نوع دادههای مورد نیاز و متعلق به خود را ایجاد کنند (در فصل سوم در این مورد و در فصلهای نهم و دهم نگاهی دقیق به این موضوع خواهیم داشت). سپس با نحوه رسیدگی C++ به هنگام کار با نوع دادههای جدید با استفاده از عملگرهای >> و << بیشتر آشنا خواهید شد (مبحث عملگرهای سربارگذاری در فصل یازدهم).
۵-۲ مفاهیم حافظه
اسامی متغیرها، همانند number1، number2 و sum مطابق با مکانهای واقعی در حافظه کامپیوتر هستند. هر متغیر دارای یک نام، نوع، سایز و مقدار است. در برنامه جمع ۵-۲ زمانیکه عبارت
در خط ۱۴ اجرا میشود، کاراکترهای تایپ شده توسط کاربر به یک عدد صحیح تبدیل میشود و در مکانی از حافظه با نام number1 و با کمک کامپایلر C++ قرار داده میشود. فرض کنید که کاربر عدد ۴۵ را به عنوان مقداری برای number1 وارد کند. کامپیوتر ۴۵ را دریافت و در مکان number1 همانند شکل ۶-۲ قرار میدهد.
زمانیکه مقداری در یک مکان حافظه قرار میگیرد، مقدار جدید بر روی مقدار قبلی بازنویسی میشود. مجدداٌ به سراغ برنامه جمع میرویم، هنگامی که عبارت
در خط ۱۷ اجرا شود، فرض کنید کاربر مقدار ۷۲ را وارد سازد، این مقدار وارد مکان number2، شده و تصویر حافظه همانند شکل ۷-۲ خواهد شد. دقت کنید که این مکانهای حافظه ضرورتا، نبایستی در کنار هم قرار داشته باشند.
پس از اینکه برنامه مقادیر number1 و number2 را بدست آورد، این مقادیر را با هم جمع کرده و مجموع را در درون متغیر sum قرار میدهد. عبارت
علاوه بر آنکه عمل جمع را انجام میدهد، مقدار حاصله را هم در sum ذخیره میسازد. این عمل زمانی رخ میدهد که مجموع دو متغیر number1 و number2 محاسبه شدهاند و در مکان sum ذخیره میشود. پس از اینکه sum محاسبه شد، حافظه بفرم شکل ۸-۲ تبدیل خواهد شد. توجه نمائید که مقادیر number1 و number2 پس از انجام محاسبه sum همچنان بدون تغییر باقی میماند. با اینکه از این مقادیر استفاده شده است، اما مقادیر اولیه آنها با انجام عمل محاسباتی از بین نمیرود.
شکل ۶-۲ | مکان حافظه در حال نمایش نام و مقدار متغیر number1.
شکل ۷-۲ | مکانهای حافظه پس از ذخیرهسازی مقادیر برای number1 و number2.
شکل ۸-۲| مکانهای حافظه پس از محاسبه sum با استفاده از number1 و number2.
سلام ممکنه این کد رو واسم تحلیل کنید خط به خط و واسم ارسال کنید؟؟؟
ممنون
Comments:
Chip type : ATmega8L
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
-----------------------------------------------------------------------------------
#include
#include
// Alphanumeric LCD Module functions
#asm
Equ __lcd_port=0x12; PORTD
#endasm
#include
#include
#define ADC_VREF_TYPE 0x40
// Read the AD conversion result
Unsigned int read_adc (unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
Delay us (10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
While ((ADCSRA & 0x10) ==0);
ADCSRA|=0x10;
Return ADCW;
}
Int a=0;
Char s [20];
Void main (void)
{
// Declare your local variables here
// Input/output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=T State0=T
PORTB=0x00;
DDRB=0x0C;
// Port C initialization
//Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
//State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
//Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceller: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;
// LCD module initialization
lcd_init (16);
lcd_clear ();
lcd_gotoxy (0, 0);
lcd_putsf ("KAZEMI");
lcd_gotoxy (0, 1);
lcd_putsf ("shedat noor");
While (1)
{
a=read_adc (0);
a=a-420;
If (a100)
{PORTB.2=1;PORTB.3=1};
Else
{PORTB.2=0;PORTB.3=0};
delay_ms (10);
};
}