當前位置:首頁 » 編程軟體 » 簡單函數繪圖語言編譯器測試

簡單函數繪圖語言編譯器測試

發布時間: 2022-07-12 23:26:08

1. c語言圖形函數式如何編寫的,沒有編譯器怎麼編程

圖形有很多方式,控制台中,有使用zi字元畫類型的,也有點陣的。win32有gdi,opengl,directx,通過硬體驅動t提供的作圖功能編寫。

2. C語言簡單繪圖,求教啊!!!!急

C語言函數庫有畫點point(),line()線,顏色設置color(),滑鼠鍵盤中斷int86x(),圖形模式字元輸出output()等函數,首先得根據你的顯示器(VGA/BGA)初始化,然後就可以利用這些函數了,具體的你要看C語言高級編程,我很久沒搞了很多都忘記了,以前用C語言都編過小游戲程序還在家裡那台機子上

3. 編譯器本身是如何進行測試的

編譯器最重要的性質就是保證語義的正確。比如,從高級語言翻譯到機器指令之後,指令必須正確的表達原來程序的意思。所以一般編譯器測試都包含一些源程序,用來覆蓋可能出現的各種情況。基本的原則是:原來程序的結果 = 編譯後機器指令運行的結果。機器指令運行的結果很容易知道,運行一下就知道了。可是原來程序的結果你怎麼知道呢?
為了解決這個「原來程序語義」的問題,最好是寫一個解釋器,准確無誤的表達原來的代碼的語義。所以我們的要求就是:
高級語言解釋器(源程序) = 機器執行(機器代碼)
由於處理器其實就是一個用來執行機器代碼的解釋器,這里有一個很美好的對稱關系:
interp1(L1) = interp2(L2)
另外還有一個問題,就是編譯器一般需要經過多個轉化步驟(叫做 pass)才能最後編譯為機器指令。比如,
L2 = pass1(source)
L3 = pass2(L2)
L4 = pass3(L3)
Ln = passN(Ln-1)
machine_code = codegen(Ln)
由於源程序經過了很多步驟猜得到最後的機器指令,如果你使用上面的公式,就會出現以下一些情況:
1. 知道結果錯了,但是卻不知道到底是哪一個 pass 錯了。
2. 結果沒有錯,但是中間卻有 pass 實際上是錯的。但是由於之前的 pass 把輸入程序的一些結構給「優化」掉了,所以錯的那個 pass 其實沒能得到觸發錯誤的那個數據結構。所以測試沒能發現錯誤。如果以後前面的那個 pass 被修改,錯誤就會暴露出來。這是非常難以發現的潛伏的危險。
為了防止這些情況出現,一些編譯器(比如 Chez Scheme 和 Kent Dybvig 的課程編譯器)使用了對每一個 pass 進行測試的做法。具體的方法就是為每一個中間語言都寫一個解釋器,把這語言的語義完全的表示出來。這樣我們就需要檢查一組等式:
L2 = pass1(source)
高級語言編譯器(源程序) = interp2(L2) // 測試 pass1 的正確性
L3 = pass2(L2)
interp2(L2) = interp3(L3) // 測試 pass2 的正確性
這樣一來我們就能獨立的判斷每一個 pass 的正確性了。
這些是基本的語義測試原理。另外除了語義,可能還有一些「表面」一些的測試,它們看代碼本身,而不只看它的語義。比如尾遞歸優化的測試應該確保輸出程序的尾遞歸得到正確的處理,等等。這些是語義測試檢查不到的,因為尾遞歸沒有正確處理的程序大部分也能輸出正確的結果。
普通的單元測試方法也可以用來測試一些編譯器里的輔助函數,但那些不是編譯器特有的,所以就不講了。
另外,就像所有測試的局限性一樣,你沒法枚舉所有可能出現的輸入,所以以上的測試方法其實也不能保證編譯器的完全正確。

4. 用C語言編寫一個簡單的"小學數學測試系統"

include <stdio.h> /* 調用庫函數 */
#include <stdlib.h> /* 調用庫函數 */
int Tha; /* 變數 表示第一個運算數 */
int Thb; /* 第二個運算數 */
int Tresult; /* 正確答案 */
int Qcount; /* 題目的個數 */
int Upnum; /* 升級的分數 */
int Tscore; /* 當前得分 */
char op; /* 運算符號 */

