# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C >  کار با اشاره گرها .

## delphi_stu

با سلام .
دوستان ممنون میشم در حل این مشکل راهنماییم کنند:
برنامه ای می خوام که عدد صحیحی (رشته نباشد) رو بگیره و به صورت حروفی چاپ کنه .
مثلا : 4561  خروجی : chahar hezaro pansado shasto yek
- به جای عدد صحیح ، عدد اعشاری چگونه استفاده کنم ؟ (مثلا تا 3 رقم اعشار) 1272.1234   خروجی : davazda hezaro haftado do .sado bisto se hezrom
من خودم برای اعداد 3 رقمی نوشتم اما بیشترش چکار کنم ؟ 
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

void ascii2text(char* t, char* s);

int main(){

	const int n=40;
	char a, s[n+1]="", t[n+1]="";
	int i, x, y;
	gets(s);
	ascii2text(s,t);
	puts(t);
	return(0);
	}

void ascii2text(char* s, char* t){//s : ascii input string, t :output string
	char *dig1[]={
		"",
		"one ",
		"two ",
		"three ",
		"four ",
		"five ",
		"six ",
		"seven ",
		"eight ",
		"nine "
		};
	char *dig21[]={
		"eleven ",
		"twelve ",
		"thirteen ",
		"fourteen ",
		"fifteen ",
		"sixteen ",
		"seventeen ",
		"eighteen ",
		"nineteen "
		};
	char *dig2[]={
		"",
		"ten ",
		"twenty ",
		"thirty ",
		"fourty ",
		"fifty ",
		"sixty ",
		"seventy ",
		"eighty ",
		"ninety "
		};
	char hundred[]="hundred ";
	char error[]="not suitable for more than 3 digits";
	char z[10]="0000000";
	int i=0,j=0,k=0;

	while(s[k++]);
	k=(3-(k-1)%3)%3;
	while(z[k+j]=s[j])j++;

	k=0;
	j=0;
	while(t[j++]=dig1[z[i]-48][k++]);
	j--;
		if(z[i]-48){
		k=0;
		while(t[j++]=hundred[k++]);
		j--;
		}
	i++;
	k=0;
	if(z[i]-48==1 && z[i+1]-48!=0){
		i++;
		while(t[j++]=dig21[z[i]-48-1][k++]);
		}
	else{
		while(t[j++]=dig2[z[i]-48][k++]);
		j--;
		i++;
		k=0;
		while(t[j++]=dig1[z[i]-48][k++]);
		}
	}

----------


## delphi_stu

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

----------


## delphi_stu

کسی نیست کمکم کنه ؟

----------


## mamadgmail

من کد برنامه شما رو ندیدم ولی شما باید یک اشاره گر از نوع char تعریف کنید بعد عددتون رو بخونید. حالا باید طول عدد رو داشته باشید که این کار رو هم با تقسیم بر 10 می تونید انجام بدید.
خوب حالا شما بگید دقیقا مشکلتون کجاست!؟

----------


## Amir Oveisi

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

----------


## delphi_stu

ممنون دوستان
اما عددی که باید گرفته شود باید از نوع int باشه (صحیح)

----------


## delphi_stu

اگه در برنامه بالا فقط به جای 3 رقم - 4 رقم رو بخوام بگیره چکار باید بکنم . میشه راهنمایی کنید

----------


## hercules_3d

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

----------


## delphi_stu

دوستان ممنون میشم کمکم کنید
یک نمونه برنامه می خوام که بتواند اطلاعات انباری را دریافت نموده و در آرایه‌ای از ساختمانها (structها) قرار دهدو در صورت امکان قابلیت جستجو داشته باشه .
 اطلاعات انبار : نام قطعه، وزن قطعه، قیمت خرید قطعه

----------


## Amir Oveisi

یعنی تقلب؟؟؟ وای وای وای !!!

----------


## delphi_stu

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

من این برنامه رو نوشتم اما وقتی میخوام نام قطعه رو که میگیره با قطعات داخل آرایه مقایسه کنم مشکل دارم دوستان ممنون میشم راهنماییم کنن.
برای قسمت جستجو به لطف شما نیاز دارم.
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

struct anbar{
char kala[50];
int vazn;
int ghymat;
} ex[100];

void enter(int n);

