PDA

View Full Version : نوع داده رو چی باید بزارم



hhoura2006
پنج شنبه 14 دی 1385, 17:37 عصر
سلام دوستان
خواهش می کنم اگه می تونید هر چه زودتر کمک کنید چون کارم خیلی خیلی گیره :گریه:

من یه برنامه به عنوان پروژه نوشتم که باید یه عدد حداکثر 12 رقمی رو بگیره و به صورت حروفی چاپ کنه( فعلاً تا 60 هزار درست کار می کنه)
مشکل من اینجاست وقتی عددم بزرگتر از 60 هزار که می شه برنامه خروجی نمی ده (یعنی یه عدد اشتباه می ده) و فکر می کنم به خاطر نوع عددم ( عدد رو از نوع unsigned int تعریف کردم) وقتی عدد رو از نوع unsigned long int تعریف می کنم که بازه ی بزرگتری داره تمام برنامه به هم می ریزه و هیچ عددی رو به عنوان خروجی نمی ده:عصبانی++:
البته همونطوری که می دونید حتی unsigned long int هم تا 12 رقم رو نمی تونه تحت پوشش قرار بده شما چیز بزرگتری سراغ دارید
حال من چی کار کنم:افسرده:
البته اگه به نظر شما مشکل از جای دیگه ست خواهش می کنم کمک کنید.