TestTen() /* 出第一個級別題的函數 */
{
int Userda; /* 用戶給出的答案 */
int temp; /* 臨時變數,用於交換兩個變數得值 */

op=random(4)+1; /* 產生一個1-4之間的隨機數,用於表示+ ,- , * , / */

switch(op) /* 判斷運算符是什麼 */
{
case 1: /* 加 的情況 */
{ Tha=random(10); /* 產生一個0-9之間的隨機數 放在第一個運算數 Tha中 */
Thb=random(10); /* 產生一個0-9之間的隨機數 放在第二個運算數 Thb中 */
Tresult=Tha+Thb;break; /* 計算出正確答案 放在 Tresult中 */
}
case 2: /* 減 的情況 */
{ Tha=random(10);
Thb=random(10);
if(Tha<Thb) /* 減不能的負 所以第一個運算數要比第二個大,如果小,則交換兩變數的值 */
{temp=Tha;Tha=Thb;Thb=temp;} /* 交換 */
Tresult=Tha-Thb;break; /* 計算出正確答案 放在 Tresult中 */
}
case 3: /* 乘 的情況 */
{ Tha=random(10);
Thb=random(10);
Tresult=Tha*Thb;break;
}
case 4: /* 除 的情況 */
{do /* 循環 保證可以除盡 */
{ do /* 循環保證 除數不為 0 */
{Tha=random(10);
Thb=random(10);

if(Tha<Thb)
{temp=Tha;Tha=Thb;Thb=temp;}

}while(Thb==0) ; /* 當除數0 的時候繼續產生新的隨機數 */
}while((Tha%Thb)!=0); /* 當不能整除的時候繼續產生新的隨機數 */
Tresult=Tha/Thb;
break;
}
}

switch(op) /* 根據 op的值決定輸出 問題 */
{
case 1: {printf("\n%d + %d = ",Tha,Thb);break;}
case 2: {printf("\n%d - %d = ",Tha,Thb);break;}
case 3: {printf("\n%d X %d = ",Tha,Thb);break;}
case 4: {printf("\n%d / %d = ",Tha,Thb);}
}

scanf("%d",&Userda); /* 用戶輸入答案 */

while(Userda!=Tresult) /* 判斷答案是否正確 */
{ if(Tscore>=10) /* 不正確減分 */
Tscore=Tscore-10;
printf("\nWrong! Now Your Score: %d",Tscore); /* 輸出錯誤信息和 當前分數 */
/*if(Tscore<Upnum)
return; */
printf("\n Input The Answer Again: "); /* 提示重新輸入 */
scanf("%d",&Userda); /* 用戶輸入答案 */
}

Tscore=Tscore+10; /* 答對了 加分 */
printf("\n Right! Now Your Score: %d",Tscore); /* */
}

TestHun() /*出第二個級別題的函數*/
{
int Userda;
int temp;

op=random(4)+1;

switch (op)
{
case 1:
{ Tha=random(90)+10; /* 產生 10-99 之間的隨機數,即兩位數 */
Thb=random(90)+10;
Tresult=Tha+Thb;break;
}
case 2:
{ Tha=random(90)+10;
Thb=random(90)+10;
if(Tha<Thb)
{temp=Tha;Tha=Thb;Thb=temp;}
Tresult=Tha-Thb;break;
}
case 3:
{ Tha=random(90)+10;
Thb=random(90)+10;
Tresult=Tha*Thb;break;
}
case 4:
{do
{ do
{Tha=random(90)+10;
Thb=random(90)+10;

if(Tha<Thb)
{temp=Tha;Tha=Thb;Thb=temp;}

}while (Thb==0) ;
}while ((Tha%Thb)!=0);
Tresult=Tha/Thb;
break;
}
}

switch(op)
{
case 1: {printf("\n%d + %d = ",Tha,Thb);break;}
case 2: {printf("\n%d - %d = ",Tha,Thb);break;}
case 3: {printf("\n%d X %d = ",Tha,Thb);break;}
case 4: {printf("\n%d / %d = ",Tha,Thb);}
}

scanf("%d",&Userda);

while(Userda!=Tresult)
{ if(Tscore>=10)
Tscore=Tscore-10;
printf("\nWrong! Now Your Score: %d",Tscore);
if(Tscore<Upnum) /* 如果分數小於設定的分數則直接推出函數 */
return;
printf("\n Input The Answer Again: ");
scanf("%d",&Userda);
}

Tscore=Tscore+10;
printf("\n Right! Now Your Score: %d",Tscore);

}

