PDA

View Full Version : سوال: تحلیل و توضیح کد سی پلاس پلاس



haricanboy
سه شنبه 26 آذر 1392, 22:30 عصر
سلام
از دوستان لطفا هر کی بلده این کدها رو برای من توضیح بده لطفاً

#include<iostream.h>
#include<conio.h>
#include<string.h>

#define max 200

class bi
{
int a[max];
public:
bi();
bi(char []);
bi add(bi);
bi zarb(bi);
void print();
};

bi::bi()
{
for(int i=max;i>=0;i--)
a[i]=0;
}

bi::bi(char b[])
{
int str,k=0,i;
str=strlen(b);
for(i=max-str;i<max;i++)
a[i]=(int)b[k++]-48;
for(i=0;i<max-str;i++) a[i]=0;

}

bi bi::add(bi z)
{
bi t("000");
for(int i=max-1;i>=0;i--)
{
t.a[i-1]=(a[i]+z.a[i]+t.a[i])/10;
t.a[i]=(a[i]+z.a[i]+t.a[i])%10;
}
return t;
}


bi bi::zarb(bi z)
{
bi t("0000");
int i,j,k=max-1;
for(i=max-1;i>=0;i--)
{
for(j=max-1;j>=0;j--)
{
t.a[k-1]=(a[i]*z.a[j]+t.a[k])/10+t.a[k-1];
t.a[k]=(a[i]*z.a[j]+t.a[k])%10;
k--;
}
k=i-1;
}
return t;
}



void bi::print()
{
int j;
for(int i=0;i<max;i++)
if(a[i]) {j=i;break;}
for(i=j;i<max;i++)
cout<<a[i];
cout<<endl<<"***********************************************\n";
}


void main()
{
clrscr();
char *int1,*int2;
cin>>int1>>int2;
bi a(int1),b(int2),c("000");
cout<<"Sum: ";
c=a.add(b);c.print();
cout<<"Mul: ";
c=a.zarb(b);c.print();
getch();
}

از خط 18 به بعد
ممنون

haricanboy
چهارشنبه 27 آذر 1392, 17:39 عصر
کسی کمک نمیکنه؟؟؟

amirhossein.ha
چهارشنبه 27 آذر 1392, 22:35 عصر
کجا این رو دیدید ؟؟

haricanboy
چهارشنبه 27 آذر 1392, 23:00 عصر
از یکی از دوستان گرفتم
چطور؟؟؟

saina2006
پنج شنبه 28 آذر 1392, 05:36 صبح
چرا از فانکشن atoi استفاده نکردید؟؟؟

haricanboy
پنج شنبه 28 آذر 1392, 09:58 صبح
ای بابا من ننوشتم
لطفاً تو تحلیل و توضیح کد کمک کنید
روال کاری برنامه رو بگید که چطوری کار میکنه و چطوری محاسبات رو انجام میده با اشاره به کد
خیلی ممنون

haricanboy
پنج شنبه 28 آذر 1392, 14:24 عصر
این تابع دقیقاً کارش چیه تو برنامه؟


bi::bi(char b[])
{
int str,k=0,i;
str=strlen(b);
for(i=max-str;i<max;i++)
a[i]=(int)b[k++]-48;
for(i=0;i<max-str;i++) a[i]=0;

}

چرا منهای 48 شده؟

omidshaman
پنج شنبه 28 آذر 1392, 19:46 عصر
این تابع دقیقاً کارش چیه تو برنامه؟


bi::bi(char b[])
{
int str,k=0,i;
str=strlen(b);
for(i=max-str;i<max;i++)
a[i]=(int)b[k++]-48;
for(i=0;i<max-str;i++) a[i]=0;

}

چرا منهای 48 شده؟
آرایه کاراکتری رو به آرایه int تبدیل می کنه .
48 کد اسکی 0 ه

haricanboy
پنج شنبه 28 آذر 1392, 23:36 عصر
خیلی ممنون
میشه لطفاً در مورد روال کار برنامه هم یه توضیح کامل بدین؟
چطور کار میکنه
مثلاً دو تا عدد 10000 رو گرفته با هم جمع و ضرب میکنه
با همین مثال توضیح بدین چطوری این محاسبات رو انجام میده؟
تشکر.

