C語言opd
1. 匯編語言里PTR什麼意思 C++裡面又是什麼意思
ptr -- pointer (指針)縮寫。
匯編裡面ptr是規定的字 (保留字),mov ax,bx ;是把BX寄存器「里」的值賦予AX。
c語言里ptr是程序員自己寫的變數伏純名字,不是保留字,當然,它也可以是指針。
當用dw和dt、db等時,就需要他來顯示聲明了。
(1)C語言opd擴展閱讀:
指針(Pointer)是編程語言中的一個對象,利用地侍猜址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。
在高級語言中,指針有效地取代了在低級缺談咐語言,如匯編語言與機器碼,直接使用通用暫存器的地方,但它可能只適用於合法地址之中。
指針參考了存儲器中某個地址,通過被稱為反參考指針的動作,可以取出在那個地址中存儲的值。
另外,指針也指鍾表中用來指示對應時間的部件。
2. 數據結構 後綴法表達式求值C語言編寫
#include<iostream>
usingnamespacestd;
#include<stdio.h>
#include<stdlib.h>
#defineadd43
#definesubs45
#definemult42
#definediv47
#defineMAXSIZE100
typedefstruct
{
intstkdata[MAXSIZE];
inttop;
}STKzone;
typedefSTKzone*STK;
typedefenum{True=1,False=0}boo;
typedefenum{ok,error}頌嘩status;
STKzoneexpSTKzone;
STKexpSTK;
STKinitSTK(STKzone*stack_zone)
{
stack_zone->top=-1;
returnstack_zone;
}
statuspush(int*term,STKpstk)
{
if(pstk->top==MAXSIZE-1)
returnerror;
pstk->stkdata[++pstk->top]=*term;
returnok;
}/*push*/
boolemptySTK(STKpstk)
{
return(pstk->top==-1);
}
statuspop(int*pdata,STKpstk)
{
if(emptySTK(pstk))
returnerror;
else
{
*pdata=pstk->stkdata[pstk->top];
(pstk->top)--;
returnok;
}
}
voidsynerror()
{
printf(" 表達式語法錯誤! ");
exit(0);
}
inteval(inta1,inta2,chartag)
{
switch(tag)
{
caseadd:
return(a1+a2);
casesubs:
return(a1-a2);
casemult:
return(a1*a2);
casediv:
return(a1/a2);
}
}
intmain()
{
charc;
intopd1,opd2,temp,c1;
expSTK=initSTK(&expSTKzone);
opd1=1;
opd2=2;
push(&opd1,expSTK);
push(&opd2,expSTK);
printf(" 後綴表達式:");
while((c=getchar())!='/n')
{
if(c=='')continue;
if((c>47)&&(c<58))
{
c1=c-48;
if(push(&c1,expSTK)==error)
野模行{
printf("表達式太長 ");
exit(0);
碼蔽}
}
elseif((c==add)||(c==subs)||(c==mult)||(c==div))
{
if(pop(&opd1,expSTK)==error)
synerror();
if(pop(&opd2,expSTK)==error)
synerror();
temp=eval(opd1,opd2,c);
push(&temp,expSTK);
}
else{
//你輸入的c是多少,根本就不對
printf("c=[%c],c=%0X ",c,c);
synerror();
}
}/*while*/
if(pop(&temp,expSTK)==error)synerror();
if(!(emptySTK(expSTK)))synerror();
printf("=%-3d ",temp);
return0;
}/*main_end*/
//執行程序看看,你輸入的c值是多少,重新設計一下吧
3. 求達人用C語言編寫一個帶括弧的四則運算
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char* next;
double opd[1000];
int opt;
double *popd = opd;
#define PUSH(n) { *popd++ = n; }
#define POP() (*--popd)
#define TOP() (*(popd-1))
#define EMPTY() (popd == opd)
#define SIZE() (popd - opd)
void fail(char* s)
{
printf("match '%s'余皮 failed near '%c'.\n", s, *--next);
exit(0);
}
#define lbr() { if(*next++ == '(') ; else fail("("); }
#define rbr() { if(*next++ == ')') ; else fail(")"); }
void term();
void lv1();
void lv2();
void cal(char);
void expr()
{
term(); lv1();
}
void term()
{
double num = 0;
if(isdigit(*next)) {
do {
num = num * 10 + (*next - '桐御0');
} while(isdigit(*++next));
printf("局毀岩%g ", num);
PUSH(num);
} else if(*next == '(') {
lbr(); expr(); rbr();
} else {
fail("term");
}
}
void lv1()
{
while(1) {
char c = *next;
if(c == '+' || c == '-') {
++next;
lv2(); printf("%c ", c); ++opt; cal(c);
} else if(*next == '*' || *next == '/') {
lv2();
} else {
break;
}
}
}
void lv2()
{
while(1) {
char c = *next;
if(c == '*' || c == '/') {
++next;
term(); printf("%c ", c); ++opt; cal(c);
} else if(isdigit(*next)) {
term();
} else {
break;
}
}
}
double eval(char* s)
{
next = s;
expr();
if(*next || opt != 0) {
puts("invalid expression.");
exit(0);
}
return TOP();
}
void cal(char c)
{
double lhs, rhs, r;
if(SIZE() > 1) {
rhs = POP();
lhs = POP();
switch(c)
{
case '+': r = lhs + rhs; break;
case '-': r = lhs - rhs; break;
case '*': r = lhs * rhs; break;
case '/': r = lhs / rhs; break;
}
PUSH(r);
--opt;
}
}
int main()
{
printf("\n%g\n", eval("123+213-67*34+345/23*45*(34+34-345+245+567)"));
return 0;
}
4. C語言小程序找人注釋
不知道這大哥在哪弄的這程序,真是高手,沒怎麼細看,就是不知道為什麼這么個程序居旁瞎然弄到***這么復雜呵呵,
建議:類似的程序不用太深究。程序員的最高境界不是能編出誰看都費勁的程序,而是編出可讀性很強,運行不累贅的程序,這種程序...........本人不怎麼恭維。
象這種:
void main()
{
int i,n,j,k=2;
printf("輸入菱形行數,注意為奇數:\n");
scanf("%d",&n);
for(i=1;i+1;i+=k)
{
for(j=0;j <(n-i)/2;j++)
printf(" ");
for(j=0;j <i;j++)printf("*");
printf("\n");
if (i==n)
k=-2;
}
}大部分人看到for(i=1;i+1;i+=k)都會暈一下吧,死循環?不是,當輸入奇數的時候他不是死循環,輸入偶數就是死循環,這樣的程序有意義閉橘么?感覺......怪怪的轎啟團,是不是90後編的啊呵呵
5. C語言:任意算術表達式的求值
一看你就是個菜鳥!哥來回答要實現輸入任意表達式求值 樓上銀豎陵的的確不錯 但是那是數據結構的 對於你們菜鳥來說 學習那還是早了點我來編鋒戚寫一道簡單的題目吧:#include<stdio.h>void main(){double a,b,result;//定義兩個操作纖坦數char opr;//定義演算法printf("please input first number:");//輸入第一個數scanf("%lf",&a);printf("操作方法:");//輸入符號scanf("%c",&opr);printf("please input second number:");//輸入第二個數scanf("%lf",&b);if (opr=='+')result=a+b;else if(opr=='-')result=a-b;else if(opr=='/')result=a/b;else if(opr=='*')result=a*b;printf("運算結果是:%lf",result);}好了 OK 給我加分吧!
6. c語言程序中怎樣實現"任意兩個32位數相加"
正如樓上 heephi 所說, 用數組來存放 32 位數,
就是數組每個元素存入這個 32 位數的每一位
如 有數
那麼數組其實就肆棚磨是 {1, 1, ..., 1, 2, 2, ..., 2, 3, 3, ..., 3, 0, 0}
在此基礎上, 對每位進行相加, 遵循 滿十進一的規則
看樣例:
#include <stdio.h>
int main()
{
int a[32], b[32], c[32] = {0};
int i;
char buf[33]; /* 用於存入輸入的數字(其實就是字元串) */
printf("請輸入數 A: "); scanf("%s", buf);
for (i = 0; i < 32; i++)
{
if (buf[i] < '0' || buf[i] > '9')
{
printf("對不起, 你的輸入有錯, 可能出現非數字字元或數字長度不為 32");
return 0; /* exit(0) */
}
a[i] = buf[i] - 0x30;
/* 因為 '0' 的 ASCII 碼是48, 0x30 表示十六進制也就是十進制的 48,
所以 '0' - 0x30 就是 0, '9' - 0x30 就是 9, 也就實現了數字字元轉為數字 */
}
printf("請輸入數 B: "); scanf("%s", buf);
for (i = 0; i < 32; i++)
{
if (buf[i] < '0'裂斗 || buf[i] > '9')
{
printf("對不起, 你的輸入有錯, 可能出現非數字字元或數字長度不為 32");
return 0; /* exit(0); */
}
b[i] = buf[i] - 0x30;
/* 因為 '0' 的 ASCII 碼是48, 0x30 表示十六進制也就是十進制的 48,
所以 '0' - 0x30 就是 0, '9' - 0x30 就是 9, 也就實現了數字字元轉為數字和螞 */
}
/* 好了, 現在就是實現相加了 */
for (i = 31; i >= 0; i--)
{
c[i] += a[i] + b[i];
if (c[i] > 10)
{
c[i] -= 10;
if (i != 0) c[i - 1] += 1;
}
}
/* 相加完成, 現在輸出結果 a + b = c */
printf("\n\n\t");
for (i = 0; i < 32; i++)
{
printf("%d", a[i]);
}
printf("\n +\t");
for (i = 0; i < 32; i++)
{
printf("%d", b[i]);
}
printf("\n-----------------------------------------\n\t");
for (i = 0; i < 32; i++)
{
printf("%d", c[i]);
}
printf("\n");
return 0;
}
這個程序有些缺陷:
1. 必須兩個數均為 32 位, 所以不能計算一個 32 位數與位數小於 32 的數相加
2. 當兩數相加大於 32 位數時, 只能顯示最後 32 位數, 也就是溢出
3. 不能實現負數相加
程序運行結果:
------------------------------------------------
請輸入數 A:
請輸入數 B:
+
-----------------------------------------