main()
{
int Leiji=0; /* 變數 , 存儲 累計答題數目 */
randomize(); /* 保證每次運行程序 產生的隨機數序列不相同的語句 */
clrscr(); /* 清屏 : 清除屏幕上上次運行的內容,重新開始運行程序 */
clrscr();
printf("\nTEST START:-------------------------------------");
printf("\n Please Input Question Count: "); /* 提示信息 :輸入問題個數 */
scanf("%d",&Qcount); /* 用戶輸入問題個數 */

do
{printf("\n Please Input UpLevel Score(Times of 10 (Sheng ji de fen shu;)) : ");
/* 提示信息 :輸入升級分數(10的倍數 ) */
scanf("%d",&Upnum); /* 用戶輸入升級分數 */
if(Upnum<10) /* 如果用戶輸入的升級分數<10 */
printf("\n Must > = 10 ! ");
else if(Upnum%10!=0) /* 如果用戶輸入的升級分數不是10的倍數 :即 整除10 不等於0 */
printf("\n Must Some Times of 10!(10 de bei shu!)"); /* */
else break;
}while(1); /* 不滿足條件永遠循環 */

printf("\n--------------------------------------------------------");
printf("\n--------------------------------------------------------"); printf("\nTest Start:");
printf("\n--------------------------------------------------------");
printf("\n----------------------------------");
printf("\n Lever 1 Start :");

Begin1:

printf("\n----------------------");
printf("\n Question: %d",Leiji+1); /* 輸出 題號 */
TestTen();
Leiji++;

if(Leiji==Qcount) /* 如果做題個數 和 事先設定好的問題個數相同 則結束答題! */
{ printf("\n--------------------------------------------------------");
printf("\n--------------------------------------------------------\n");
printf("\n Test Over!!!\n");
printf("\n--------------------------------------------------------");
printf("\n Your Final Score: %d",Tscore);
if(Tscore>=Upnum)
printf("\n Your Final Level: LEVEL 2");
else
printf("\n Your Final Level: LEVEL 1");
goto LastLine;
}
if(Tscore<Upnum) /* 分數 小於 升級分數 */
goto Begin1; /* 轉向到 Begin1 繼續作題 */
printf("\n Up To Advance Level!\n Lever2 Start :---------"); /* 達到升級分數 升級到 Level2 */

Begin2:

printf("\n----------------------");
printf("\n Question: %d",Leiji+1);

TestHun();
Leiji++;

if(Leiji==Qcount)
{ printf("\n--------------------------------------------------------");
printf("\n--------------------------------------------------------\n");
printf("\n Test Over!!!\n");
printf("\n--------------------------------------------------------");
printf("\n Your Final Score: %d",Tscore);
if(Tscore>=Upnum)
printf("\n Your Final Level: LEVEL 2");
else
printf("\n Your Final Level: LEVEL 1");
goto LastLine;
}

if(Tscore<Upnum)
{printf("\nDown To Normal Level! Lever1 : -------"); /* 從Level2答題過程中分數小於升級分數 降級到Level 1 繼續答題 */
goto Begin1;}
else
goto Begin2;

LastLine:
printf("\n------------------------------------------------") ;
getchar();getchar(); /* 等待用戶輸入回車結束程序運行 */
}


5. C語言繪圖函數問題(超簡單)

用法: 該函數調用方式為void line(int startx,int starty,int endx,int endy); 說明: 參數startx,starty為起點坐標,endx,endy為終點坐標,函數調用前後,圖形狀態下屏幕游標(一般不可見)當前位置不改變。

6. 求一個純C語言繪圖函數

SDL可以做到。給你貼個源碼

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<SDL/SDL.h>
#include<SDL/SDL_image.h>

//函數聲明
int Init(void);
SDL_Surface *createScreen(int width,int height,int bpp,Uint32 flags);
void destroyScreen(SDL_Surface *screen);

SDL_Surface *loadImageBMP(char *filename);
void loadImage(char *filename,SDL_Surface *screen,int xPos,int yPos);

SDL_Surface *screen;
SDL_Surface *image_handler;
char buffer[10];

int main(int argc,char *argv[])
{
int height=640,width=480;
int bpp=8;

Init();
screen = createScreen(width,height,bpp,SDL_SWSURFACE);
loadImage("./wuyajie.bmp",screen,width/2,height/4);
read(STDIN_FILENO,buffer,1);
destroyScreen(screen);
SDL_Quit();
return 0;
}