amirhossein.ha
جمعه 29 آذر 1392, 18:32 عصر
این برنامه برای جمع و ضرب اعداد بزرگ هست مثلا 1000 رقمی اول دوتا عدد رو به صورت کاراکتری میگیره بعد میریزه توی یه ارایه بعد برای جمع مثل جمع عادی هر دوتا عدد که زیر همن رو با هم جمع میکنه و اگه بزرگتر از ده شد خونه بعدی ارایه رو هم به مقدار اون عدد تقسیم بر 10 زیاد میکنه و برای ضرب هم همین هر سری میگیره و ضرب میکنه و اگه بزرگ شد مقدار که بزرگ شده رو به خونه بقلی اضافه میکنه بعد هم چاپش میکنه فک نکنم چیزی داشته باشه که نیازی به توضیح باشه اگه با جاییش مشکل دارید بگید تا توضیح بدیم

haricanboy
جمعه 29 آذر 1392, 19:55 عصر
خیلی ممنون
شرمنده
میشه لطفاً با اشاره به شماره سطر کد یه توضیحات مختصر در موردش بنویسید؟؟؟
ممنون

amirhossein.ha
جمعه 29 آذر 1392, 21:55 عصر
ok

سه خط اول که include ها هستن بعد هم max رو با 200 جایگزین کرده
بعد توی این قسمت یه کلاس به نام bi میسازه و توی اون یه سری چیزا تعریف میکنه که پایین توضیح دادم :
class bi
{
int a[max];
public:
bi();
bi(char []);
bi add(bi);
bi zarb(bi);
void print();
};
بعد توی این قسمت همه خونه های ارایه ای که توی اون کلاس تعریف کرده رو 0 میکنه : bi::bi()
{
for(int i=max;i>=0;i--)
a[i]=0;
}

بعد توی این قسمت یه عدد که به صورت کاراکتری گرفته رو تبدیل به عدد میکنه و توی یه ارایه میریزش :
bi::bi(char b[])
{
int str,k=0,i;
str=strlen(b);
for(i=max-str;i<max;i++)
a[i]=(int)b[k++]-48;
for(i=0;i<max-str;i++) a[i]=0;

}
بعد توی این قسمت اعدادی که توی قسمت بالا از کاراکتر به عدد تبدیل کرده بود رو به هم تبدیل میکنه
bi bi::add(bi z)
{
bi t("000");
for(int i=max-1;i>=0;i--)
{
t.a[i-1]=(a[i]+z.a[i]+t.a[i])/10;
t.a[i]=(a[i]+z.a[i]+t.a[i])%10;
}
return t;
}
این قسمت هم برای ضرب دو تا عدد :
bi bi::zarb(bi z)
{
bi t("0000");
int i,j,k=max-1;
for(i=max-1;i>=0;i--)
{
for(j=max-1;j>=0;j--)
{
t.a[k-1]=(a[i]*z.a[j]+t.a[k])/10+t.a[k-1];
t.a[k]=(a[i]*z.a[j]+t.a[k])%10;
k--;
}
k=i-1;
}
return t;
}


و تابع اخر هم برای نوشتن عدد روی صفحه هست که نیازی توضیح نداره .

اگه بازم توضیح میخوای بگو تا بیشتر توضیح بدم

haricanboy
جمعه 29 آذر 1392, 22:50 عصر
خیلی ممنون
کمک بزرگی کردین
خودم بیشتر بهش فکر میکنم اگه بازم مشکل داشتم میپرسم
بازم ممنون

haricanboy
شنبه 30 آذر 1392, 20:14 عصر
سلام
لطفاً قسمت تابع ضرب رو بیشتر برام توضیح بدین
ضرب رو چطور انجام میده؟


bi bi::zarb(bi z)
{
bi t("0000");
int i,j,k=max-1;
for(i=max-1;i>=0;i--)
{
for(j=max-1;j>=0;j--)
{
t.a[k-1]=(a[i]*z.a[j]+t.a[k])/10+t.a[k-1];
t.a[k]=(a[i]*z.a[j]+t.a[k])%10;
k--;
}
k=i-1;
}
return t;
}

و این قسمتها


bi t("000");


bi t("0000");

چرا برای جمع 3 تا صفر گذاشته ضرب 4 تا؟؟؟
نحوه پرینت چطوره؟؟؟


void bi::print()
{
int j;
for(int i=0;i<max;i++)
if(a[i]) {j=i;break;}
for(i=j;i<max;i++)
cout<<a[i];
cout<<endl<<"************************************* **********\n";
}

این قسمتها رو هم توضیح بدین لطفاً


char *int1,*int2;


bi a(int1),b(int2),c("000");

ستاره قبل از int یعنی چی؟
برا c چرا سه تا صفر گذاشته؟؟؟

amirhossein.ha
یک شنبه 01 دی 1392, 14:37 عصر
bi t("000");