someCoder
پنج شنبه 14 دی 1385, 18:30 عصر
__int64
Microsoft Specifications (http://msdn2.microsoft.com/en-us/library/29dh1w7z.aspx)

البته اگر Visual C استفاده میکنی

hhoura2006
پنج شنبه 14 دی 1385, 21:10 عصر
نه دوست عزیز من با ++c کار می کنم من توی help ، سی رو هم که نگاه کردم چیز به درد بخوری پیدا نکردم به هر حال مرسی که کمک کردید و اگه فکر دیگه ای به نظرتون می رسه دریغ نکنید.

someCoder
پنج شنبه 14 دی 1385, 21:39 عصر
نه دوست عزیز من با ++c کار می کنم من توی help ، سی رو هم که نگاه کردم چیز به درد بخوری پیدا نکردم به هر حال مرسی که کمک کردید و اگه فکر دیگه ای به نظرتون می رسه دریغ نکنید.

فکر میکنم منظورتون از ++C یه چیزی مثل TC باشه، چون VC هم جزو خانواده ++C هست.
حالا اگر زبان مورد نظرتون از اعداد 64 بیتی پشتیبانی نمیکنه، چرا بجای int عدد رو توی یه رشته نمیخونید؟

hhoura2006
جمعه 15 دی 1385, 17:21 عصر
بازم تشکراز کمکتون
به نظر عملی می یاد فعلاً امتحانش می کنم ببینم چه طور می شه
اگه درست نشد می شه ایمیلتونو بدید تا برنامه رو براتون بفرستم یه نگاهی بکنید یا براتون پیغام بزنم؟

someCoder
جمعه 15 دی 1385, 18:44 عصر
دوست عزیز، فکر کنم اگر مشکلاتتو در همین پست مطرح کنی، بهتر جواب میگیری.

معمولا پرسش و پاسخ سوالات فنی در سایت بصورت عمومی انجام میشود و پرسشهای فنی در ایمیل و یا PM جواب داده نمیشوند.

موفق باشی

mzjahromi
شنبه 16 دی 1385, 12:54 عصر
نوع داده ای Double هم تا حدود 17 رقم رو پشتیبانی میکنه و همه جا وجود داره

hhoura2006
شنبه 16 دی 1385, 14:54 عصر
فکر میکنم منظورتون از ++C یه چیزی مثل TC باشه، چون VC هم جزو خانواده ++C هست.
حالا اگر زبان مورد نظرتون از اعداد 64 بیتی پشتیبانی نمیکنه، چرا بجای int عدد رو توی یه رشته نمیخونید؟
من پیاده کردن عدد توی رشته رو هم امتحان کردم ولی بازم نشد

hhoura2006
شنبه 16 دی 1385, 14:57 عصر
نوع داده ای Double هم تا حدود 17 رقم رو پشتیبانی میکنه و همه جا وجود داره
اعداد من از نوع صحیح هستن مگه می شه از Double استفاده کرد.
تازه یادم اومد منDouble رو هم امتحان کردم ولی فایده ای نداشت

mzjahromi
شنبه 16 دی 1385, 14:58 عصر
مشکلی نداره
میشه از Double استفاده کرد
بهتره قطعه کدی که باهاش مشکل دارید رو بذارید اینجا

hhoura2006
یک شنبه 17 دی 1385, 09:14 صبح
من تیکه کدی رو که نمی ذاره عدد از 60000 به بالا بره رو می ذارم این کد عددهای بزرگتر از 10000 تا 60000 رو حساب می کنه (البته خورده ای های عدد های20 هزار تا 60 هزار رو هم هنوز نتونستم طراحی کنم مثلاً 250000 یا 41256 رو نمی تونه حساب کنه ولی اگه خود عدد های 20 هزار تا 60 هزارو بدید براتون به صورت حروفی چاپ می کنه)

#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<string.h>
void main(void)
{
void convert(unsigned int ,unsigned char *);
unsigned char result[150]="\0";
int number;
clrscr();
printf("enter number to convert to text:\0");
scanf("%u",&number);
convert(number,result);
printf("number in alphabet:%s\n\0",result);
getche();
}
//************************************************** ****
void convert(unsigned int number, unsigned char *output)
{

unsigned char a_1_10[9][10]={" one \0","two\0 "," three\0 "," four \0 "," five\0 ",
"six\0","seven\0","eight\0","nine\0"
};
unsigned char a_10_19[10][10]={ "ten\0","eleven\0","twelve\0","thirteen\0",
"fourteen\0","fifteen\0","sixteen\0","seventeen\0","eightteen\0","nineteen\0"
};
unsigned char a_20_90[8][10]={"twenty\0","thirty\0","fourty\0","fifty\0",
"sixty\0","seventy\0","eighty\0","ninety\0"
};
unsigned char a_100_1000[2][10]={"hundred\0","thousand\0"
};


if (number>=10000 ) {
if((number/1000)<=19) {
strcpy(output,a_10_19[number/1000-10]);
strcat(output," \0");
strcat(output,a_100_1000[1]);
strcat(output," \0");
number-=(number/1000)*1000;}

if((number/1000)>=20){
if((number/1000!=0)){
strcpy(output,a_20_90[(number/10000)-2]);
strcat(output," \0");
strcat(output,a_100_1000[1]);
strcat(output," \0");
number-=(number/1000)*1000; } } } }

mzjahromi
یک شنبه 17 دی 1385, 10:43 صبح
می شه اون خطی که تبدیل میکنی به Long و باز هم تغییری نمی کنه رو های لایت کنی

hhoura2006
یک شنبه 17 دی 1385, 18:11 عصر
چه طور مگه؟ با تغییراتی که شما ایجاد کردید درست شد؟‏
در ضمن وقتی من ‏long‏ قرار می دم خروجی می ده ولی یه سری علامت چاپ می کنه که ربطی به عدد ‏داده شده ندارن.حتی عددهای کوچکتری رو که قبلاً درست چاپ می کرد رو هم به صورتی که گفتم چاپ می ‏کنه.‏
‏ شایدم درست این کارو انجام نمی دم اگه برنامه ی شما درست شده می شه کمک کنید.‏
‏ ‏
‏ گفته بودید که مشخص کنم کجای برنامه گیر داره:‏
‏ شما اگه ‏F7‎‏ رو بزنید برنامه خط به خط جلو می ره وقتی عدد 70000 رو بدید وارد اولین ‏if‏ که می شه با ‏این که شرط صدق می کنه از ‏if‏ دوم و سوم هم رد می شه و برنامه رو که مربوط به سایر اعداد هست( ‏اعداد سه رقمی و دو رقمی و یک رقمی ) ادامه می ده و یه عدد اشتباه رو به عنوان خروجی می ده.
در ضمن از اینکه پیگیر مشکل برنامه ی من هستید خیلی ممنونم ‏

mzjahromi
یک شنبه 17 دی 1385, 22:03 عصر
من برنامه شما رو اجرا نکردم دارم بررسی اش می کنم

می شه اون خطی که تبدیل میکنی به Long و باز هم تغییری نمی کنه رو های لایت کنی

hhoura2006
دوشنبه 18 دی 1385, 11:11 صبح
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<string.h>
void main(void)
{
void convert(unsigned int ,unsigned char *);
unsigned char result[150]="\0";
int number;
clrscr();
printf("enter number to convert to text:\0");
scanf("%u",&number);
convert(number,result);
printf("number in alphabet:%s\n\0",result);
getche();
}
//************************************************** ****
void convert(unsigned int number, unsigned char *output)
{

unsigned char a_1_10[9][10]={" one \0","two\0 "," three\0 "," four \0 "," five\0 ",
"six\0","seven\0","eight\0","nine\0"
};
unsigned char a_10_19[10][10]={ "ten\0","eleven\0","twelve\0","thirteen\0",
"fourteen\0","fifteen\0","sixteen\0","seventeen\0","eightteen\0","nineteen\0"
};
unsigned char a_20_90[8][10]={"twenty\0","thirty\0","fourty\0","fifty\0",
"sixty\0","seventy\0","eighty\0","ninety\0"
};
unsigned char a_100_1000[2][10]={"hundred\0","thousand\0"
};


if (number>=10000 ) {
if((number/1000)<=19) {
strcpy(output,a_10_19[number/1000-10]);
strcat(output," \0");
strcat(output,a_100_1000[1]);
strcat(output," \0");
number-=(number/1000)*1000;}

if((number/1000)>=20){
if((number/1000!=0)){
strcpy(output,a_20_90[(number/10000)-2]);
strcat(output," \0");
strcat(output,a_100_1000[1]);
strcat(output," \0");
number-=(number/1000)*1000; } } } }



برنامه خروجی میده ولی همش به هم می ریزه

hhoura2006
چهارشنبه 20 دی 1385, 12:58 عصر
خواهش می کنم کمک کنید چون من منبع دیگه ای برای حل مشکلات برنامه نویسیم ندارم

hhoura2006
چهارشنبه 20 دی 1385, 23:31 عصر
یعنی هیچ کس نیست بتونه جوابمو بده

mzjahromi
پنج شنبه 21 دی 1385, 06:45 صبح
ببین
من یه درخواست کردم ولی تو هنوز جواب ندادی تا بگم مشکلت کجاست. متاسفانه از امروز هم من حدود 15 روز نیستم

hhoura2006
پنج شنبه 21 دی 1385, 13:45 عصر
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<string.h>
void main(void)
{
void convert(unsigned int ,unsigned char *);
unsigned char result[150]="\0";
int number;
clrscr();
printf("enter number to convert to text:\0");
scanf("%u",&number);
convert(number,result);
printf("number in alphabet:%s\n\0",result);
getche();
}
//************************************************** ****
void convert(unsigned int number, unsigned char *output)
{

unsigned char a_1_10[9][10]={" one \0","two\0 "," three\0 "," four \0 "," five\0 ",
"six\0","seven\0","eight\0","nine\0"
};
unsigned char a_10_19[10][10]={ "ten\0","eleven\0","twelve\0","thirteen\0",
"fourteen\0","fifteen\0","sixteen\0","seventeen\0","eightteen\0","nineteen\0"
};
unsigned char a_20_90[8][10]={"twenty\0","thirty\0","fourty\0","fifty\0",
"sixty\0","seventy\0","eighty\0","ninety\0"
};
unsigned char a_100_1000[2][10]={"hundred\0","thousand\0"
};


if (number>=10000 ) {
if((number/1000)<=19) {
strcpy(output,a_10_19[number/1000-10]);
strcat(output," \0");
strcat(output,a_100_1000[1]);
strcat(output," \0");
number-=(number/1000)*1000;}

if((number/1000)>=20){
if((number/1000!=0)){
strcpy(output,a_20_90[(number/10000)-2]);
strcat(output," \0");
strcat(output,a_100_1000[1]);
strcat(output," \0");
number-=(number/1000)*1000; } } } }


ببینید من اون خطی که نمی ذاره برنامه جلو برو رو قبلاً قرمز کرده بودم ولی مثل اینکه منظور شما چیز دیگه ای بوده:خجالت: :متفکر:
با این حال من دو خطی رو که باید از اونجا مقدار متغییر رو عوض می کردم رو بازم رنگی کردم امیدوارم هنوز دیر نشده باشه چون این جور که من می بینم هیچ کسی به جزء شما نیست که جوابمو بده
البته استادم وقت تحویل پروژه رو تمدید کرده اگه تونستید امروز واگه نشد وقتی که برگشتید ممکنه جواب بدید
بازم خیلی خیلی ممنونم که تا اینجا کمک کردید

someCoder
پنج شنبه 21 دی 1385, 15:37 عصر
سلام دوست عزیز،

اول از همه واقعا بهت تبریک میگم که با این پشتکار دنبال یاد گرفتنی. تو این دوره زمونه کم کسی پیدا میشه که خودش دنبال نوشتن پروژه هاش باشه!

برنامه شما رو خوندم و با اجازتون یکمی تغییرات در دندانه هاش و ... دادم که خوانا تر بشه. ظاهرا تازه کاری، بنابراین سعی کن از اول کدهاتو استاندارد بنویسی تا عادت کنی. البته این استاندارد یه چیز ثابت نیست اما من خودم استانداردهای کد نویسی کرنل لینوکس (http://pantransit.reptiles.org/prog/CodingStyle.html) رو خیلی میپسندم.

به هر حال، بریم سر اصل مطلب. مشکل برنامه شما این بود که در کامپایلر 16 بیتی، نوع int هم 16 بیتی هست و بنابراین حداکثر عدد 32767 جا میشه که اگر اونجوری که تو unsigned در نظر گرفتی استفاده کنی، توش تا 65535 جا میشه. پس اصلا عدد 70000 توش جا نمیشده. من تغییری که در کدت دادم این بود که نوع رو به long int تبدیل کردم که حالا تا 2147483647 توش جا میشه (32 بیتی میشه).
ضمنا اگر با استفاده از watch، متغیر هاتو کنترل میکردی، فکر میکنم خودتم راحت به همین نتیجه میرسیدی.

راستی یه نکته دیگه هم هست. چرا رشته ها رو به شکل مثلا "nine\0" تعریف کردی؟ اگر فقط "nine" رو بنویسی، خودش آخرش علامت آخر رشته رو میذاره و تو فقط باعث میشی که دوبار علامت '\0' آخر رشته ایجاد بشه که لزومی به این کار نیست.

حالا که این مشکل حل شد، برو بقیه کدت رو درست کن.

ضمنا کدی که من برای خودم تغییرش دادم اینه:

#include<stdio.h>
//#include<math.h>
#include<conio.h>
#include<string.h>

void convert(long int ,unsigned char *);

void main(void)
{
unsigned char result[150]="\0";
long int number;
clrscr();
printf("enter number to convert to text:\0");
scanf("%ld",&number);
convert(number,result);
printf("number in alphabet:%s\n\0",result);
getche();
}
//************************************************** ****
void convert(long int number, unsigned char *output)
{
unsigned char a_1_10[9][10]={" one \0","two\0 "," three\0 "," four \0 "," five\0 ",
"six\0","seven\0","eight\0","nine\0"};
unsigned char a_10_19[10][10]={ "ten\0","eleven\0","twelve\0","thirteen\0",
"fourteen\0","fifteen\0","sixteen\0","seventeen\0","eightteen\0","nineteen\0"};
unsigned char a_20_90[8][10]={"twenty\0","thirty\0","fourty\0","fifty\0",
"sixty\0","seventy\0","eighty\0","ninety\0"};
unsigned char a_100_1000[2][10]={"hundred\0","thousand\0"};

if (number>=10000 ) {
if((number/1000)<=19) {
strcpy(output,a_10_19[number/1000-10]);
strcat(output," \0");
strcat(output,a_100_1000[1]);
strcat(output," \0");
number-=(number/1000)*1000;
}

if((number/1000)>=20){
if((number/1000!=0)){
strcpy(output,a_20_90[(number/10000)-2]);
strcat(output," \0");
strcat(output,a_100_1000[1]);
strcat(output," \0");
number-=(number/1000)*1000;
}
}
}
}

hhoura2006
یک شنبه 24 دی 1385, 00:01 صبح
somecoder عزیز نمیدونم چه جوری ازتون تشکر کنم خیلی خیلی ممنونم فعلاً می رم جلو تا بقیه ی کدم رو تکمیل کنم .

hhoura2006
جمعه 29 دی 1385, 14:09 عصر
من فعلاً مشغول امتحان های دیگه ای هستم ولی با این حال این فکر به نظرم رسید که اگه من تا عدد 10 رقمی هم بتونم برنامه رو پیش ببرم (چون همونطوری که می دونید unsigned long int تا 10 رقم رو می تونه پوشش بده) 12 رقم رو چی کار باید بکنم؟

someCoder
پنج شنبه 05 بهمن 1385, 00:00 صبح
12 رقم درست شد، 20 رقم رو چه کار میکنی؟ ;)
اگر میخوای محدودیت نداشته باشی، باید نوع داده جدید با استفاده از انواع داده موجود خودت تعریف کنی. مثلا یه راه ساده اینه که همونطور که قبلا هم گفتم، عدد ها رو به صورت رشته پیاده سازی کنی.

Navid7h
پنج شنبه 05 بهمن 1385, 01:17 صبح
من یه همچین کدی برای تبدیل عدد به حروف فارسی نوشتم.
البته به C#

اما به نظر من بهتره از 2 تابع استفاده کنی که هر دوشون بازگشتی هستن !

اولی 3 تا 3 تا جدا میکنه و دومی به حروفش رو بر میگردونه .

فکر کنم یکم کد رو refactor کنی بهتر میشه

موفق باشی

hhoura2006
یک شنبه 08 بهمن 1385, 21:55 عصر
12 رقم درست شد، 20 رقم رو چه کار میکنی؟ ;)
اگر میخوای محدودیت نداشته باشی، باید نوع داده جدید با استفاده از انواع داده موجود خودت تعریف کنی. مثلا یه راه ساده اینه که همونطور که قبلا هم گفتم، عدد ها رو به صورت رشته پیاده سازی کنی.