int Init(void)
{
if(SDL_Init(SDL_INIT_VIDEO)==-1)
{
fprintf(stderr,"SDL Init Error:%s\n",SDL_GetError());
exit(-1);
}
return 0;
}

/*
創建屏幕,並將屏幕設置為640x480大小
*/
SDL_Surface *createScreen(int width,int height,int bpp,Uint32 flags)
{
SDL_Surface *screen;
if((screen = SDL_SetVideoMode(width,height,bpp,flags))==NULL)
{
fprintf(stderr,"Could not create a screen:%s\n",SDL_GetError());
exit(-1);
}
return screen;
}

/*
載入圖片
*/
void loadImage(char *filename,SDL_Surface *screen,int xPos,int yPos)
{
SDL_Surface *image;
SDL_Rect dest;

image = SDL_LoadBMP(filename);

if ( image == NULL ){
fprintf(stderr, "無法載入 %s: %s\n", filename, SDL_GetError());
exit(-1);
}

dest.x = xPos;
dest.y = yPos;

dest.w = image->w;
dest.h = image->h;
SDL_BlitSurface(image,NULL,screen,&dest);
SDL_UpdateRects(screen,1,&dest);

}

void destroyScreen(SDL_Surface * screen)
{
SDL_FreeSurface(screen);
}

7. 函數調用關系圖可以提供哪些與測試有關的信息

繪制函數調用關系圖對理解大型程序大有幫助。我想大家都有過一邊讀源碼(並在頭腦中維護一個調用棧),一邊在紙上畫函數調用關系,然後整理成圖的經歷。如果運氣好一點,藉助調試器的單步跟蹤功能和call stack窗口,能節約一些腦力。

不過如果要分析的是腳本語言的代碼,那多半隻好老老實實用第一種方法了。如果在讀代碼之前,手邊就有一份調用圖,豈不妙哉?下面舉出我知道的幾種免費的分析C/C++函數調用關系的工具。

函數調用關系圖(call graph)是圖(graph),而且是有向圖,多半還是無環圖(無圈圖)——如果代碼中沒有直接或間接的遞歸的話。Graphviz是專門繪制有向圖和無向圖的工具,所以很多call graph分析工具都以它為後端(back end)。那麼前端呢?就看各家各顯神通了。

調用圖的分析分析大致可分為「靜態」和「動態」兩種,所謂靜態分析是指在不運行待分析的程序的前提下進行分析,那麼動態分析自然就是記錄程序實際運行時的函數調用情況了。

靜態分析又有兩種方法,一是分析源碼,二是分析編譯後的目標文件。

分析源碼獲得的調用圖的質量取決於分析工具對編程語言的理解程度,比如能不能找出正確的C++重載函數。Doxygen是源碼文檔化工具,也能繪制調用圖,它似乎是自己分析源碼獲得函數調用關系的。GNU cflow也是類似的工具,不過它似乎偏重分析流程圖(flowchart)。

對編程語言的理解程度最好的當然是編譯器了,所以有人想出給編譯器打補丁,讓它在編譯時順便記錄函數調用關系。CodeViz(其靈感來自Martin Devera (Devik) 的工具)就屬於此類,它(1.0.9版)給GCC 3.4.1打了個補丁。

另外一個工具egypt的思路更巧妙,不用大動干戈地給編譯器打補丁,而是讓編譯器自己mp出調用關系,然後分析分析,交給Graphviz去繪圖。不過也有人另起爐灶,自己寫個C語言編譯器(ncc),專門分析調用圖,勇氣可嘉。不如要是對C++語言也這么干,成本不免太高了。分析C++的調用圖,還是藉助編譯器比較實在。

熱點內容
上游伺服器異常什麼意思 發布:2025-02-08 15:15:46 瀏覽:175
如何下載油猴腳本並安裝 發布:2025-02-08 15:02:12 瀏覽:596
硬體哪個配置性價比高 發布:2025-02-08 14:47:07 瀏覽:146
如何去掉僅限自動配置 發布:2025-02-08 14:37:55 瀏覽:708
壓縮空氣有啥 發布:2025-02-08 14:26:01 瀏覽:704
python輸入一個數 發布:2025-02-08 14:26:00 瀏覽:451
普惠e卡最初密碼是多少 發布:2025-02-08 14:21:57 瀏覽:477
亞索後q腳本 發布:2025-02-08 14:21:06 瀏覽:325
官方源碼 發布:2025-02-08 14:09:25 瀏覽:438
python過濾器 發布:2025-02-08 14:05:06 瀏覽:618