در C#، هم WriteLine و هم Write متدهایی از کلاس Console هستن که برای نمایش خروجی استفاده میشن، اما یه تفاوت کلیدی دارن:
Console.WriteLine():
بعد از اینکه متنی رو نمایش داد، به خط بعدی میره. یعنی نشانگر (cursor) بعد از نمایش متن، به ابتدای خط بعدی منتقل میشه.
این باعث میشه هر خروجی که بعد از این متد نمایش داده بشه، در یک خط جداگانه قرار بگیره.
Console.Write():
بعد از نمایش متن، روی همون خط باقی میمونه. یعنی نشانگر بعد از نمایش متن، درست بعد از آخرین کاراکتر متن قرار میگیره.
این باعث میشه خروجیهای متوالی که با Write نمایش داده میشن، پشت سر هم در یک خط قرار بگیرن.
خلاصه:
WriteLine: نمایش متن + رفتن به خط بعد.
Write: فقط نمایش متن، بدون رفتن به خط بعد.
این تفاوت ساده، برای کنترل فرمت خروجی خیلی مهمه. معمولاً وقتی میخوایم خروجیهای مرتب و جدا از هم داشته باشیم، از WriteLine استفاده میکنیم و وقتی میخوایم چند بخش از متن رو در یک خط کنار هم قرار بدیم، از Write استفاده میکنیم.
#کد_نویسی #عشق_کد
ChatGPT: معماری و عملکرد مدلهای زبانی بزرگ (LLMs)
ChatGPT، که بر پایهی معماری ترنسفورمر (Transformer) توسعه یافته، نمونهای پیشرفته از مدلهای زبانی بزرگ (LLMs) است. این مدلها از شبکههای عصبی عمیق، بهویژه مکانیزم توجه (Attention Mechanism)، بهره میبرند تا روابط پیچیدهی بین کلمات در توالیهای طولانی متن را درک کنند. هستهی اصلی ترنسفورمر شامل لایههای Encoder و Decoder است، که در مدلهای مبتنی بر Decoder-only مانند سری GPT (Generative Pre-trained Transformer)، تمرکز اصلی بر روی لایهی Decoder قرار دارد.
فرایند “پیشآموزش” (Pre-training) بر روی حجم عظیمی از دادههای متنی از اینترنت، مدل را قادر میسازد تا الگوهای زبانی، حقایق عمومی، و سبکهای نگارشی متنوع را بیاموزد. پس از پیشآموزش، از تکنیکهایی مانند “تنظیم دقیق” (Fine-tuning) و “یادگیری تقویتی از بازخورد انسانی” (Reinforcement Learning from Human Feedback - RLHF) برای همراستاسازی رفتار مدل با اهداف مشخص، مانند پاسخدهی مفید، صادقانه، و بیضرر، استفاده میشود.
مکانیزم Self-Attention در ترنسفورمر اجازه میدهد تا مدل به کلمات مختلف در ورودی وزنهای متفاوتی بدهد و ارتباطات دوربرد را حتی در متون بسیار طولانی تشخیص دهد. این قابلیت، همراه با پارامترهای متعدد (میلیاردها پارامتر در مدلهای بزرگ)، امکان تولید متن منسجم، مرتبط، و خلاقانه را فراهم میآورد. ChatGPT در حقیقت، یک رابط کاربری مکالمهمحور است که مدلهای زیربنایی GPT (مانند GPT-3.5 یا GPT-4) را در دسترس قرار میدهد.
هوش_مصنوعی # یادگیری_ماشین #
Ultimate 2013
BWG7X-J98B3-W34RT-33B3R-JVYW9
Professional 2013
XDM3T-W3T3V-MGJWK-8BFVD-GVPKY
Premium 2013
FBJVC-3CMTX-D8DVP-RTQCT-92494
2015
Product Key: HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
2017
Enterprise:
NJVYC-BMHX2-G77MM-4XJMR-6Q8QF
N2VYX-9VR2K-T733M-MWD9X-KQCDF
Professional:
KBJFW-NXHK6-W4WJM-CRMQB-G3CDH
4F3PR-NFKDB-8HFP7-9WXGY-K77T7
Test Professional:
VG622-NKFP4-GTWPH-XB2JJ-JFHVF
2019
Enterprise :
BF8Y8 GN2QH T84XB QVY3B-RC4DF
Professional:
NYWVH HT4XC R2WYW 9Y3CM-X4V3Y
2022
Enterprise :
VHF9H-NXBBB-638P6-6JHCY-88JWH
Professional:
TD244-P4NB7-YQ6XK-Y8MMM-YWV2J
2026
بلوک try-catch در C++ برای مدیریت استثناءها (Exceptions) استفاده میشود. این مکانیسم به شما اجازه میدهد که کدی را که ممکن است باعث خطا یا استثناء شود، در یک محیط کنترلشده اجرا کنید و در صورت وقوع خطا، برنامه به جای کرش کردن، بتواند به صورت کنترلشده به خطا واکنش نشان دهد.
ساختار کلی به این صورت است:
try: کدی که احتمال وقوع استثناء در آن وجود دارد، درون بلوک try قرار میگیرد.
catch: اگر استثنایی در بلوک try رخ دهد، اجرای آن متوقف شده و کنترل به بلوک catch مربوطه منتقل میشود. شما میتوانید چندین بلوک catch برای مدیریت انواع مختلف استثناءها داشته باشید.
#include <iostream>
#include <stdexcept> // برای std::runtime_error
int main() {
int numerator = 10;
int denominator = 0;
int result;
try {
if (denominator == 0) {
// پرتاب یک استثناء از نوع runtime_error
throw std::runtime_error("Error: Division by zero is not allowed.");
}
result = numerator / denominator;
std::cout << "Result: " << result << std::endl; // این خط اجرا نخواهد شد
}
catch (const std::runtime_error& e) {
// مدیریت استثناء
std::cerr << "Caught exception: " << e.what() << std::endl;
}
catch (...) {
// مدیریت هر استثناء دیگری که نوع آن مشخص نشده باشد (Catch-all)
std::cerr << "Caught an unknown exception." << std::endl;
}
std::cout << "Program continues execution." << std::endl;
return 0;
}
نکات کلیدی:
throw: کلمه کلیدی است که برای ایجاد (پرتاب کردن) یک استثناء استفاده میشود.
انواع استثناء: میتوانید انواع مختلفی از استثناءها را پرتاب و مدیریت کنید، مانند:
استثناءهای استاندارد کتابخانه (مانند std::out_of_range, std::invalid_argument).
کلاسهای استثناء سفارشی که از کلاس پایه std::exception ارثبری میکنند.
catch(...): این یک گیرنده عمومی است که هر نوع استثنایی را که قبلاً توسط گیرندههای خاص مدیریت نشده باشد، میگیرد. بهتر است این را همیشه به عنوان آخرین catch قرار دهید.
اجرای کد پس از خطا: پس از مدیریت موفقیتآمیز یک استثناء در بلوک catch، اجرای برنامه از ادامهی بلوک try-catch (بعد از آخرین catch) دنبال میشود، نه از ابتدای بلوک try.
API مخفف عبارت Application Programming Interface هست، یعنی “رابط برنامهنویسی کاربردی”.
به زبان خیلی ساده، API مثل یه پیشخدمت یا مترجم بین دو تا نرمافزار یا سرویس مختلف عمل میکنه. فرض کن میخوای از یه رستوران غذا سفارش بدی. تو (یه برنامه) نمیتونی مستقیم بری توی آشپزخونه (برنامه دیگه) و به آشپز بگی چی درست کنه. در عوض، میری سراغ پیشخدمت (API) که منوی غذاها رو داره، سفارش تو رو میگیره و به آشپز میرسونه، و بعد غذای آماده شده رو برات میاره.
API هم دقیقا همین کار رو برای نرمافزارها انجام میده:
تعریف قوانین و پروتکلها: API مشخص میکنه که چطور برنامهها میتونن با هم صحبت کنن، چه اطلاعاتی رو میتونن از هم بپرسن و چه نوع پاسخهایی رو دریافت کنن. مثل اینکه بدونه چطور درخواست بده (مثلاً “اطلاعات آب و هوای توکیو رو بهم بده”) و چه فرمتی از پاسخ رو انتظار داره (مثلاً “دما، رطوبت و سرعت باد”).
انتزاع پیچیدگی: برنامهنویسها لازم نیست تمام جزئیات پیچیده کارکرد یک سرویس دیگه رو بدونن. مثلاً وقتی داری از نقشه گوگل توی اپلیکیشن خودت استفاده میکنی، نیازی نیست بدونی گوگل چطور دادههای ماهوارهای رو پردازش میکنه؛ فقط از طریق API گوگل مپ این قابلیت رو به اپ خودت اضافه میکنی.
قابلیت همکاری (Interoperability): باعث میشه نرمافزارهای مختلف که توسط تیمهای مختلف و با تکنولوژیهای متفاوت ساخته شدن، بتونن با هم کار کنن و اطلاعات رو رد و بدل کنن.
چند مثال کاربردی API:
وبسرویسهای آب و هوا: وقتی یه اپلیکیشن هواشناسی رو باز میکنی، اون اپلیکیشن از API سرویسدهندههای هواشناسی (مثل OpenWeatherMap) برای گرفتن اطلاعات استفاده میکنه.
شبکههای اجتماعی: وقتی میخوای با اکانت گوگل یا فیسبوکت وارد یه سایت دیگه بشی، اون سایت از API فیسبوک یا گوگل استفاده میکنه تا هویت تو رو تایید کنه.
پرداخت آنلاین: درگاههای پرداخت اینترنتی از API برای ارتباط با بانکها و پردازش تراکنشهای مالی استفاده میکنن.
نقشهها: اپلیکیشنهایی که از نقشه استفاده میکنن (مثل اسنپ یا تپسی)، از API سرویسهایی مثل Google Maps یا نشان بهره میبرن.
پس در کل، API یه واسط استاندارد و تعریفشده است که به نرمافزارها اجازه میده بدون اینکه همدیگه رو کامل بشناسن، با هم ارتباط برقرار کنن و از قابلیتهای همدیگه استفاده کنن.
تابع sleep() یکی از مفاهیم بنیادی در برنامهنویسی همروند (Concurrent Programming) و مدیریت زمان در سیستمعاملهاست.
تشریح تابع sleep() در C/C++
تابع sleep() برای متوقف کردن اجرای یک ریسه (Thread) یا فرآیند (Process) برای یک مدت زمان مشخص استفاده میشود. این کار باعث میشود که منابع CPU به طور موقت آزاد شده و برای کارهای دیگر در دسترس قرار گیرند.
۱. استانداردها و کتابخانهها
نحوه استفاده از sleep() بستگی به سیستمعامل و استانداردی دارد که از آن استفاده میکنید:
استاندارد POSIX (سیستمهای شبه یونیکس مانند لینوکس و macOS):
تابع: sleep(unsigned int seconds)
کتابخانه: <unistd.h>
واحد زمان: ثانیه (integer).
استاندارد ویندوز (Windows API):
تابع: Sleep(DWORD dwMilliseconds)
کتابخانه: <windows.h>
واحد زمان: میلیثانیه (DWORD یک عدد صحیح بدون علامت ۳۲ بیتی است).
استاندارد C++ مدرن (C++11 به بعد):
توصیه میشود از این روش استفاده کنید چون پلتفرم-مستقل (Platform-Independent) است.
تابع: std::this_thread::sleep_for(const chrono::duration& rel_time)
کتابخانه: <thread> و <chrono>
واحد زمان: هر واحد زمانی دلخواه (مثلاً نانوثانیه، میکروثانیه، میلیثانیه) که توسط std::chrono::duration مشخص میشود.
۲. مکانیسم کارکرد (در سطح سیستمعامل)
هنگامی که یک ریسه تابع sleep() را فراخوانی میکند، هسته سیستمعامل (Kernel) کار زیر را انجام میدهد:
انتقال به حالت انتظار (Waiting State): ریسه فراخواننده از لیست ریسههای “آماده اجرا” (Runnable) خارج شده و به لیست ریسههای “در انتظار” (Waiting/Sleeping) منتقل میشود.
آزادسازی زمانبند: زمانبند سیستمعامل (Scheduler) متوجه میشود که این ریسه فعلاً نیازی به منابع CPU ندارد و میتواند به ریسههای آماده دیگر فرصت اجرا دهد.
تایمر و بیدار شدن: هسته یک شمارنده زمانی داخلی برای آن ریسه تنظیم میکند. پس از سپری شدن مدت زمان مشخص شده، هسته ریسه را از حالت انتظار خارج کرده و آن را به لیست “آماده اجرا” برمیگرداند.
. تفاوت با تأخیر فعال (Busy Waiting)
تأخیر فعال (Active Waiting/Busy Waiting): شامل حلقههایی است که به طور مداوم شرطی را بررسی میکنند .
while (true) {
// CPU به طور مداوم در اینجا مشغول چک کردن است.
}
این روش باعث میشود CPU ۱۰۰٪ برای یک کار بیفایده مصرف شود.
استفاده از sleep(): این تابع به ریسه اجازه میدهد تا کاملاً از اجرای CPU خارج شود و تنها زمانی مجدداً فعال شود که زمان مقرر فرا برسد. این رویکرد بسیار کارآمدتر و استاندارد است، خصوصاً در سیستمهای چندوظیفهای (Multitasking).