bi t("0000");

دلیل این صفرها رو هم خودم نمیدونم چرا همچنین توی این قسمت نمیدونم چرا چن تا صفر گذاشته ولی منظور از * pointer هست و مثه یه اشاره گر عمل میکنه من خودم از این استفاده نمیکنم و معمولا اینجوری میکنم :
char int1[100],int2[100];
cin>>int1>>int2 ;
big a(int1),b(int2),c("000");
و در مورد پرینت ‌: void bi::print()
{
int j;
for(int i=0;i<max;i++)
if(a[i]) {j=i;break;}
for(i=j;i<max;i++)
cout<<a[i];
cout<<endl<<"************************************* **********\n";
}
همونطور که دیدید ضرب و جمع رو با ارایه انجام میداد پس موقع نوشتن میاد از خونه اول شروع میکنه و وقتی به یه عدد رسید از اونجا شروع به چاپ کردن میکنه دلیلش هم اینه که صفر های پشت عدد رو نیاز نیست چاپ کنه

haricanboy
یک شنبه 01 دی 1392, 18:29 عصر
بازم ممنون
در مورد ضرب چیزی نگفتین
استاده هم گیر داده به همون ضرب کد رو باز میکنم سریع میگه تابع ضرب رو توضیح بده
و همون کد که 3 تا صفر و چهار تا صفر داره
موندم چیکار کنم

khatereh202020
جمعه 08 آبان 1394, 13:42 عصر
// ÊÞÇÑä 1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include<conio.h>
using namespace std;
class stack
{
private:
char *a;
int size;
int top;
public:
stack(int);
int isfull();
int isempty();
void push(char);
char pop();
};
class queue
{
private:
char *a;
int size;
int front;
int rear;
public:
queue(int);
int isfull();
int isempty();
void add(char);
char del();
};
int main()
{
char s[20];
cout<<"please enter=";
cin>>s;
stack st(strlen(s));
queue qu(strlen(s));
for(int i=0;s[i]!='\0';i++)
{
st.push(s[i]);
qu.add(s[i]);
}
int sw=1;
char cq,cs;
for(int j=0;s[j]!='\0'&& sw==1;j++)
{
cs=st.pop();
cq=qu.del();
if(cs!=cq)
{
sw=0;
}
}
if(sw==1)
cout<<"Yes";
else
cout<<"No";
getch();
return 0;
}
queue::queue(int s)
{
rear=-1;
front=0;
a=new char[s];
size=s;
}
int queue::isfull()
{
if(rear==size-1)
return 1;
return 0;
}
int queue::isempty()
{
if(front>rear)
return 1;
return 0;
}
void queue::add(char c)
{
if(isfull())
cout<<"full";
else
a[++rear]=c;
}
char queue::del()
{
if(isempty())
cout<<"empty";
else
return a[front++];
}
stack::stack(int s)
{
size=s;
top=-1;
a=new char[s];
}
int stack::isfull()
{
if(top==size-1)
return 1;
else
return 0;
}
int stack::isempty()
{
if(top==-1)
return 1;
else
return 0;
}
void stack::push(char c)
{
if(isfull())
cout<<"full";
else
a[++top]=c;
}
char stack::pop()
{
if(isempty())
cout<<"empty";
else
return a[top--];
}












باسلام خدمت دوستان و برنامه نویسان
این برنامه رشته ای رو از کاربر میگیره و بااستفاده از پشته میگه متقارن هست یا نه
میشه کسی دقیق توضیح بده که چجور این کارو میکنه؟؟؟؟؟؟؟؟؟

khatereh202020
شنبه 09 آبان 1394, 18:06 عصر
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::افسر ه::ناراحت::افسرده::ناراحت::ا سرده::ناراحت::گریه::گریه::گر ه::گریه::گریه::گریه::گریه:

ali chegini
دوشنبه 11 آبان 1394, 13:22 عصر
سلام.
شما باید در مورد عملکرد پشته بدونید: احتمالا میدونید.
با یه مثال ساده کار برنامه رو توضیح میدم :
ما رشته زیر رو داریم : این رشته دوتا کاراکتر هست.
AA
این رشته رو در پشته پوش میکنیم که به صورت زیر میشه :
AA
حالا کاراکتر اول رو پاپ میکنیم یعنی از بالای پشته برمیداریم :
A
حالا اگر این کاراکتر با کاراکتر داخل پشته برابر بشه دوتا رشته متقارن هستند.
پس کاراکتر دوم رو پاپ میکنیم و با اولی مقایسه میکنیم .
این مثال خیلی ساده بود.