int main(){
char c[50];
int v,n,i=0;
vorod:
cout <<"1- search"<<endl;
cout <<"2- New"<<endl;
cout <<"Enter Number :  ";
cin >> v;
if (v==1)
{
cout <<"Name kala ro vared koned:  ";
cin >> c;

}
else
{
if (v==2)
cout <<"tedade kala ro vared koneed :  ";
cin >>n;
enter(n);
goto vorod;
}
if ((v!=1) && (v!=2))
{
cout <<"shomare gozina ro vared koneed!!!"<<endl;
goto vorod;}
return(0);
}
void enter(int n){
int i=0;
while (i<n){
cin >> ex[i].kala>> ex[i].vazn>> ex[i].ghymat;
i++;}
}

----------


## Amir Oveisi

برای مقایسه نام از چی استفاده کردی مگه ؟؟ اگه از strcpm استفاده کنی نباید مشکلی داشته باشه

اگه از strcmp استفاده کنی نباید مشکلی داشته باشه. در ضمن سعی کن برنامتو جوری بنویسی که از goto استفاده نکنی!

----------


## delphi_stu

ممنون از راهنمایییت . ولی میشه از strcmp استفاده نکنم ؟
راه دیگه ای نیست ؟

----------


## Amir Oveisi

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

----------


## delphi_stu

ممنون دوست عزیز . با همون strcmp نوشتم.

یک سوال دیگه داشتم اگه میشه کمکم کن
عناصر داخل آرایه در اجرای بعد برنامه از بین میره ، چکار کنم از بین نره؟

----------


## siahacker

سلام
می تونی عناصر آرایه رو در یک فایل ذخیره کنی
و در هنگام اجرای برنامه در زمان بعد این فایل رو باز کنی و بخونی و در آرایه مورد نظرت بذاری

----------


## Amir Oveisi

دقیقا راحت ترین روش!

----------


## Amir Oveisi

اینم مثال واسه فایل ( قسمت save و read رو بخون )

----------


## delphi_stu

این برنامه ایست که نوشتم 
اما یک مشکل داره اینه که 
داده ها وقتی در فایل ذخیره میشن . باید بعد از داده های قبلی ذخیره بشن . اما اینطور نیست چکار باید بکنم ؟(نیاز فوری)
#include <stdio.h>
#include <cstring.h>
#include <conio.h>
#include <iostream.h>
#define  size 100

struct kala{
char name[50];
int vazn,gh;
} ex [size] ;

void jadid (int z);
void jostejo(char name[20]);
void load ();
main()
{
char price,na[20];
int i,j,z=0;
FILE *f;
load();
vorodi:
clrscr();
cout <<"New Recorde [1] :::"<<" [ search [2] ]"<<endl;
cin >> j;
switch (j){
case 1 :
z++;
jadid(z);
goto vorodi;
case 2 :
clrscr();
cout <<"name of material :  ";
cin >> na;
jostejo(na);
default:
goto vorodi;
}
return(0);
}

void jadid (int z){
register int i=0;
char ch,num[20];
FILE *f;
f=fopen("kala.dat","wt");
clrscr();
while (1)
{
cout <<"material: " ;
cin >> ex[i].name;
cout <<"w: " ;
cin >> num ;
ex[i].vazn=atoi(num);
cout <<"price : " ;
cin >> num;
ex[i].gh=atoi(num);
if(*ex[i].name)
fwrite(&ex[i],sizeof(struct kala),1,f);
i++;
if ((ch=getche())== '+')
break;
}
}

void jostejo(char name[20]){
char ch;
register int i=0;
register int y=0;
load();
clrscr();
while(i<size)
{
if (strcmp(ex[i].name,name)==0)
{
cout<<ex[i].vazn<<"   "<<ex[i].gh ;
y=1;
break;
}
else
y=0;
i++;
}
if (y==0)
cout << "can not find material " ;
getch();
}


void load (){
FILE *f;
register int i;
f=fopen("kala.dat","rt");
if(f==NULL)
{
cout <<"\n cannot open file";
cout <<"\n press a key... ";
getch ();
return ;
}
else
{
while (feof(f))
fread(&ex[i],sizeof(struct kala),1,f);
}
}

----------


## Amir Oveisi

من دقیق متوجه منظورت نشدم ! میشه واضح تر؟

----------


## delphi_stu

منظورم اینه که وقتی جستجو میکنم کالا رو پیدا میکنه اگر قیمتشو یا وزنشو بالای 5 رقم وارد کرده باشم خروجی اشتباه میده بیرون .
از طرفی هر چی کالا اضافه میشه باید در فایل ذخیره شه . یعنی هر بار که میخواد کالا وارد شه اول بره آخر فایل بعد ذخیره کنه.
میشه راهنمایی کنید

----------

