سئوالات و مشکلات برنامه نویسی به زبان C و ++C

شهریاری 2

کاربر فعال تالار اسلام و قرآن
کاربر ممتاز
از اونجایی که زبون ++C هست، قاعدتاً نباید از شما مقدار متغیر رو قبل از استفاده بخواد، چون از خودش یه مقدار اولیه‌ی گنده (حافظه) برای a به هنگام تعریفش در نظر میگیره. احتمالاً از کامپایلر و محیط برنامه‌نویسی پیشرفته مثل Visual Studio استفاده می‌کنید و الا کدتون فاقد مشکل Syntax ایی هست.

ولی کد شما انواع خطاهای منطقی رو داره. میخواید بگید اگه a بزرگتر از 0 و بین 100 و 1000 بود، دوباره a رو از ورودی بگیره!؟ a که مقدار اولیه نداره، پس برای چی باید بین 100 و 1000 باشه!؟ در کل هدفتون از این کد چی هست؟
ضمناً شرطی که نوشتید، نحوه‌ی نوشتن قسمت دومش اشتباه هست:
100<=a<1000

عبارت بالا به معنی اینکه a بین 100 و 1000 هست نیست، بلکه به این معنی هست که آیا نتیجه‌ی a>=100، از 1000 کوچیکتره؟ که جوابش همیشه بله هست! یعنی اول میاد حاصل a>=100 رو حساب میکنه (که اگه a از 100 بزرگتر باشه، حاصلش میشه 1، و اگه کوچیکتر بشه حاصلش میشه 0) و این حاصل رو با 1000 مقایسه میکنه که به هر حال چه 1 و چه 0 از 1000 کوچیکتر هستند و کل عبارات بالا مقدار 1 رو برمیگردونه و باعث میشه این شرط همیشه اجرا بشه. باید به این صورت بنویسید:if(a > 0 && a >= 100 & a < 1000)

در ضمن وقتی a قرار هست بین 100 و 1000 باشه، دیگه لزومی نداره چک کنید ببینید که آیا از 0 هم بزرگتره یا نه!

دوست عزیز یه چیزی رو متوجه نشدید:
اونم اینکه همیشه a برابر با 1 هست. چراکه قبل از شرط، داخل a عدد 1 رو قرار داده. در نتیجه هیچگاه شرط برقرار نخواهد بود.
 

behnam5670

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

