#نکته
Single Responsibility Principle
در مهندسی نرم افزار یکی از اصول های پنج گانه solid که باید رعایت کنیم SRP هستش
این اصل میگه که تمام متد ها و کلاس ها باید یک وظیفه داشته باشند
دلیل این کار هم خوانا بودن کد و راحت تر شدن دیباگ کردن و ... هستش
🟢لطفا سوالات، نظرات و کد های خود را برای ما کامنت کنید
Single Responsibility Principle
در مهندسی نرم افزار یکی از اصول های پنج گانه solid که باید رعایت کنیم SRP هستش
این اصل میگه که تمام متد ها و کلاس ها باید یک وظیفه داشته باشند
دلیل این کار هم خوانا بودن کد و راحت تر شدن دیباگ کردن و ... هستش
🟢لطفا سوالات، نظرات و کد های خود را برای ما کامنت کنید
#نکته
در اینجا به مفهوم const و pointer در زبان C++ اشاره میکنیم.
_قطعه کد اول
const char* ptr_a ;
در این حالت محتویات اشاره گر(اطلاعات اشاره شده توسط اشاره گر) تحت تاثیر const قرار گرفته و ثابت میماند
اما خود اشاره گر را میتوان تغییر داد
برای مثال:
✅ ptr_a = " a new value " ;
❌ *ptr_a = ' x ' ;
〰〰〰〰〰〰〰〰〰〰〰〰〰
_قطعه کد دوم
char* const ptr_b ;
اما در حالت دوم اشاره گر تحت تاثیر const قرار گرفته و ثابت میماند
بنابراین ما میتوانیم داده هایی که به آنها اشاره شده است یعنی محتویات را تغییر دهیم
برای مثال:
✅ *ptr_b = ' x ' ;
❌ ptr_b = " a new string " ;
〰〰〰〰〰〰〰〰〰〰〰〰〰
بررسی حالت اول و دوم به بیان ساده تر:
اِلِمان const از قانون نزدیکی پیروی کرده و روی نزدیکترین المان های بعد از خودش تاثیر میگذارد و آنهارا ثابت نگه میدارد.
〰〰〰〰〰〰〰〰〰〰〰〰〰
اما حالت سومی هم وجود دارد که با بهره گیری از آن میتوان هم اشاره گر و هم داده کرکتر را ثابت نگه داشت:
_قطعه کد سوم
const char* const ptr_c ;
🟢لطفا سوالات، نظرات و کد های خود را برای ما کامنت کنید.
در اینجا به مفهوم const و pointer در زبان C++ اشاره میکنیم.
_قطعه کد اول
const char* ptr_a ;
در این حالت محتویات اشاره گر(اطلاعات اشاره شده توسط اشاره گر) تحت تاثیر const قرار گرفته و ثابت میماند
اما خود اشاره گر را میتوان تغییر داد
برای مثال:
✅ ptr_a = " a new value " ;
❌ *ptr_a = ' x ' ;
〰〰〰〰〰〰〰〰〰〰〰〰〰
_قطعه کد دوم
char* const ptr_b ;
اما در حالت دوم اشاره گر تحت تاثیر const قرار گرفته و ثابت میماند
بنابراین ما میتوانیم داده هایی که به آنها اشاره شده است یعنی محتویات را تغییر دهیم
برای مثال:
✅ *ptr_b = ' x ' ;
❌ ptr_b = " a new string " ;
〰〰〰〰〰〰〰〰〰〰〰〰〰
بررسی حالت اول و دوم به بیان ساده تر:
اِلِمان const از قانون نزدیکی پیروی کرده و روی نزدیکترین المان های بعد از خودش تاثیر میگذارد و آنهارا ثابت نگه میدارد.
〰〰〰〰〰〰〰〰〰〰〰〰〰
اما حالت سومی هم وجود دارد که با بهره گیری از آن میتوان هم اشاره گر و هم داده کرکتر را ثابت نگه داشت:
_قطعه کد سوم
const char* const ptr_c ;
🟢لطفا سوالات، نظرات و کد های خود را برای ما کامنت کنید.
#نکته
Open Closed Principle
اصل دوم solid به ما میگه که برنامه برای گسترش باید باز باشه و برای تغییر بسته
یک مثال میزنیم
فرض کنید که یک متدی دارین که وظیفه ارسال پیام الکترونیکی با yahoo رو داره
برای گسترش برنامه شما میخواین امکان ارسال پیام الکترونیکی با gmail هم اضافه کنید
اینجا شما میتونید متد مربوط به ارسال با yahoo رو تغییر بدین که اینجا شما نقض میکنید اصل دوم رو چون که دارین تغییر میدین کدی که از قبل نوشته شده است
درواقع باید یک متد جداگونه برای ارسال با gmail بسازین و استفاده کنید
و همین طور وقتی این اصل رو رعایت کنید ، تا حد زیادی هم اصل اول (SRP) رو رعایت کردین
#solid
🟢لطفا سوالات، نظرات و کد های خود را برای ما کامنت کنید.
Open Closed Principle
اصل دوم solid به ما میگه که برنامه برای گسترش باید باز باشه و برای تغییر بسته
یک مثال میزنیم
فرض کنید که یک متدی دارین که وظیفه ارسال پیام الکترونیکی با yahoo رو داره
برای گسترش برنامه شما میخواین امکان ارسال پیام الکترونیکی با gmail هم اضافه کنید
اینجا شما میتونید متد مربوط به ارسال با yahoo رو تغییر بدین که اینجا شما نقض میکنید اصل دوم رو چون که دارین تغییر میدین کدی که از قبل نوشته شده است
درواقع باید یک متد جداگونه برای ارسال با gmail بسازین و استفاده کنید
و همین طور وقتی این اصل رو رعایت کنید ، تا حد زیادی هم اصل اول (SRP) رو رعایت کردین
#solid
🟢لطفا سوالات، نظرات و کد های خود را برای ما کامنت کنید.
💬 #چالش
🟥درجه سختی: آسان
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
🟥درجه سختی: آسان
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
Tp hunters cpp
💬 #چالش 🟥درجه سختی: آسان 🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید. @tphunterscpp
🧠 #کد_چالش
🟢 لطفا سوالات، نظرات و کدهای خود را برای ما کامنت کنید.
#include<iostream>
using namespace std;
void printPascal(int n) {
for (int line = 1; line <= n; line++) {
int C = 1;
for (int i = 1; i <= line; i++) {
cout<<C<<" ";
C = C * (line - i) / i;
}
cout<<endl;
}
}
int main(){
int n=0;
cin>>n;
printPascal(n);
}
🟢 لطفا سوالات، نظرات و کدهای خود را برای ما کامنت کنید.
Tp hunters cpp
🧠 #کد_چالش #include<iostream> using namespace std; void printPascal(int n) { for (int line = 1; line <= n; line++) { int C = 1; for (int i = 1; i <= line; i++) { cout<<C<<" "; C = C * (line - i) / i; } …
💬 #شرح_کد
توضیحات: چون کسی نتونست حلش کنه پس توسط خودم😎😂
🟢لطفا سوالات، کد و نظرات خود را برای ما کامنت کنید یا داخل گروه بفرستید
توضیحات: چون کسی نتونست حلش کنه پس توسط خودم😎😂
🟢لطفا سوالات، کد و نظرات خود را برای ما کامنت کنید یا داخل گروه بفرستید
Media is too big
VIEW IN TELEGRAM
#سی_پلاس_ساده_و_خوشمزه
#پیشرفته
مدرس: محمدصالح حق محمدلو
قسمت 18: عناصر داده ای Static توابع و اشیا آن همراه با مثال های عملی از دنیای بازی و وبسایت
🟢لطفا سوالات, نظرات و کد های خود را برای ما کامنت کنید
#پیشرفته
مدرس: محمدصالح حق محمدلو
قسمت 18: عناصر داده ای Static توابع و اشیا آن همراه با مثال های عملی از دنیای بازی و وبسایت
🟢لطفا سوالات, نظرات و کد های خود را برای ما کامنت کنید
#نکته
در تصویر یک مثال ساده از نحوه رخداد این آسیب پذیری رو به نمایش گذاشتیم و همونطور که مشخصه بواسطه یک struct با نام UAFME یک تابع درونش بصورت void تعریف شده که از نوع اشاره گر هستش اما در ادامه دو تابع دیگه رو داریم با نام های ()good و ()bad که یک تابع ()print درون هر کدوم تعریف شده و یک string رو قراره چاپ بکنه
اما در تابع اصلی یعنی ()main میبینیم که همون اول کار از ساختمان UAFME یک شیُ ساخته میشه که بصورت اشاره گر بوده و حافظه رو بواسطه تابع ()malloc رزرو کرده با اندازه ساختمان UAFME
اما در ادامه شیُ مربوطه یعنی malloc1* اشاره داره به تابع درون ساختمان یعنی vulnfunc که مقدار تابع good بهش پاس داده شده، در ادامه تابع ()vulnfunc فراخوانی میشه، اینجا با این تابع که در حافظه Heap هستش تماس برقرار میشه
این شیُ بواسطه تابع ()free آزاد شده است، اما در ادامه متغییر دومی که بصورت اشاره گر با نام malloc2* تعریف شده که مقدار 0 رو داره و در ادامه تابع bad بهش پاس داده شده، اینجا چون اندازه اشاره گر مربوطه به اندازه متغییر malloc2 هستش، به همون قسمت قبل در حافظه ارجاع داده شده
🟢لطفا سوالات و نظرات خود را کامنت کنید
در تصویر یک مثال ساده از نحوه رخداد این آسیب پذیری رو به نمایش گذاشتیم و همونطور که مشخصه بواسطه یک struct با نام UAFME یک تابع درونش بصورت void تعریف شده که از نوع اشاره گر هستش اما در ادامه دو تابع دیگه رو داریم با نام های ()good و ()bad که یک تابع ()print درون هر کدوم تعریف شده و یک string رو قراره چاپ بکنه
اما در تابع اصلی یعنی ()main میبینیم که همون اول کار از ساختمان UAFME یک شیُ ساخته میشه که بصورت اشاره گر بوده و حافظه رو بواسطه تابع ()malloc رزرو کرده با اندازه ساختمان UAFME
اما در ادامه شیُ مربوطه یعنی malloc1* اشاره داره به تابع درون ساختمان یعنی vulnfunc که مقدار تابع good بهش پاس داده شده، در ادامه تابع ()vulnfunc فراخوانی میشه، اینجا با این تابع که در حافظه Heap هستش تماس برقرار میشه
این شیُ بواسطه تابع ()free آزاد شده است، اما در ادامه متغییر دومی که بصورت اشاره گر با نام malloc2* تعریف شده که مقدار 0 رو داره و در ادامه تابع bad بهش پاس داده شده، اینجا چون اندازه اشاره گر مربوطه به اندازه متغییر malloc2 هستش، به همون قسمت قبل در حافظه ارجاع داده شده
🟢لطفا سوالات و نظرات خود را کامنت کنید
#نکته
#تست_نویسی
تست نویسی در برنامه نویسی؟
یکی از مباحثی که تو پروژه های متوسط و بزرگ مطرح میشه تست نویسی هست.
تست نویسی چی هست؟
وقتی ما یک کدی میزنیم باید مطمئن بشیم که این کد کار میکنه
اولین راهی که انجام میدیم اینه که ران بگیریم و به صورت دستی این تست رو انجام بدیم؛ ولی یه سری مشکلاتی اینجا پیش میاد.
وقتی برنامه گسترش پیدا کنه تست کردن دستی همه برنامه سخت و زمان بر میشه
اینجاست که تست نویسی به کار میاد.
ما برای هر کاری که تو برنامه قراره انجام بگیره میایم سناریو های مختلفی رو در نظر میگیریم و طبق این سناریو تست رو مینویسیم.
و فقط کافیه این تست ها رو اجرا کنیم
به این صورت که اتوماتیک همه قسمت های برنامه که براشون تست نوشتید به نوعی تست میشند که خطا نداشته باشند.
برای مثال ما یک فیلدی داریم که کاربر باید عدد وارد کند و این عدد در متغیری ذخیره میشه و برای این کار قطعه کدی رو نوشتیم.
خب شما میتونید برای اینکه از عملکرد این کد مطمئن بشین که درست کار میکنه میاین تستی مینویسیند که یک عدد وارد بشه و سپس کد اجرا بشه
طبیعتا اینجا مشکلی پیش نمیاد و تست پاس میشه
حالا شما یک سناریو دیگه ای در نظر بگیرین به این صورت که به جای عدد یک حرف وارد بشه و اینجا باید ارور برگردونه برنامه
به همین صورت تست های مختلفی رو برای برنامه مینویسیم.
شما تجربه ای تو بحث تست نویسی دارین؟
🟢لطفا سوالات، نظرات و کد های خود را برای ما کامنت کنید.
#تست_نویسی
تست نویسی در برنامه نویسی؟
یکی از مباحثی که تو پروژه های متوسط و بزرگ مطرح میشه تست نویسی هست.
تست نویسی چی هست؟
وقتی ما یک کدی میزنیم باید مطمئن بشیم که این کد کار میکنه
اولین راهی که انجام میدیم اینه که ران بگیریم و به صورت دستی این تست رو انجام بدیم؛ ولی یه سری مشکلاتی اینجا پیش میاد.
وقتی برنامه گسترش پیدا کنه تست کردن دستی همه برنامه سخت و زمان بر میشه
اینجاست که تست نویسی به کار میاد.
ما برای هر کاری که تو برنامه قراره انجام بگیره میایم سناریو های مختلفی رو در نظر میگیریم و طبق این سناریو تست رو مینویسیم.
و فقط کافیه این تست ها رو اجرا کنیم
به این صورت که اتوماتیک همه قسمت های برنامه که براشون تست نوشتید به نوعی تست میشند که خطا نداشته باشند.
برای مثال ما یک فیلدی داریم که کاربر باید عدد وارد کند و این عدد در متغیری ذخیره میشه و برای این کار قطعه کدی رو نوشتیم.
خب شما میتونید برای اینکه از عملکرد این کد مطمئن بشین که درست کار میکنه میاین تستی مینویسیند که یک عدد وارد بشه و سپس کد اجرا بشه
طبیعتا اینجا مشکلی پیش نمیاد و تست پاس میشه
حالا شما یک سناریو دیگه ای در نظر بگیرین به این صورت که به جای عدد یک حرف وارد بشه و اینجا باید ارور برگردونه برنامه
به همین صورت تست های مختلفی رو برای برنامه مینویسیم.
شما تجربه ای تو بحث تست نویسی دارین؟
🟢لطفا سوالات، نظرات و کد های خود را برای ما کامنت کنید.
💬 #چالش
توضیحات بیشتر:
معکوس 123: 321
معکوس 221: 122
که 321 بزرگتر از 122 است طبق سوال عددی که معکوسش بزرگتر از معکوس عدد دیگر باشد، آن عدد بزرگتر است.
پس: 221 < 123
🟥درجه سختی: آسان
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
توضیحات بیشتر:
معکوس 123: 321
معکوس 221: 122
که 321 بزرگتر از 122 است طبق سوال عددی که معکوسش بزرگتر از معکوس عدد دیگر باشد، آن عدد بزرگتر است.
پس: 221 < 123
🟥درجه سختی: آسان
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
Tp hunters cpp
💬 #چالش توضیحات بیشتر: معکوس 123: 321 معکوس 221: 122 که 321 بزرگتر از 122 است طبق سوال عددی که معکوسش بزرگتر از معکوس عدد دیگر باشد، آن عدد بزرگتر است. پس: 221 < 123 🟥درجه سختی: آسان 🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال…
🧠 #کد_چالش
#include <iostream>
using namespace std;
int main(){
int n1, n2, a1, a2;
int rvrs1=0, rvrs2=0;
cin>>n1>>n2;
int num1=n1;
int num2=n2;
while (n1 > 0){
a1 = n1 % 10;
rvrs1 = rvrs1 * 10 + a1;
n1 = n1 / 10;
}
while (n2 > 0){
a2 = n2 % 10;
rvrs2 = rvrs2 * 10 + a2;
n2 = n2 / 10;
}
if( rvrs1 > rvrs2 ){
cout<<num1 << " > " <<num2;
}
else if( rvrs2 > rvrs1 ){
cout<<num2 << " > " <<num1;
}
else if (rvrs1 == rvrs2 ){
cout<<num1 << " = " <<num2;
}
}
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
#include <iostream>
using namespace std;
int main(){
int n1, n2, a1, a2;
int rvrs1=0, rvrs2=0;
cin>>n1>>n2;
int num1=n1;
int num2=n2;
while (n1 > 0){
a1 = n1 % 10;
rvrs1 = rvrs1 * 10 + a1;
n1 = n1 / 10;
}
while (n2 > 0){
a2 = n2 % 10;
rvrs2 = rvrs2 * 10 + a2;
n2 = n2 / 10;
}
if( rvrs1 > rvrs2 ){
cout<<num1 << " > " <<num2;
}
else if( rvrs2 > rvrs1 ){
cout<<num2 << " > " <<num1;
}
else if (rvrs1 == rvrs2 ){
cout<<num1 << " = " <<num2;
}
}
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
#نکته
#کلین_کد
خوانایی کد یکی از مهم ترین مسائلی هست که باید برنامه نویس به اون توجه کنه
بدنه یک متد معمولا نباید بالا ۳۰ خط باشه
و اگر بیش از ۳۰ خط شد باید این متد رو به متد های بیشتری بشکونید.
به نظر شما به غیر از خوانایی کد، این کار چه مزایا دیگری داره؟
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
#کلین_کد
خوانایی کد یکی از مهم ترین مسائلی هست که باید برنامه نویس به اون توجه کنه
بدنه یک متد معمولا نباید بالا ۳۰ خط باشه
و اگر بیش از ۳۰ خط شد باید این متد رو به متد های بیشتری بشکونید.
به نظر شما به غیر از خوانایی کد، این کار چه مزایا دیگری داره؟
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
💬 #چالش
این سوال بیشتر برای آشنایی با ساختار آرایه و استراکچر هستش
🟥درجه سختی: آسان
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
این سوال بیشتر برای آشنایی با ساختار آرایه و استراکچر هستش
🟥درجه سختی: آسان
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
Tp hunters cpp
💬 #چالش این سوال بیشتر برای آشنایی با ساختار آرایه و استراکچر هستش 🟥درجه سختی: آسان 🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید. @tphunterscpp
🧠 #کد_چالش
#include <stdio.h>
#include <string.h>
#define NAME 20
#define CONTENT 100
#define CAPACITY 30
struct book {
char author[NAME];
char content[CONTENT];
int year;
int flag;
};
struct library{
struct book books[CAPACITY];
char name[NAME];
};
void add_book(struct library lib , struct book book){
for(int i = 0; i < CAPACITY;i++){
if(lib.books[i].flag = 1){
strcpy(lib.books[i].author , book.author);
strcpy(lib.books[i].content , book.content);
lib.books[i].year = book.year;
lib.books[i].flag = 0;
return;
}
}
}
int search_book(struct library lib , char author[NAME] , int year){
for(int i = 0;i < CAPACITY;i++){
if((lib.books[i].flag == 1) && strcmp(lib.books[i].author , author) == 0 && (year == lib.books[i].year)){
return i;
}
}
return -1;
}
void remove_book(struct library lib , char author[NAME] , int year){
int id = search_book(lib , author , year);
if(id == -1)
return;
lib.books[id].flag = 1;
}
int main(){
struct library centeral_library;
return 0;
}
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
#include <stdio.h>
#include <string.h>
#define NAME 20
#define CONTENT 100
#define CAPACITY 30
struct book {
char author[NAME];
char content[CONTENT];
int year;
int flag;
};
struct library{
struct book books[CAPACITY];
char name[NAME];
};
void add_book(struct library lib , struct book book){
for(int i = 0; i < CAPACITY;i++){
if(lib.books[i].flag = 1){
strcpy(lib.books[i].author , book.author);
strcpy(lib.books[i].content , book.content);
lib.books[i].year = book.year;
lib.books[i].flag = 0;
return;
}
}
}
int search_book(struct library lib , char author[NAME] , int year){
for(int i = 0;i < CAPACITY;i++){
if((lib.books[i].flag == 1) && strcmp(lib.books[i].author , author) == 0 && (year == lib.books[i].year)){
return i;
}
}
return -1;
}
void remove_book(struct library lib , char author[NAME] , int year){
int id = search_book(lib , author , year);
if(id == -1)
return;
lib.books[id].flag = 1;
}
int main(){
struct library centeral_library;
return 0;
}
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
#نکته
#معماری
معماری به ما کمک میکنه که کد تمیز تر و حرفه تر داشته باشیم.
در معماری ما برنامه رو به لایه های مختلفی تقسیم میکنیم که در معماری های مختلف این لایه ها وظایف مشخص خودشونو دارن.
بهترین مزیتی که معماری داره اینه که اگه روزی بخواین به برنامه تون یک فیچر اضافه کنین، کد های کمتری رو تغییر میدین
دلیلش هم این هست که کد ها لایه بندی شدن.
مزیت های دیگه رو شما کامنت کنید
در ادامه به معرفی معماری های مختلف میپردازیم
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
#معماری
معماری به ما کمک میکنه که کد تمیز تر و حرفه تر داشته باشیم.
در معماری ما برنامه رو به لایه های مختلفی تقسیم میکنیم که در معماری های مختلف این لایه ها وظایف مشخص خودشونو دارن.
بهترین مزیتی که معماری داره اینه که اگه روزی بخواین به برنامه تون یک فیچر اضافه کنین، کد های کمتری رو تغییر میدین
دلیلش هم این هست که کد ها لایه بندی شدن.
مزیت های دیگه رو شما کامنت کنید
در ادامه به معرفی معماری های مختلف میپردازیم
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
💬 #چالش
جمله عمومی دنباله: n^2 + 4n
🟥درجه سختی: آسان
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
جمله عمومی دنباله: n^2 + 4n
🟥درجه سختی: آسان
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
Tp hunters cpp
💬 #چالش جمله عمومی دنباله: n^2 + 4n 🟥درجه سختی: آسان 🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید. @tphunterscpp
🧠 #کد_چالش
#include <iostream>
using namespace std;
int main(){
int n;
cout << "Enter the number: ";
cin >> n;
for (int i=1; i<= n+2; i++){
for(int j=1; j<= n+2; j++){
if( i==1 && j==1 || i==1 && j==n+2 || i==n+2 && j==1 || i==n+2 && j==n+2){
cout<<" ";
}
else{
cout<<"*";
}
}
cout << endl;
}
}
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
#include <iostream>
using namespace std;
int main(){
int n;
cout << "Enter the number: ";
cin >> n;
for (int i=1; i<= n+2; i++){
for(int j=1; j<= n+2; j++){
if( i==1 && j==1 || i==1 && j==n+2 || i==n+2 && j==1 || i==n+2 && j==n+2){
cout<<" ";
}
else{
cout<<"*";
}
}
cout << endl;
}
}
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
💬 #شرح_کد
همانطور که مشاهده میکنید برنامه فقط به یک ورودی n نیاز دارد.
حلقه for اول برای انجام دستور endl تعریف شده و حلقه داخلی برای چاپ * و space
از آنجایی که ما در خروجی مربعی به ضلع n+2
داریم (با در نظر نگرفتن گوشه های مربع) پس از شرط i<= n+2 در حلقه های for استفاده میکنیم.
برای چاپ space بجای * در گوشه های بالا و پایین از شرط استفاده میکنیم بنابراین اگر این گوشه هارا درایه هایی از ماتریس در نظر بگیریم؛ دستورهای طرفین || هر کدام به یک درایه (به یک گوشه از مربع) اشاره دارند.
برای مثال i==1 && j==1 به گوشه بالا سمت چپ اشاره دارد. پس بجای آن space چاپ میشود.
🟢لطفا سوالات، کد و نظرات خود را برای ما کامنت کنید یا داخل گروه بفرستید.
@tphunterscpp
همانطور که مشاهده میکنید برنامه فقط به یک ورودی n نیاز دارد.
حلقه for اول برای انجام دستور endl تعریف شده و حلقه داخلی برای چاپ * و space
از آنجایی که ما در خروجی مربعی به ضلع n+2
داریم (با در نظر نگرفتن گوشه های مربع) پس از شرط i<= n+2 در حلقه های for استفاده میکنیم.
برای چاپ space بجای * در گوشه های بالا و پایین از شرط استفاده میکنیم بنابراین اگر این گوشه هارا درایه هایی از ماتریس در نظر بگیریم؛ دستورهای طرفین || هر کدام به یک درایه (به یک گوشه از مربع) اشاره دارند.
برای مثال i==1 && j==1 به گوشه بالا سمت چپ اشاره دارد. پس بجای آن space چاپ میشود.
🟢لطفا سوالات، کد و نظرات خود را برای ما کامنت کنید یا داخل گروه بفرستید.
@tphunterscpp
#نکته
#معماری_MVP
یکی از پرکاربرد ترین معماری ها در برنامه نویسی MVP هستش.
درواقع MVP مخفف عبارت زیر است.
( model - view - presenter)
در لایه presenter منطق برنامه وجود داره و در لایه view داده ها نمایش داده میشه.
رابط بین این دو تا لایه، presenter هستش.
به این صورت که لایه view یک درخواست اطلاعات ارسال میکنه به presenter و این لایه اطلاعات رو از model میگیره و به view پاس میده
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp
#معماری_MVP
یکی از پرکاربرد ترین معماری ها در برنامه نویسی MVP هستش.
درواقع MVP مخفف عبارت زیر است.
( model - view - presenter)
در لایه presenter منطق برنامه وجود داره و در لایه view داده ها نمایش داده میشه.
رابط بین این دو تا لایه، presenter هستش.
به این صورت که لایه view یک درخواست اطلاعات ارسال میکنه به presenter و این لایه اطلاعات رو از model میگیره و به view پاس میده
🟢لطفا سوالات، نظرات و کد های خود را برای کامنت یا داخل گروه ارسال کنید.
@tphunterscpp