برنامه رو تموم کردم ولی همونطوری که گفتم تا 4 میلیارد جواب می ده و من می خوام که عدد 12 رقمی رو حساب کنه .
من بنا به گفته ی شما می خوام این کارو بکنم ولی هر کاری می کنم نمی شه یعنی بلد نیستم
البته سعی کردم برای مثال تابعی دارم که عدد رو به صورت رشته می خونه و به عدد تبدیل می کنه ولی با این تابع هم نتونستم کاری بکنم حالا باید چی کار کنم؟؟؟

hhoura2006
یک شنبه 08 بهمن 1385, 22:02 عصر
من یه همچین کدی برای تبدیل عدد به حروف فارسی نوشتم.
البته به C#

اما به نظر من بهتره از 2 تابع استفاده کنی که هر دوشون بازگشتی هستن !

اولی 3 تا 3 تا جدا میکنه و دومی به حروفش رو بر میگردونه .

فکر کنم یکم کد رو refactor کنی بهتر میشه

موفق باشی
ممنون از توجه تون
این راهی رو که گفتید از یه نفر دیگه هم شنیدم منظورم 3 تا 3تا جدا کردنه ولی درست مفهومشو نفهمیدم بعلاوه فکر می کنم اگه بخوام از روش شما پیش برم باید برنامه رو از سر شروع کنم چون به من گفتن که این تنها راه حله:افسرده:

someCoder
یک شنبه 08 بهمن 1385, 22:12 عصر
برنامه رو تموم کردم ولی همونطوری که گفتم تا 4 میلیارد جواب می ده و من می خوام که عدد 12 رقمی رو حساب کنه .
من بنا به گفته ی شما می خوام این کارو بکنم ولی هر کاری می کنم نمی شه یعنی بلد نیستم
البته سعی کردم برای مثال تابعی دارم که عدد رو به صورت رشته می خونه و به عدد تبدیل می کنه ولی با این تابع هم نتونستم کاری بکنم حالا باید چی کار کنم؟؟؟

اصلا از اول نباید تو عددی بگیری که بخوای تبدیلش کنی. از اول رشته بگیر.

hhoura2006
دوشنبه 09 بهمن 1385, 12:53 عصر
اصلا از اول نباید تو عددی بگیری که بخوای تبدیلش کنی. از اول رشته بگیر.

پس با این وضع یه جورایی باید از اول شروع کنم ولی من همش تا شنبه مهلت دارم .
می شه یه مثال بزنید شاید بتونم با مثال شما برای عددهای بزرگتر تعمیم بدم.