حتی به فرض که a رو برابر با 1 کرد، توو عبارت:
(if(a>0&&100<=a<1000
cin>>a

a>0 که درسته، توو قسمت دوم هم همانطور که بالا گفتم، اول چک میکنه ببینه a که به گفته‌‌ی شما مقدار 1 رو داره، از 100 بزرگتر هست یا نه، که نیست، پس مقدار 0 برمیگردونه. حالا این مقدار 0 با 1000 مقایسه میشه و چون از 1000 کمتره، شرط همیشه درسته. شما یه کد بنویسید و به a هر مقدار دلخواهی بدید، عبارت
(if(100<=a<1000 همیشه اجرا خواهد شد چون کلاً اشتباه نوشته شده و توو زبان ++C اینطوری نمینویسیم.

پی‌نوشت: دقت کنید که شرط به صورت (
if(100<=a<1000 نوشته شده، نه به صورت (if(100<=a && a<1000 .
 

behnam5670

عضو جدید
کاربر ممتاز
سلام دوستان
این برنامه متقارن بورن یه عدد که اقا امیر به من گفتن
#include<iostream.h>
#include<conio.h>
int main()
{
int num,a,i,e,d,b=0,c=1;
cout<<"enter a number : ";
cin>>num;
d=num;
while(d !=0){
d/=10;
++b;
}
for (i = 1; i < b; i++) {
c *=10;
}
b /=2;
for (i = 0; i < b ; i++) {
a=num%10;
e=num/c;
num %=c;
num/=10;


c/=100;

if (a!=e) {
cout<<"no motegharen";
goto a;
}
}
cout<<"motegharen";
a:
getch();
return 0;
}

فقط این قسمتشو نمیفهمم چیه ؟
while(d !=0){
d/=10;
++b;
}
for (i = 1; i < b; i++) {
c *=10;
}
b /=2;
for (i = 0; i < b ; i++) {
a=num%10;
e=num/c;
num %=c;
num/=10;


c/=100



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

int a, b = 0, a_copy;
cin >> a;
a_copy = a;

while(a > 0){
b *= 10;
b += a%10;
a = a/10;
}

cout << (a_copy == a) << endl;


سلام.ببخشید یه راهنمایی میخواستم.یه دفترچه تلفن به زبان c میخوام بنویسم که مشخصاتش اینه:
ظرفیت دفترچه تلفن حداکثر 50 نفر
اسم هر شخص حداکثر 20 کاراکتر
شماره هر شخص حداکثر 7 رقم
با نوشتن اسم search برنامه با گرفتن اسم شخص شمارشو چاپ گنه.با نوشتن exit از برنامه خارج بشه.
میشه راهنمایی کنین؟

یه آرایه‌ی دو بعدی نوع string بگیر که شاید یکم برات سخت باشه.
پس به نظرم برای هر کدوم یه آرایه‌ی جدا بگیر ولی همش از نوع char باشه بهتره. برای اسم‌ها یه آرایه‌ی 50 در 20 از نوع char بگیر مثلا [char name[50][20. برای شماره‌ها هم همچنین char [. number[50][7. البته میتونی int هم بگیری شماره‌ها رو.
برای search، بعده اینکه اسم رو گرفتی، توو آرایه‌ی name یه for بزن ببین کدوم درایه‌ش با اسمی که گرفتی برابر هست، اگه برابر بود [number[i رو چاپ کن.

سلام دوستان
خواهش می کنم سوالمو جواب بدید
مدت زمان اجرای یک دستور یا یک الگوریتم در زبان سی رو چطوری اندازه بگیرم؟
از چه تابعی باید استفاده کنم؟
جسارتاً شما ارشد هوش مصنوعی هستید؟ چون اون روز هم یه سوال در مورد اولویت عملگرها پرسیده بودید که...
 

maryam.kh1374

عضو جدید
خطای modifyدر برنامه نویسی

خطای modifyدر برنامه نویسی

من خیلی وقتا که برنامه نویسی میکنم این مشکل برام پیش میاد که مینویسه its not modifiableمشکل چیه :que:لطفا زود جواب بدین:cry:
 

شهریاری 2

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

حتی به فرض که a رو برابر با 1 کرد، توو عبارت:
(if(a>0&&100<=a<1000
cin>>a

a>0 که درسته، توو قسمت دوم هم همانطور که بالا گفتم،
اول چک میکنه ببینه a که به گفته‌‌ی شما مقدار 1 رو داره، از 100 بزرگتر هست یا نه، که نیست، پس مقدار 0 برمیگردونه. حالا این مقدار 0 با 1000 مقایسه میشه و چون از 1000 کمتره، شرط همیشه درسته. شما یه کد بنویسید و به a هر مقدار دلخواهی بدید، عبارت (if(100<=a<1000 همیشه اجرا خواهد شد چون کلاً اشتباه نوشته شده و توو زبان ++C اینطوری نمینویسیم.

پی‌نوشت: دقت کنید که شرط به صورت (
if(100<=a<1000 نوشته شده، نه به صورت (if(100<=a && a<1000 .

نه دوست عزیز. با نظرتون مخالفم . شرط برقرار نمیشه. چون 100<=a غلط است درنتیجه به خاطر and بودن بین شرط ها،چون وقتی a>=100 نباشه دیگه به بقیه کار نداره. در نتیجه شرط هیچگاه برقرار نخواهد بود.

این رو هم که میگم a=1است به خاطر این دستور است که قبل از دستور شرط اومده:

int a=b=1;
if(a>0&&100<=a<1000


اونجا هم که میگید:
"اول چک میکنه ببینه a که به گفته‌‌ی شما مقدار 1 رو داره، از 100 بزرگتر هست یا نه، که نیست، پس مقدار 0 برمیگردونه"

منظور از 0، false بودن است که وقتی a<=100 رو مبینه که ، false است ، دیگه نمیره ببینه که از 1000 کمتر است یا نه؛ درنتیجه از شرط خارج میشه.
 
آخرین ویرایش:

behnam5670

عضو جدید
کاربر ممتاز
نه دوست عزیز. با نظرتون مخالفم . شرط برقرار نمیشه. چون 100<=a غلط است درنتیجه به خاطر and بودن بین شرط ها،چون وقتی a>=100 نباشه دیگه به بقیه کار نداره. در نتیجه شرط هیچگاه برقرار نخواهد بود.

این رو هم که میگم a=1است به خاطر این دستور است که قبل از دستور شرط اومده:

int a=b=1;
if(a>0&&100<=a<1000


اونجا هم که میگید:
"اول چک میکنه ببینه a که به گفته‌‌ی شما مقدار 1 رو داره، از 100 بزرگتر هست یا نه، که نیست، پس مقدار 0 برمیگردونه"

منظور از 0، false بودن است که وقتی a<=100 رو مبینه که ، false است ، دیگه نمیره ببینه که از 1000 کمتر است یا نه؛ درنتیجه از شرط خارج میشه.

در مورد اینکه a=1 هست، من قبل از پست دوم دوستمون پست داده بودم و شما هم اون پست من رو نقل قول کردید، برای همین توو کد اول a=1 رو ننوشته بودند و من متوجه نشدم منظور شما کد دوم هست، بله a=1 هست.

ببینید حرف شما زمانی درست هست که شرط به صورت a > 0 && a >= 100 && a < 1000 باشه (یعنی 3 تا شرط). در این حالت چون a >= 100 برقرار نیست دیگه نمیاد a < 1000 رو چک کنه و حرف شما درسته (البته اگه به جای && از & استفاده میکردیم، اون موقع همه رو چک میکرد).
ولی توجه داشته باشید اینجا ما با دو شرط سر و کار داریم، نه سه شرط. چرا؟ چون شرط به صورت
a>0&&100<=a<1000 نوشته شده و فقط یک && داریم. در این حالت عبارت سمت چپ و سمت راست &&، هر کدوم یک شرط هستند. شرط اول a>0 هست که برقراره، شرط دوم هم
100<=a<1000
هست که دقیقاً به صورتی که بالا گفتم چک میشه. این یک شرط هست نه دو شرط که بیاد ببینه اگه قسمت اولش صدق نکرد، دیگه قسمت دوم رو چک نکنه. در واقع این یک عبارت boolean هستکه اول a>=100 یک مقدار 0 یا 1 برمیگردونه و سپس این مقدار 0 یا 1، با a<1000 مقایسه میشه.



اگه قانع نشدید، کاری نداره که شما قطع کد زیر رو اجرا کنید ببینید نتیجش چی میشه:
int a = 1;
if(a > 0 && 100 <= a < 1000)
cout << "OK" << endl;
اگه حرف شما درست باشه، برنامه نباید چیزی چاپ کنه ولی خواهید دید که عبارت OK چاپ میشه.

از کامپایلر آنلاین زیر هم میتونید استفاده کنید تا کارتون سریع راه بیفته.
http://www.compileonline.com/compile_cpp0x_online.php
 

sungift143

عضو جدید
سلام

دوستان شرمنده...
من اصلا به ذهن داغونم نمیرسه که چجوری باید این برنامه رو بنویسم...
میشه راهنماییم کنید؟؟؟

*برنامه ای بنویسید که اعداد 1 تا 1000 را چاپ نماید...
راستش توی کتاب ک خوندم گفتم شاید با for بشه انجام داد.. درسته؟؟؟
 

شهریاری 2

کاربر فعال تالار اسلام و قرآن
کاربر ممتاز
سلام

دوستان شرمنده...
من اصلا به ذهن داغونم نمیرسه که چجوری باید این برنامه رو بنویسم...
میشه راهنماییم کنید؟؟؟

*برنامه ای بنویسید که اعداد 1 تا 1000 را چاپ نماید...
راستش توی کتاب ک خوندم گفتم شاید با for بشه انجام داد.. درسته؟؟؟

سلام
درسته برادر!
چون میخاد یه کاری رو 1000 مرتبه انجام بده، باید از حلقه استفاده کرد.
 

شهریاری 2

کاربر فعال تالار اسلام و قرآن
کاربر ممتاز
در مورد اینکه a=1 هست، من قبل از پست دوم دوستمون پست داده بودم و شما هم اون پست من رو نقل قول کردید، برای همین توو کد اول a=1 رو ننوشته بودند و من متوجه نشدم منظور شما کد دوم هست، بله a=1 هست.

ببینید حرف شما زمانی درست هست که شرط به صورت a > 0 && a >= 100 && a < 1000 باشه (یعنی 3 تا شرط). در این حالت چون a >= 100 برقرار نیست دیگه نمیاد a < 1000 رو چک کنه و حرف شما درسته (البته اگه به جای && از & استفاده میکردیم، اون موقع همه رو چک میکرد).
ولی توجه داشته باشید اینجا ما با دو شرط سر و کار داریم، نه سه شرط. چرا؟ چون شرط به صورت
a>0&&100<=a<1000 نوشته شده و فقط یک && داریم. در این حالت عبارت سمت چپ و سمت راست &&، هر کدوم یک شرط هستند. شرط اول a>0 هست که برقراره، شرط دوم هم
100<=a<1000
هست که دقیقاً به صورتی که بالا گفتم چک میشه. این یک شرط هست نه دو شرط که بیاد ببینه اگه قسمت اولش صدق نکرد، دیگه قسمت دوم رو چک نکنه. در واقع این یک عبارت boolean هستکه اول a>=100 یک مقدار 0 یا 1 برمیگردونه و سپس این مقدار 0 یا 1، با a<1000 مقایسه میشه.



اگه قانع نشدید، کاری نداره که شما قطع کد زیر رو اجرا کنید ببینید نتیجش چی میشه:
int a = 1;
if(a > 0 && 100 <= a < 1000)
cout << "OK" << endl;
اگه حرف شما درست باشه، برنامه نباید چیزی چاپ کنه ولی خواهید دید که عبارت OK چاپ میشه.

از کامپایلر آنلاین زیر هم میتونید استفاده کنید تا کارتون سریع راه بیفته.
http://www.compileonline.com/compile_cpp0x_online.php

ببخشید من متوجه نمیشم.

در عملگر and مگه نباید هردو 1 باشند تا 1 را به خروجی دهد؟
چرا اینجا شرط رو اجرا میکنه؟
 

sungift143

عضو جدید
سلام
درسته برادر! بخدا من دخترم
چون میخاد یه کاری رو 1000 مرتبه انجام بده، باید از حلقه استفاده کرد.

مشه بگین چجوری؟؟؟من دستورشو بلد نیستم بنویسم...تازه توی کتاب نوشته بود باید از cntrl+break واسه نگهداشتن برنامه استفاده کرد... من بجز دکمه کنترل چیزی نمیبینم :confused:
 

شهریاری 2

کاربر فعال تالار اسلام و قرآن
کاربر ممتاز

مشه بگین چجوری؟؟؟من دستورشو بلد نیستم بنویسم...تازه توی کتاب نوشته بود باید از cntrl+break واسه نگهداشتن برنامه استفاده کرد... من بجز دکمه کنترل چیزی نمیبینم :confused:


PHP:
int main()
{
 for(int i=0;i<1001;i++)
 {
     cout<<i<<"\n";
 }

   return 0;
}

این برنامه ای هست که شما میخاید.
میدونید چطوری کار میکنه؟
 

sungift143

عضو جدید
#include "stdafx.h"
#include <iostream>
void maghloub (int x);
{
int n,m,o,y,z,s ;
n=x%10;
y=x%10;
m=y%10;
z=y%10;
o=z%10;
s=((n*100)+(m*10)+(o*1));
printf("javab=%d,s");
}
int main()
{
int x;
printf("enter adade 3 raghami:");
printf("%d,&x");
maghloub(x);
getch();
return=0;
}


چرا این برنامه ارور میده؟؟؟
کجاش ایراد داره؟؟؟
*برنامه ای بنویسید ک عدد صحیحی را دریافت کند و مقلوب( مغلوب) انرا چاپ نماید...
 

sungift143

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

بله میدونم تاپیک درس دادن نیست...
برای منم اصلا مهم نیست که چجوری کار میکنه.. من فقط باید برنامه رو run کنم و ازش prntscr بگیرم و به استادم نشون بدم...همین
 

mahdieh6984

عضو جدید
مهم:توان رسانی اعداد بی نهایت

مهم:توان رسانی اعداد بی نهایت

سلام دوستان
من میخوام یه برنامه بنویسم واسه توان رسانی اعداد خیلی بزرگ (نامحدود).
اول پایه و نما تو دو تا لیست پیوندی ذخیره میشه واسه ضرب اعداد هر چقدرم بزرگ مشکلی نداره
مشکل اینجاست که مثلا وقتی میخواد عدد 255 به توان 128برسونه هر کدوم از ارقام 128تو ی گره از لیست پیوندی ،برنامه باید 255؛128بار در خودش ضرب کنه من اومدم گفتم از آخر لیست شروع کن اول 8بردار تو یک متغییری مثل iکه مقدار اولیش 1 ضرب کن و به تعداد اون حلقه for انجام بده بعد iدر 10 ضرب میشه و...به همین صورت تا 128 بار عمل ضرب انجام میشه.
حلا برنامه تا زمانیکه از رنج double(متغیر iاز نوع double)خارج نشده درست کار میکنه اما واسه اعداد با تعداد رقم بالا دیگ نمی تونه جواب بده .
چکار کنم ک برنامه بتونه واسه حلقه هم نامحدود اجرا بشه؟؟؟؟؟؟
ممنون میشم راهنمایی کنین
کد:
[/LEFT]

void res_pow(co_node &num1,co_node &pow)   {     int i =1;     co_node resault;     double count_pow;         	[URL="http://www.daneshju.ir/forum/vbglossar.php?do=showentry&item=node"]node[/URL]    *tmp1, * tmp2;      tmp1 = pow.last;      while (tmp1)       {            count_pow=tmp1->node_num*i;              for(int m=0;m<count_pow;m++)            mul(resault,num1);         if (tmp1 != pow.first)           tmp1 = tmp1 -> back;         else           tmp1 = NULL;            i*=10;        count_pow=0;     }     num1.del();    tmp2 = resault.first;    while(tmp2)      {        num1.add_node_next(tmp2 -> node_num);        tmp2 = tmp2 ->next;      }   }[LEFT]
 

behnam5670

عضو جدید
کاربر ممتاز
ببخشید من متوجه نمیشم.

در عملگر and مگه نباید هردو 1 باشند تا 1 را به خروجی دهد؟
چرا اینجا شرط رو اجرا میکنه؟

چرا، باید همشون 1 باشند تا شرط اجرا باشه ولی برای بار سوم میگم که اینجا شرط به صورت a > 0 && 100<=a<1000 هست، نه به صورت a > 0 && a >=100 && a < 1000.
وقتی شما مثلاً مینویسید a < b + c + d، اول میاد b+c+d رو حساب میکنه، بعد شرط رو چک میکنه. اینجا هم اول
100<=a<1000
رو چک میکنه. برای اینکار این عبارت رو به صورت 1000 > (a<=100) در میاره. یعنی X < 1000. اول X رو حساب میکنه که به هر حال یا 0 هست یا 1، بعد X رو با 1000 چک میکنه.
یه مثال دیگه: مثلاً اگه شما بنویسید a > 100 > b > 2، اینطور نیست که بیاد چک کنه که آیا b بین 2 و 100 و آیا a از 100 بزرگتر هست یا نه (برای این کار باید جدا جدا از && استفاده میشد) بلکه اول میاد چک میکنه که a از 100 بزرگتر هست یا خیر که در جواب، 0 یا 1 برمیگردونه. سپس این 0 یا 1 میاد با b مقایسه میشه و دوباره یه 0 و 1 دیگه برمیگردونه. در نهایت این 0 یا 1 میاد با 2 مقایسه میشه که چون از 2 کمتره، در نهایت این شرط 0 میشه. توو زبان C نمیشه به صورت ریاضی نوشت و باید هر شرط رو جدا با && نوشت، یعنی به صورت:
a > 100 && b < 100 && b > 2

بله میدونم تاپیک درس دادن نیست...
برای منم اصلا مهم نیست که چجوری کار میکنه.. من فقط باید برنامه رو run کنم و ازش prntscr بگیرم و به استادم نشون بدم...همین

عزیز من شما هنوز یه برنامه رو هم نمی‌تونید اجرا کنید، چه برسه به اینکه بخواید کد بنویسید. تا آخر لیسانس که قرار نیست run کنید و prntscr بگیرید، باید از جایی شروع کنید یا خیر؟ برید به یه سال بالایی بگید توو کامپایلری که دارید براتون یه برنامه اجرا کنه و چنتا مثال هم براتون اجرا کنه. بعد خودتون شروع کنید مثال‌های کتاب رو تغییر بدید.
 

sungift143

عضو جدید
عزیز من شما هنوز یه برنامه رو هم نمی‌تونید اجرا کنید، چه برسه به اینکه بخواید کد بنویسید. تا آخر لیسانس که قرار نیست run کنید و prntscr بگیرید، باید از جایی شروع کنید یا خیر؟ برید به یه سال بالایی بگید توو کامپایلری که دارید براتون یه برنامه اجرا کنه و چنتا مثال هم براتون اجرا کنه. بعد خودتون شروع کنید مثال‌های کتاب رو تغییر بدید.

درسته باید از ی جا شروع کنم...دارم همین کارم میکنم اما چون تازه کلاس برنامه نویسی مقدماتی که ثبت نام کردم از یکشنبه شروع میشه نمیتونم برنامه های این هفته ام رو ک یکیشون همین برنامه هست ، انجام بدم....

الانم به برنامه نوشتم ولی نمیدونم درسته یا نه...توی همین تاپیکم گذاشتم
 

behnam5670

عضو جدید
کاربر ممتاز
درسته باید از ی جا شروع کنم...دارم همین کارم میکنم اما چون تازه کلاس برنامه نویسی مقدماتی که ثبت نام کردم از یکشنبه شروع میشه نمیتونم برنامه های این هفته ام رو ک یکیشون همین برنامه هست ، انجام بدم....

الانم به برنامه نوشتم ولی نمیدونم درسته یا نه...توی همین تاپیکم گذاشتم

2-3 صفحه قبل، کدی که مقلوب یک عدد رو حساب کنه رو نوشتم، میتونید پیداش کنید. 4 خط هم بیشتر نیست.

توو کدتون اولاً فرض کردید که عدد 5 رقم هست، که میتونه کمتر یا بیشتر باشه و برای بیشتر از 5 رقم کدتون کار نخواهد کرد.
دوماً از نظر منطقی کدتون اشتباه هست. قبل از نوشتن کد حتماً توو یه کاغذ به صورت دستی کاری که میخواید انجام بدید رو چک کنید. شما میدونید که باید رقم یکان و دهگان و صدگان و ... رو جدا کنید. پس باید این کار رو کنید که: برای یکان، باقیمونده به 10 رو حساب و دخیره کنید. برای دهگان، اول رقم سمت راست اون عدد رو حذف کنید. یعنی اگه x = x / 10 بکنید، با توجه به اینکه x از نوع int هست، رقم یکانش حذف میشه و مثلاً 1234 تبدیل میشه به 123. حالا دوباره باقیمونده به 10 بگیرید و به عنوان دهگان ذخیره کنید و این کار را تا جایی که عدد به 0 تبدیل بشه انجام بدید. مثلاً آخر کار عدد 1234 میشه 1 و اگه به 10 تقسیم کنید میشه 0 و میفهمید که به رقم آخر رسیدید. حالا میدونید که عدد 4 رو باید به 10000 ضرب کنید تا جای رقم 1 توو 1234 رو بگیره (قراره مقلوب بشه). مشکلی که هست اینه که شما باید بدونید این عدد 4 رقمی بوده تا بدونید که به 10000 ضرب کنید. برای این کار میتونید اول کار مدام عدد رو به 10 تقسیم کنید و یه متغیر رو دونه دونه زیاد کنید تا تعداد رقم‌ها بدست بیاد.

کدی که من نوشته بودم همچین چیزی بود:
b = 0;
while(a > 0){
b = b * 10;
b += a % 10;
a = a / 10;
}
عدد a = 12345 رو در نظر بگیرید. توو اجرای اول، b میشه 5 و a میشه 1234. توو اجرای دوم، میفهمیم که این عدد هنوز 0 نشده پس بیشتر از یک رقم هست و اون 5 باید ارزشش بیشتر بشه، برای همین b رو به 10 ضرب میکنه میشه 50 و با a%10 یعنی 4 جمع میکنه و b میشه 54، a رو هم میکنه 123. دوباره توو اجرای بعدی میفهمیم که a هنوز 0 نشده پس رقم‌هایی دیگه ای هم در کار هست. پس b رو میکنه 540 و با 3 جمع میکنه میشه 543. بعد از 5 بار اجرا a میشه 0 و دیگه اجرا نمیشه.

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

int n,m,o,y,z,s ;
n=x%10;
y=x%10;
m=y%10;
z=y%10;
o=z%10

توو کد شما اگه x باشه 12345، جفت n و y رو میکنه 5. پس قبل از y باید x رو به 10 تقسیم میکردید تا بتونید رقم دوم رو هم جدا کنید. بعد هم y رو % گرفتید که میشه خودش چون y بین 0 و 9 هست و میشه خودش.
شما بهتر بود اینطوری بنویسید:
a1 = x % 10;
x = x / 10;
a2 = x % 10;
x = x / 10;
x3 = x % 10;
...
اینطوری با 5 بار نوشتن، میتونستید رقم‌های عدد 5 رقمی رو جدا کنید و آخر کار a1 رو به 100000 و a2 رو به 10000 و ...ضرب و با هم جمع کنید. اینطوری برنامه‌تون از نظر منطقی درست بود فقط مشکلش این بود که برای 5 رقم و کمتر کار میکرد. من توو حلقه نوشتم تا نیازی به دونستن تعداد رقم‌ها نباشه چون کار رو تا جایی که عدد به 0 برسه انجام میده و اون ضربدر 10 یا 100 یا 1000 رو توو خود حلقه انجام میده (هر بار به 10 ضرب میکنه، بنابراین اگه 5 رقم باشه، رقم یکان 5 بار به 10 ضرب میشه و جای رقم صدهزارگان رو میگیره، و رقم دهگان 4 بار ضرب میشه (چون یه مرحله دیرتر اومده) و جای رقم ده‌هزارگان رو میگیره و ...)


 

sungift143

عضو جدید
2-3 صفحه قبل، کدی که مقلوب یک عدد رو حساب کنه رو نوشتم، میتونید پیداش کنید. 4 خط هم بیشتر نیست.

توو کدتون اولاً فرض کردید که عدد 5 رقم هست، که میتونه کمتر یا بیشتر باشه و برای بیشتر از 5 رقم کدتون کار نخواهد کرد.
دوماً از نظر منطقی کدتون اشتباه هست. قبل از نوشتن کد حتماً توو یه کاغذ به صورت دستی کاری که میخواید انجام بدید رو چک کنید. شما میدونید که باید رقم یکان و دهگان و صدگان و ... رو جدا کنید. پس باید این کار رو کنید که: برای یکان، باقیمونده به 10 رو حساب و دخیره کنید. برای دهگان، اول رقم سمت راست اون عدد رو حذف کنید. یعنی اگه x = x / 10 بکنید، با توجه به اینکه x از نوع int هست، رقم یکانش حذف میشه و مثلاً 1234 تبدیل میشه به 123. حالا دوباره باقیمونده به 10 بگیرید و به عنوان دهگان ذخیره کنید و این کار را تا جایی که عدد به 0 تبدیل بشه انجام بدید. مثلاً آخر کار عدد 1234 میشه 1 و اگه به 10 تقسیم کنید میشه 0 و میفهمید که به رقم آخر رسیدید. حالا میدونید که عدد 4 رو باید به 10000 ضرب کنید تا جای رقم 1 توو 1234 رو بگیره (قراره مقلوب بشه). مشکلی که هست اینه که شما باید بدونید این عدد 4 رقمی بوده تا بدونید که به 10000 ضرب کنید. برای این کار میتونید اول کار مدام عدد رو به 10 تقسیم کنید و یه متغیر رو دونه دونه زیاد کنید تا تعداد رقم‌ها بدست بیاد.

کدی که من نوشته بودم همچین چیزی بود:
b = 0;
while(a > 0){
b = b * 10;
b += a % 10;
a = a / 10;
}
عدد a = 12345 رو در نظر بگیرید. توو اجرای اول، b میشه 5 و a میشه 1234. توو اجرای دوم، میفهمیم که این عدد هنوز 0 نشده پس بیشتر از یک رقم هست و اون 5 باید ارزشش بیشتر بشه، برای همین b رو به 10 ضرب میکنه میشه 50 و با a%10 یعنی 4 جمع میکنه و b میشه 54، a رو هم میکنه 123. دوباره توو اجرای بعدی میفهمیم که a هنوز 0 نشده پس رقم‌هایی دیگه ای هم در کار هست. پس b رو میکنه 540 و با 3 جمع میکنه میشه 543. بعد از 5 بار اجرا a میشه 0 و دیگه اجرا نمیشه.

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

int n,m,o,y,z,s ;
n=x%10;
y=x%10;
m=y%10;
z=y%10;
o=z%10

توو کد شما اگه x باشه 12345، جفت n و y رو میکنه 5. پس قبل از y باید x رو به 10 تقسیم میکردید تا بتونید رقم دوم رو هم جدا کنید. بعد هم y رو % گرفتید که میشه خودش چون y بین 0 و 9 هست و میشه خودش.
شما بهتر بود اینطوری بنویسید:
a1 = x % 10;
x = x / 10;
a2 = x % 10;
x = x / 10;
x3 = x % 10;
...
اینطوری با 5 بار نوشتن، میتونستید رقم‌های عدد 5 رقمی رو جدا کنید و آخر کار a1 رو به 100000 و a2 رو به 10000 و ...ضرب و با هم جمع کنید. اینطوری برنامه‌تون از نظر منطقی درست بود فقط مشکلش این بود که برای 5 رقم و کمتر کار میکرد. من توو حلقه نوشتم تا نیازی به دونستن تعداد رقم‌ها نباشه چون کار رو تا جایی که عدد به 0 برسه انجام میده و اون ضربدر 10 یا 100 یا 1000 رو توو خود حلقه انجام میده (هر بار به 10 ضرب میکنه، بنابراین اگه 5 رقم باشه، رقم یکان 5 بار به 10 ضرب میشه و جای رقم صدهزارگان رو میگیره، و رقم دهگان 4 بار ضرب میشه (چون یه مرحله دیرتر اومده) و جای رقم ده‌هزارگان رو میگیره و ...)



خب من فقط میخوام عدد 3 رقمی وارد کنم...
من خودم عدد123 رو در نظر گرفتم...
1.عدد 123 رو تقسیم بر 10 کردم...باقیمونده شد 3
2.عدد 12 رو تقسیم بر 10 کردم....باقیمونده شد 2
3.عدد1 رو تقسیم بر 10 کردم که باقیمانده شد 1
اگه عدد اول رو x،عدد دوم 12=y،عدد سوم 1=z، و باقیمونده ها رو به ترتیب n،m،o در نظر بگیرم جوابم 321 درمیاد...
من نفهمیدم کجاش ایراد داره
 

Pure Liveliness

عضو جدید
خب من فقط میخوام عدد 3 رقمی وارد کنم...
من خودم عدد123 رو در نظر گرفتم...
1.عدد 123 رو تقسیم بر 10 کردم...باقیمونده شد 3
2.عدد 12 رو تقسیم بر 10 کردم....باقیمونده شد 2
3.عدد1 رو تقسیم بر 10 کردم که باقیمانده شد 1
اگه عدد اول رو x،عدد دوم 12=y،عدد سوم 1=z، و باقیمونده ها رو به ترتیب n،m،o در نظر بگیرم جوابم 321 درمیاد...
من نفهمیدم کجاش ایراد داره
سلام . ((جسارت نباشه به محضر اساتید.((
همون طور ک داداش بهنام گفتن باید هر عددی هر چند رقمی ک باشه رو بتونه حساب کنه.
من پیشنهاد میکنم این مدل مسائل رو روی کاغذ قدم به قدم پیش برین و بعد بنویسینشون. الگوریتم نویسی هم کمک میکنه.حتما الگوریتمشو بنویسین.چند تا عدد رو (همون طور که آقا بهنام گفتن) دونه دونه روی کاغذ امتحان کنین مرتب و با توجه به فرایندی که روش انجام میشه برنامشو بنویسین.
 

behnam5670

عضو جدید
کاربر ممتاز
خب من فقط میخوام عدد 3 رقمی وارد کنم...
من خودم عدد123 رو در نظر گرفتم...
1.عدد 123 رو تقسیم بر 10 کردم...باقیمونده شد 3
2.عدد 12 رو تقسیم بر 10 کردم....باقیمونده شد 2
3.عدد1 رو تقسیم بر 10 کردم که باقیمانده شد 1
اگه عدد اول رو x،عدد دوم 12=y،عدد سوم 1=z، و باقیمونده ها رو به ترتیب n،m،o در نظر بگیرم جوابم 321 درمیاد...
من نفهمیدم کجاش ایراد داره

شما نوشتید:


int n,m,o,y,z,s ;
n=x%10;
y=x%10;
m=y%10;
z=y%10;
o=z%10


برای عدد 123، اول 3 رو میریزه توو n، بعد دوباره 3 رو میریزه توو y (چون x هیچ تغییری نکرده). الان y%10 میشه 3 (چون y برابر با 3 هست) پس m و z هم 3 میشه. آخرش هم O میشه 3. یعنی فقط شما رقم 3 رو تونستید جدا کنید و این وسط باید x رو به 10 تقسیم میکردید که نکردید. باید اینطوری کنید:
n = x % 10; (n = 3)
x = x/10; (x = 12)
m = x % 10; (m = 2)
x = x/10; (x = 1)
m = x % 10; (m = 1)
 

sungift143

عضو جدید
شما نوشتید:


int n,m,o,y,z,s ;

n=x%10;

y=x%10;

m=y%10;

z=y%10;

o=z%10



برای عدد 123، اول 3 رو میریزه توو n، بعد دوباره 3 رو میریزه توو y (چون x هیچ تغییری نکرده). الان y%10 میشه 3 (چون y برابر با 3 هست) پس m و z هم 3 میشه. آخرش هم O میشه 3. یعنی فقط شما رقم 3 رو تونستید جدا کنید و این وسط باید x رو به 10 تقسیم میکردید که نکردید. باید اینطوری کنید:
n = x % 10; (n = 3)
x = x/10; (x = 12)
m = x % 10; (m = 2)
x = x/10; (x = 1)
m = x % 10; (m = 1)

مرسی اقا بهنام..پس فقط همین قسمتش اشتباه بود؟؟؟
 

sungift143

عضو جدید
سلام . ((جسارت نباشه به محضر اساتید.((
همون طور ک داداش بهنام گفتن باید هر عددی هر چند رقمی ک باشه رو بتونه حساب کنه.
من پیشنهاد میکنم این مدل مسائل رو روی کاغذ قدم به قدم پیش برین و بعد بنویسینشون. الگوریتم نویسی هم کمک میکنه.حتما الگوریتمشو بنویسین.چند تا عدد رو (همون طور که آقا بهنام گفتن) دونه دونه روی کاغذ امتحان کنین مرتب و با توجه به فرایندی که روش انجام میشه برنامشو بنویسین.


میدونم اگه بگم استاد گرامی بهمون اولش یاد نداده الگوریتم چجوری بنویسیم،میگین خودم تنبلی کردم....اینا حرفه..
ولی چشم سعی میکنم یاد بگیرم و برم دوباره کتاب کار با رایانه سوم دبیرستانمو پیدا کنم و ببینم...
 

Pure Liveliness

عضو جدید
میدونم اگه بگم استاد گرامی بهمون اولش یاد نداده الگوریتم چجوری بنویسیم،میگین خودم تنبلی کردم....اینا حرفه..
ولی چشم سعی میکنم یاد بگیرم و برم دوباره کتاب کار با رایانه سوم دبیرستانمو پیدا کنم و ببینم...

خب هر استادی یه روشی داره. حالام دیر نشده.اگه از الان زیاد وقت بذارین خودتونو میرسونین تا آخر ترم.
خب الگوریتم نویسی واسه برنامه های ساده و متوسط خیلی سخت نیست فقط یکی دو بار ک بنویسین راه میفتین.
حالا هم الگوریتم هم نوشتن مراحل توو کاغذ کلا خوبه. به نظرم واسه راه افتادن توو برنامه نویسی کلا همه ی کد ها رو اول روی کاغذ بنویسین و تجزیه و تحلیل بکنین هر خطو خیلی کمکتون میکنه.
موفق باشین دوست عزیز.:gol:
 

sungift143

عضو جدید
خب هر استادی یه روشی داره. حالام دیر نشده.اگه از الان زیاد وقت بذارین خودتونو میرسونین تا آخر ترم.
خب الگوریتم نویسی واسه برنامه های ساده و متوسط خیلی سخت نیست فقط یکی دو بار ک بنویسین راه میفتین.
حالا هم الگوریتم هم نوشتن مراحل توو کاغذ کلا خوبه. به نظرم واسه راه افتادن توو برنامه نویسی کلا همه ی کد ها رو اول روی کاغذ بنویسین و تجزیه و تحلیل بکنین هر خطو خیلی کمکتون میکنه.
موفق باشین دوست عزیز.:gol:

مشکل من اینم هست که تا الان یه چیزایی رو فقط حفظ کردم...اینم الان داره اذیتم میکنه....
 

nima2252

عضو جدید
سلام دوستان میخوام از کجا باید copiler c++ borland رو دانلود کنم از دیشب هر کاری کردم نشد
 

Similar threads

بالا