A. c語言實驗報告心得
c語言實驗心得:
1、只有頻繁用到或對運算速度要求很高的變數才放到data區內,如for循環中的計數值。
2、其他不頻繁調用到和對運算速度要求不高的變數都放到xdata區。
3、常量放到code區,如字型檔、修正系數。
4、邏輯標志變數可以定義到bdata中。
在51系列晶元中有16個位元組位定址區bdata,其中可以定義8*16=128個邏輯變數。這樣可以大大降低內存佔用空間。定義方法是: bdata bit LedState;但位類型不能用在數組和結構體中。
5、data區內最好放局部變數。
因為局部變數的空間是可以覆蓋的(某個函數的局部變數空間在退出該函數是就釋放,由別的函數的局部變數覆蓋),可以提高內存利用率。當然靜態局部變數除外,其內存使用方式與全局變數相同;
6、確保程序中沒有未調用的函數。
在Keil C里遇到未調用函數,編譯器就將其認為可能是中斷函數。函數里用的局部變數的空間是不釋放,也就是同全局變數一樣處理。這一點Keil做得很愚蠢,但也沒辦法。
7、如果想節省data空間就必須用large模式。
將未定義內存位置的變數全放到xdata區。當然最好對所有變數都要指定內存類型。
8、使用指針時,要指定指針指向的內存類型。
在C51中未定義指向內存類型的通用指針佔用3個位元組;而指定指向data區的指針只佔1個位元組;指定指向xdata區的指針佔2個位元組。如指針p是指向data區,則應定義為: char data *p;。還可指定指針本身的存放內存類型,如:char data * xdata p;。其含義是指針p指向data區變數,而其本身存放在xdata區。
以前沒搞過C51,大學時代跟單片機老師的時候也是搗鼓下匯編,現在重新搞單片機,因為手頭資料不多,找到一些C51的程序,發現裡面有這些關鍵字,不甚明了,沒辦法只好找了下,發現如下描述:
從數據存儲類型來說,8051系列有片內、片外程序存儲器,片內、片外數據存儲器,片內程序存儲器還分直接定址區和間接定址類型,分別對應code、data、xdata、idata以及根據51系列特點而設定的pdata類型,使用不同的存儲器,將使程序執行效率不同,在編寫C51程序時,最好指定變數的存儲類型,這樣將有利於提高程序執行效率(此問題將在後面專門講述)。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對應不同的實際硬體系統,也將有不同的編譯結果。
在51系列中data,idata,xdata,pdata的區別
data:固定指前面0x00-0x7f的128個RAM,可以用acc直接讀寫的,速度最快,生成的代碼也最小。
idata:固定指前面0x00-0xff的256個RAM,其中前128和data的128完全相同,只是因為訪問的方式不同。idata是用類似C中的指針方式訪問的。匯編中的語句為:mox ACC,@Rx.(不重要的補充:c中idata做指針式的訪問效果很好)
xdata:外部擴展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。
pdata:外部擴展RAM的低256個位元組,地址出現在A0-A7的上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,而且C51好象有對此BUG,建議少用。但也有他的優點,具體用法屬於中級問題,這里不提。
三、有關單片機ALE引腳的問題
"單片機不訪問外部鎖存器時ALE端有正脈沖信號輸出,此頻率約為時鍾振盪頻率的1/6.每當訪問
外部數據存儲器是,在兩個機器周期中ALE只出現一次,即丟失一個ALE脈沖."這句話是不是有毛
病.我覺得按這種說法,應該丟失3個ALE脈沖才對,我一直想不通是怎麼回事,希望大蝦們幫幫我.
小弟感激涕零.
答:
其他所有指令每6個機器周期發出一個ALE,而MOVX指令佔用12個機器周期只發出一個ALE
四、如何將一個INT型數據轉換成2個CHAR型數據?
經keil優化後,char1=int1/256,char2=int1%256或char1=int1>>8,char2=int1&0x00ff效率是一樣的。
五、在KEIL C51上模擬完了,怎樣生成HEX文件去燒寫??
右鍵點項目中Target 1,選第二個,在OUTPUT中選中CREAT HEX
六、typedef 和 #define 有何不同??
typedef 和 #define 有何不同》》》 如
typedef unsigned char UCHAR ;
#define unsigned char UCHAR ;
typedef命名一個新的數據類型,但實際上這個新的數據類型是已經存在的,只不過是定義了
一個新的名字.
#define只是一個標號的定義.
你舉的例子兩者沒有區別,但是#define還可以這樣用
#define MAX 100
#define FUN(x) 100-(x)
#define LABEL
等等,這些情況下是不能用typedef定義的
七、請問如何設定KELC51的模擬工作頻(時鍾)
用右鍵點擊左邊的的target 1,然後在xtal一欄輸入
八、不同模塊怎樣共享sbit變數,extern不行?
把SBIT定義單獨放到一個.H中,每個模塊都包含這個.h文件
九、C51中對於Px.x的訪問必須自己定義嗎?
是的。
如sbit P17 = 0x97;即可定義對P1.7的訪問
十、SWITCH( )語句中表達式不可以是位變數對嗎?
可以用位變數:
#include
#include
void main()
{
bit flag;
flag=0;
switch(flag)
{
case '0':{printf("0\n");break;}
case '1':{printf("1\n");break;}
default:break;
}
}
bit 變數只有兩種狀態,if 語句足夠啦,!!!
十一、const常數聲明占不佔內存???
const 只是用來定義「常量」,所佔用空間與你的定義有關,如:
const code cstStr[] = {"abc"};
佔用代碼空間;而如:
const char data cstStr[] = {"abc"};
當然佔用內存空間。
另外,#define 之定義似乎不佔用空間。
十二、philips的單片機P89C51RD+的擴展RAM在C51中如何使用?
試一試將auxr.1清0,然後在c語言中直接聲明xdata類型的變數
十三、BUG of Keil C51
程序中用如下語句:
const unsigned char strArr[] = {"數學"};
結果發現strArr[] 內容為 {0xCA,0xD1,0xA7},真奇怪!
凡是有0xfd,則會通通不見了,所以只能手工輸入內碼了,例如 uchar strArr[]=
{0xCA,0xfd,0xd1,0xa7}(用Ultraedit會很方便)。
十四、Keil C51中如何實現代碼優化?
菜單Project下Option for target "Simulator"的C51.
看到Code optimization了嗎?
十五、請教c的!和 ~ 符號有甚區別??
!是邏輯取反,~是按位取反。
十六、c51編程,讀埠,還要不要先輸出1?
我怎麼看到有的要,有的不要,請高手給講講,到底咋回事?謝了
要輸出1的,除非你能保證之前已經是1,而中間沒有輸出過其他值。
十七、當定時器1(T1)用於產生波特率時,P3^5還是否可以用作正常的I/O口呢?
p3.5完全可以當普通的io使用
十八、C51中 INT 轉換為 2個CHAR?
各位高手:
C51中 INT 轉換為 CHAR 如何轉換諸如:
X = LOW(Z);
Y = HIGH(Z);
答:
x=(char)z;
y=(char)(z>>8);
十九、如果我想使2EH的第7位置1的話,用位操作可以嗎?
現在對位操作指令我一些不太明白請各位多多指教:
如 SETB 07H 表示的是20H.7置1,對嗎?(我在一本書上是這么看到的)
那麼如果我想使2EH的第7位置1的話,象我舉的這個例子怎麼表示呢?謝謝!
SETB 77H
setb (2eh-20h)*8+7
20h-2fh每位元組有8個可位操作(00h-7fh),其它RAM不可位直接操作
二十、char *addr=0xc000 和char xdata *addr=0xc000有何區別?
char *addr=0xc000;
char xdata *addr=0xc000;
除了在內存中佔用的位元組不同外,還有別的區別嗎?
char *addr=0xc000; 是通用定義,指針變數 addr 可指向任何內存空間的值;
char xdata *addr=0xc000; 指定該指針變數只能指向 xdata 中的值;
後一種定義中該指針變數(addr)將少佔用一個存儲位元組。
uchar xdata *addr=0xc000;指針指向外ram;
如果:data uchar xdata *addr=0xc000;指針指向外ram但指針本身存在於內ram(data)
中
以此類推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;
data uchar idata *addr=0xa0;.........
二十一、while(p1_0)的執行時間?
假設,P1_0為單片機P1口的第一腳,請問,
while(P1_0)
{
P1_0=0;
}
while(!P1_0)
{
P1_0=1;
}
以上代碼,在KEIL C中,需要多長時間,執行完。能具體說明while(P1_0)的執行時間嗎?
模擬運行看看就知道了,
我模擬了試了一下,約14個周期
二十二、怎樣編寫C51的watchdog程序?
各位大蝦,我用KEIL C51 編寫了一個帶外部開門狗的程序,可程序無法運行起來,經過查
找,發現程序在經過C51編譯後,在MAIN()函數的前部增加了一端初始化程序,等到進入
主程序設置開門狗時,開門狗已經時間到,將我的程序復位了,請問我怎樣才能修改這一端
初始花程序,使他一運行,就設置開門狗?
可以在startup.a51中加入看門狗刷新指令,當然用匯編,然後重新編譯startup.a51
,將他和你的程序連接即可。新的startup.a51會自動代替系統默認的啟動模塊。
二十三、keil C51 怎樣把修改的startup.a51 加到工程文件中
直接加入即可
注意不要改動?STACK,?C_START,?C_STARTUP等符號。startup.a51直接加入項目,不用修改也可。可在內面自己修改匯編的一些限制或堆棧指針。
二十四、關於波特率的設置
我在設定串口波特率時發現一個問題:在晶體震盪器為11.0592MHz時,若設9600BPS的話,
TH1=0XFD,TL1=0XFD,而要設19200BPS的話,TH1、TL1有否變化,如果沒變,為什麼?
如果變了,又為什麼?(因為我看書上倆個是一樣的),希望大家點撥。
答:
當電源控制寄存器(PCON)第BIT7(SMOD)為1時波特率加倍。
TH1和TL1的值不變.
二十五、如何在C中聲明保留這部分RAM區不被C使用?
我不知道在C源程序中怎麼控制這個,但在匯編程序中加入下面一段就行:
DSEG AT 20H
AA: DS 10
這樣C51就不會佔用20H--29H了
或者在c51里這樣定義:
uchar data asm_buff[10] _at_ 0x20;
二十六、問浮點運算問題
我在用C51時發現它對傳遞浮點參數的個數有限制,請問:
1)參數是以全局變數的形式傳遞的,請問以全局變數的形式傳遞的參數也有限制嗎?
2)這種傳遞浮點參數的限制有多少呢?
3)float*float的結果是float類型還是double類型?能否直接賦值給float類型的變數?
答:
由於KEIL C51的參數傳遞是通過R0-R7來傳遞的,所以會有限制。
不過KEIL提供了一個編譯參數,可以支持更多參數的傳遞。具體
的內容見KEIL的PDF文檔。
我建議你把多個要傳遞的參數定義到指針或結構體中去,傳遞參
數通過指針或結構進行,這樣好一些。
第3個問題回答是YES,你自己試試不就知道了。
二十七、如何在某一個地址定義ram
用_at_ 命令,這樣可以定位靈活一點的地址
uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM
將dis_buff[16]定位在0x6020開始的16個位元組
二十八、keil c中,用什麼函數可以得到奇偶校驗位?
例如32位數據,將四個位元組相互異或後檢查P即可,若耽心P被改變,可用內嵌匯編。
#include
unsigned char parity(unsigned char x){
x^=x;
if(P)return(1);
else return(0);
}
unsigned char parity2(unsigned int x){
#pragma asm
mov a,r7
xrl ar6,a
#pragma endasm
if(P)return(1);
else return(0);
}
B. C語言實驗報告
我寫了個,不知道行不,有什麼不妥的請指出哈,如要格式請加我,將之發給你
四 川 大 學 計 算 機 學 院、軟 件 學 院
實 驗 報 告
學號: 姓名: 專業:計算機科學與技術 班級:5 第 13 周
課程名稱 c/C++ 實驗課時 2
實驗項目 字元串的復制與追加 實驗時間 08.5. 16
實驗目的 1.掌握字元串的基本操作和理解數據結構
實驗環境 VC 6.0
實驗內容(演算法、程序、步驟和方法) 先計算出S1和S2的字元個數,為S3分配好空間,利用已有庫函數先將S1復制到S3中,再將S2追加到S3中,當顯示完後要記住收回空間,做好善後處理。
源代碼如下:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char *s1="abcdef";
char *s2="123456f";
int n=strlen(s1)+strlen(s2);//計算s1,和s2的總長度n
char *s3=new char[n+1]; //定義S3並分配空間大小為n
strcpy(s3,s1); //將s1復制到s3中
strcat(s3,s2); //將s2追加到s3後面
cout<<"s3="<<s3<<endl;
delete []s3; //收回空間
s3=NULL; //將指針指向空
return 0;
}
(接上)
實驗內容(演算法、程序、步驟和方法)
結構是順序存儲結構,演算法順序鏈接法
數據記錄
和計算 數據有:字元串S1 ,S2;和一未知字元串S3
只需計算前兩個字元串長度之和
結 論
(結 果) 利用字元數組可以順序存儲字元數據,並且能夠順序處理數據;
演算法復雜度O(n+m);處於中性
小 結 字元數組能夠帶來很好的存儲結構,便於操作,但是演算法不是很好,只能順序遍歷數組,故復雜度不是很小
指導老師評 議
成績評定: 指導教師簽名:
C. C語言實驗報告總結
你只需要按那個模版就行,那些內容就改成你的作業
班級: 學號: 姓名:
實驗9 指針
一、實驗目的
(1)掌握指針概念,並定義與使用它。
(2)使用數組的指針和指向數組的指針變數。
(3)使用字元串的指針和指向字元串的指針變數。
二、實驗內容
1. 將一個3*3的矩陣轉置,用函數實現。
2. 有n個人圍成一圈,順序排號。從第一個人開始報數(1~3),凡報到3的人退出,問第幾號的人能留下。
三、實驗環境
硬體:(1)學生用微機
(2)多媒體實驗教室
軟體:(1)Windows XP 中文操作系統
(2)VC++ 6.0
四、實驗結果
程序1:
#include<stdio.h>
void main()
{
void move(int *pointer);
int a[3][3],*p,i;
printf("input marix:\n");
for(i=0;i<3;i++)
scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
p=&a[0][0];
move(p);
printf("matrix:\n");
for(i=0;i<3;i++)
printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
}
void move(int *pointer)
{
int i,j,t;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{
t=*(pointer+3*i+j);
*(pointer+3*i+j)=*(pointer+3*j+i);
*(pointer+3*j+i)=t;
}
}
程序2:
#include<stdio.h>
void main()
{
int i,k,m,n,num[50],*p;
printf("input num of person:");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;
i=0;
k=0;
m=0;
while(m<n-1)
{
if(*(p+i)!=0)k++;
if(k==3)
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)i=0;
}
while(*p==0)p++;
printf("the last num is %d\n",*p);
}
結果1:(就是程序運行之後出現的框,截圖後粘貼這里)
結果2:
五、總結:
通過這個實驗的學習, 基本掌握了指針的基本用法。
D. 大學C語言程序設計實驗報告,求程序步驟。
#include<stdio.h>
void main()
{ float f=555.5678,ff;
int a[10]={ 0,1,2,3,4,5,6,7,8,9 },b[10],i;
FILE *fp;
if ( fp=fopen("TEXT.dat","wb+") )
{ fwrite(&f,sizeof(float),1,fp);
for ( i=0;i<10;i++ ) fwrite(&a[i],sizeof(int),1,fp);
fclose(fp);
} else printf("無法建立文件。\n"); goto ERROREND;
if ( fp=fopen("TEXT.dat","rb") )
{ fread(&ff,sizeof(float),1,fp);
for ( i=0;i<10;i++ ) fread(&b[i],sizeof(int),1,fp);
fclose(fp);
} else printf("無法打開文件。\n"); goto ERROREND;
printf("%.2f ",ff); for ( i=0;i<10;i++ ) printf("%d ",b[i]); printf("\n");
ERROREND:;
}
E. C語言《數組》實驗報告怎麼做急!!!!!!
1.申請int變數,在for里初始化為2!
因為
之前給出的是
{1,1}
所以下標賦值從2開始!
每增加的一個數組,其值都是前面兩個數組的值之差!!得出20個數組後並輸出結果!~
1.無措
1.結果自己運算-
-
------------------------------------------------------------------------------------------------------------------------------------
2.不知道神馬是楊輝三角,我高中生-
-
-----------------------------------------------------------------------------------------------------------------------------------
3.錯誤1:for(i=1;i<11;i++)
解釋:數組下標從0開始
錯誤2:所有的for循環下標都從0開始!
按照以上錯誤運行結果是9個數的排序
結果自己運算
-----------------------------------------------------------------------------------------------------------------------------------
4.不會
----------------------------------------------------------------------------------------------------------------------------------
5.錯誤1:因為初始化數組是20個,所以不能使用gets
因為,gets函數在寫入過程中,不會判斷數據長度大小,等於說,
如果輸入大於20,拿25來說,
前20個寫入到指定的數組內存中,後5個就會溢出到其他內存,沖掉其他數據!·造成不必要的後果!
運行結果:str[1],[2],[3]
都有可能最大
-----------------------------------------------------------------------------------------------------------------------------------
歡迎追問,純個人思考手寫!望採納···
F. 求C語言數組實驗報告
這個也不會么 我。。。。。。。。。。
G. 求高手寫一份c語言的實驗報告,包含以下內容:
一. 實驗內容 (1) 運行以下程序, 並從中了解變數的指針和指針變數的概 念。 (2) 運行以下程序,觀察&a[0]、&a[i ]和 p 的變化,然後回答以下問題: 1. 程序的功能是什麼? 2. 在開始進入循 環體之前,p 指向誰? 3. 循環每增加 一次,p 的值(地址)增加多少?它指 向誰? 4. 退出循環後,p 指向誰? 5. 你是否初步掌握了通過指針變數引用數 組元素的方法? (3) 先分析以下程序的運行結果,然 後上機驗證,並通過此例掌握通過指針 變 量引用數組元素的各種方法。 (4) 編寫函數,將 n 個數按原來的順 序的逆序排列(要求用指針實現) , 然後 編寫主函數完成: ① 輸入 10 個 數; ② 調用此函數進行重排; ③ 輸出 重排後的結果。 二. 分析與討論 (1) 指針的定義方 法,指針和變數的關系。 定義方法: 數據類型 *指針變數名; 如 定義一個指向 int 型變數的指針—— in t *p; 則我們可以繼續寫如下代碼—— int a = 4; p = &a; printf("%d", *p); 在這里,我 們定義了一個變數 a,我們把它理解為 內存空間連續的 4 個位元組(int 型佔用 4 位元組),則這 4 個位元組的空間保存著 一個數 4。&是取地址符號,即把變數 a 的地址(即這 4 個位元組的首地址)賦 給指針 p (記住指針 p 的類型和變數 a 的類型要保持一致,否則的話,要進行 類型轉換)。這樣子,指針 p 就保存 著變數 a 的地址。我們如果把指針 p 當做內存空間裡面另外一個連續的 4 個 位元組,那麼這 4 個位元組保存的 數就是 變數 a 的地址。printf("%d",*p)和 prin tf("%d",a)的結果是一樣的。這里的*是 取變數符號(與& 剛好作用相反,通過 變數的地址找到變數),與定義時 int *p 的*號作用不同(定義時的*表示該 變數是個 指針變數,而非是取它指向 的變數)。 (2) 數組和指針的關系。 指針與數組是 C 語言中很重要的兩個概 念,它們之間有著密切的關系,利用這 種關系,可以增強處理數組 的靈活性 ,加快運行速度,本文著重討論指針與 數組之間的聯系及在編程中的應用。 1 .指針與數組的關系 當一個指針變數 被初始化成數組名時,就說該指針變數 指向了數組。如: char str[20], *ptr; ptr=str; ptr 被置為數組 str 的第一個元 素的地址,因為數組名就是該數組的首 地址,也是數組第一個元素的 地址。 此時可以認為指針 ptr 就是數組 str( 反之不成立) ,這樣原來對數組的處 理都可以用指針來實現。 如對數組元 素的訪問,既可以用下標變數訪問,也 可以用指針訪問。 2.指向數組元素的 指針 若有如下定義: int a[10], *pa; p a=a; 則 p=&a[0]是將數組第 1 個元素的 地址賦給了指針變數 p。 實際上,C 語 言中數組名就是數組的首地址,所以第 一個元素的地址可以用兩種方法獲得: p=&a[0]或 p=a。 這兩種方法在形式上 相像,其區別在於:pa 是指針變數,a 是數組名。值得注意的是:pa 是一個 可以 變化的指針變數,而 a 是一個常 數。因為數組一經被說明,數組的地址 也就是固定的,因此 a 是不能變化 的 ,不允許使用 a++、++a 或語句 a +=10,而 pa++、++pa、pa+=10 則是正確的。由此可見,此 時指針與 數組融為一體。 3.指針與一維數組 理 解指針與一維數組的關系,首先要了解 在編譯系統中,一維數組的存儲組織形 式和對數組元素的訪 問方法。 一維數 組是一個線形表,它被存放在一片連續 的內存單元中。C 語言對數組的訪問是 通過數組名(數 組的起始地址)加上 相對於起始地址的相對量(由下標變數 給出) ,得到要訪問的數組元素的單 元地址,然 後再對計算出的單元地址 的內容進行訪問。通常把數據類型所佔 單元的位元組個數稱為擴大因子。 實際 上編譯系統將數組元素的形式 a[i]轉換 成*(a+i), 然後才進行運算。 對於一 般數組元素的形式: <數組名>[<下標 表達式>],編譯程序將其轉換成:*(< 數組名>+<下標表達式>),其中下標表 達式為:下 標表達式*擴大因子。整 個式子計算結果是一個內存地址,最後 的結果為:*<地址>=<地址所對應單元 的 地址的內容>。由此可見,C 語言對 數組的處理,實際上是轉換成指針地址 的運算。 數組與指針暗中結合在一起。因此,任 何能由下標完成的操作,都可以用指針 來實現,一個不帶下標 的數組名就是 一個指向該數組的指針。 4.指針與多 維數組 用指針變數可以指向一維數組 ,也可以指向多維數組。但在概念上和 使用上,多維數組的指針比一維 數組 的指針要復雜一些。 例如,在一個三 維數組中,引用元素 c[i][j][k]的地址計 算最終將換成:*(*(*(c+i)+j)+k) 。 了解了多維數組的存儲形式和訪問 多維數組元素的內部轉換公式後,再看 當一個指針變數指向多維數組及 其元 素的情況。 1 指向數組元素的指針變數 若有如下說明: int a[3][4]; int *p; p= a; p 是指向整型變數的指針;p=a 使 p 指向整型二維數組 a 的首地址。 *(*( p+1)+2)表示取 a[1][2]的內容;*p 表示取 a[0][1]的內容,因為 p 是指向 整型變數的指針; p++表示 p 的內容 加 1,即 p 中存放的地址增加一個整型 量的位元組數 2,從而使 p 指向下一個整 型量 a[0] [1]。 2 指向由 j 個整數組成 的一維數組的指針變數 當指針變數 p 不是指向整型變數,而是指向一個包含 j 個元素的一維數組。如果 p=a[0],則 p++不 是指向 a[0][1],而是指向 a[1] 。這時 p 的增值以一維數組的長度為單 位。 5.指針與字元數組 C 語言中許多 字元串操作都是由指向字元數組的指針 及指針的運算來實現的。因為對於字元 串來說, 一般都是嚴格的順序存取方 式,使用指針可以打破這種存取方式, 更為靈活地處理字元串。 另外由於字 符串以′\0′作為結束符,而′\0′的 ASCII 碼是 0,它正好是 C 語言的邏輯假值, 所以 可以直接用它作為判斷字元串結 束的條件,而不需要用字元串的長度來 判斷。C 語言中類似的字元串處理 函數 都是用指針來完成,使程序運行速度更 快、效率更高,而且更易於理解。
H. C語言實驗報告
#include <stdio.h>
void DecToBin(int a,char b[33])
{
int i;
b[32]='