本文目錄一覽:
- 1、用C語言編寫流星雨程序
- 2、C語言潮流程序中宏定義#define Y_(i,j)(*(*(Y+i)-i+j))是什麼意思?
- 3、經典C語言程序例子
- 4、FORTRAN編程語言與C語言
- 5、為什麼我編的電力系統潮流計算C語言PQ分解法不收斂
用C語言編寫流星雨程序
數字流星雨代碼:
//流星雨.cpp:Defines the entry point for the console application.
//
///////////////////////////////////////////////////
//程序名稱:數字流星雨
//最後修改:2006-10-15
///////////////////////////////////////////////////
#includelt;windows.hgt;
#includelt;time.hgt;
#includelt;stdlib.hgt;
#include”graphics.h”
#includelt;conio.hgt;
#includelt;math.hgt;
/***********************宏定義**********************/
#define PI 3.1415926//圓周率
#define WIDTH 200//屏幕寬度,流星出生區域
#define HEIGHT 150//屏幕高度,流星出生區域
#define V 20//流星速度,單次移動的像素數
#define LENGTH 20//流星字元數
#define DELAY 30//延時
#define NUM 45//流星個數
/******************定義流星結構體*******************/
struct meteor
{
int x0;
int y0;
int yh;
char str[LENGTH];
}me[NUM]={0};
/*********************函數聲明**********************/
char AsciiRand();
void Move(char*p);
void InitMeteor(struct meteor*me);
int color(int y,int y0,int yh);
void Meteors(struct meteor me[]);
/***********************主函數**********************/
///int main(void)
int _tmain(int argc,_TCHAR*argv[]){
char c=’\0′;//接收鍵盤輸入的變數
initgraph(WIDTH,HEIGHT);//初始化WIDTH*HEIGHT的繪圖窗口
HWND hwnd=GetHWnd();//獲得窗口句柄
SetWindowText(hwnd,”Gavin Liu數字流星雨”);//修改窗口名稱
ShowWindow(hwnd,SW_SHOWMAXIMIZED);//最大化顯示窗口
MessageBox(hwnd,TEXT(“點擊【確定】開始演示流星雨效果,Esc鍵退出”),TEXT(“提示”),MB_OK|MB_ICONWARNING);//彈出提示
srand((unsigned)time(NULL));//設置隨機種子
for(int i=0;ilt;NUM;i++){//對NUM個流星體初始化
InitMeteor(melt;igt;);
}
while(c!=27){
BeginBatchDraw();//開始批量繪圖
Meteors(me);//繪製一幀動畫
FlushBatchDraw();//執行未完成的繪製任務
Sleep(DELAY);//延時
cleardevice();//清屏
for(int i=0;ilt;NUM;i++){
melt;igt;.yh+=V;
Move(melt;igt;.str);
if(melt;igt;.yhgt;HEIGHT+LENGTH*V){
InitMeteor(melt;igt;);
}
}
if(kbhit()){
c=getch();
}
}
EndBatchDraw();//結束批量繪圖
closegraph();//結束繪圖環境
return 0;
}
/***********************函數體**********************/
char AsciiRand(){//產生隨機可見ASCII碼
return((char)(rand()%(126-33)+33));
}
void Move(char*p){//字元後移,可以使顯示時字元相對屏幕位置不變
char*pt=p+LENGTH;
while(ptgt;p){
*(–pt)=*(pt-1);
}
*p=AsciiRand();
}
void InitMeteor(struct meteor*me){//對一顆流星初始化
me-gt;x0=rand()%WIDTH;
me-gt;yh=me-gt;y0=rand()%HEIGHT;
for(int i=0;ilt;LENGTH;i++)
{
*(me-gt;str+i)=AsciiRand();
}
}
int color(int y,int y0,int yh){//確定流星的顏色
int color;
//出生點之前的流星體置成黑色
if(ylt;y0){
color=0;
}
//流星顏色自頭至尾按照餘弦函數遞減
else{
//尾跡消失
color=(int)(255*cos((yh-y)*PI/(2*LENGTH*V)));
}
return color;
}
//列印一幀流星的畫面
void Meteors(struct meteor me[]){
//設置格式:背景透明,字元高度,字體粗細,字體
setbkmode(TRANSPARENT);
setfont(12,12,”宋體”);
//開始列印一幀圖像
int y;
for(int n=0;nlt;NUM;n++){
for(int j=0;jlt;LENGTH;j++){
//流星中第j個字元的縱坐標
y=me[n].yh-j*V;
//設置顏色,流星的頭部是白色的
setcolor(RGB(255*(0==j),color(y,me[n].y0,me[n].yh),255*(0==j)));
//列印字元
outtextxy(me[n].x0,y,me[n].str[j]);
}
}
}
擴展資料:
include用法:
#include命令預處理命令的一種,預處理命令可以將別的源代碼內容插入到所指定的位置;可以標識出只有在特定條件下才會被編譯的某一段程序代碼;可以定義類似標識符功能的宏,在編譯時,預處理器會用別的文本取代該宏。
插入頭文件的內容
#include命令告訴預處理器將指定頭文件的內容插入到預處理器命令的相應位置。有兩種方式可以指定插入頭文件:
1、#includelt;文件名gt;
2、#include”文件名”
C語言潮流程序中宏定義#define Y_(i,j)(*(*(Y+i)-i+j))是什麼意思?
#define Y_(i,j) (*(*(Y+i)-i+j))
你把Y_(i,j)當成一個子函數,i , j 則為參數,
當你調用Y_( i , j )時,把參數i, j帶入(*(*(Y+i)-i+j))這個公式中計算,計算結果即為返回值
經典C語言程序例子
題目01:在一個已知的字元串中查找最長單詞,假定字元串中只含字母和空格,空格用來分隔不同的單詞。
直接編譯,程序執行結果如下圖所示:
題目02:編寫一個int string_len(char *s),返回字元串s的字元長度(不包括\0)。
直接編譯,程序執行結果如下圖所示:
擴展資料:
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
儘管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標準規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
FORTRAN編程語言與C語言
fortran語言中可通過定義子程序從而返回一系列變數值,而c語言的函數一般只能返回一個變數值。
Fortran語言的最大特性是接近數學公式的自然描述,在計算機里具有很高的執行效率。易學,語法嚴謹。可以直接對矩陣和複數進行運算,這一點類似MATLAB。自誕生以來廣泛地應用於數值計算領域,積累了大量高效而可靠的源程序。很多專用的大型數值運算計算機針對Fortran做了優化。廣泛地應用於並行計算和高性能計算領域。
C語言是一個有結構化程序設計、具有變數作用域(variable scope)以及遞歸功能的過程式語言。C語言傳遞參數均是以值傳遞(pass by value),另外也可以傳遞指針(a pointer passed by value)。不同的變數類型可以用結構體(struct)組合在一起。只有32個保留字(reserved keywords),使變數、函數命名有更多彈性。部份的變數類型可以轉換,例如整型和字元型變數。通過指針(pointer),C語言可以容易的對存儲器進行低級控制。預編譯處理(preprocessor)讓C語言的編譯更具有彈性。
為什麼我編的電力系統潮流計算C語言PQ分解法不收斂
//PQ 分解法源程序
#include “math.h”
#include “stdio.h”
#include “stdlib.h”
#define M 14 //預計支路數
#define N 14 //預計節點數
//
struct linestr //支路信息
{
int i,j; //和該支路相連的兩個節點
float r,x,g,b; //該支路的參數,kb為非標準變比
float pij,qij,pji,qji; //支路潮流—計算數據
}line[M];
struct pointstr //節點信息
{
int sign; //節點類型,0—平衡節點,1—PQ節點,2—PV節點
float voltage,cta,p,q; //節點電壓幅值和相位角,節點注入有功、無功
}pointpri[N],pointaft[N]; //pointpri用於存放節點的初始數據,pointaft用於存放計算後的節點數據
float G[N][N]={0},B[N][N]={0}; //節點導納陣
//
float B1[N][N]={0},B2[N][N]={0};//修正方程係數矩陣
float detp[N]={0},detct[N]={0},detq[N]={0},detv[N]={0};//依次放修正方程的修正量
float pn[N]={0},ctn[N]={0},qn[N]={0},vn[N]={0}; //依次放修正量對應的節點號,即變數對應的節點號
int nline,npoint; //準確的支路數和節點數
int npq,npv,nbal; //PQ節點數、PV節點數、平衡節點數
void creat()
{
int i;
npq=0;npv=0;nbal=0;
printf(“\n請輸入總支路數:”);scanf(“%d”,nline);
for(i=1;i=nline;i++)
{
printf(“請輸入%d號支路數據:\n”,i);
printf(“和該支路相連的節點號i,j(請用逗號隔開):”);scanf(“%d,%d”,(line[i].i),(line[i].j));
printf(“該支路的電阻和電抗R,X(請用逗號隔開):”);scanf(“%f,%f”,(line[i].r),(line[i].x));
printf(“該支路的對地電導和電納G,B(請用逗號隔開):”);scanf(“%f,%f”,(line[i].g),(line[i].b));
line[i].pij=0;line[i].qij=0;line[i].pji=0;line[i].qji=0;
//形成節點導納陣
G[line[i].i][line[i].j]=-line[i].r/((line[i].r*line[i].r+line[i].x*line[i].x));
G[line[i].j][line[i].i]=G[line[i].i][line[i].j];
B[line[i].i][line[i].j]=line[i].x/((line[i].r*line[i].r+line[i].x*line[i].x));
B[line[i].j][line[i].i]=B[line[i].i][line[i].j];
G[line[i].i][line[i].i]+=line[i].r/((line[i].r*line[i].r+line[i].x*line[i].x));
G[line[i].i][line[i].i]+=line[i].g;
B[line[i].i][line[i].i]+=(-line[i].x)/((line[i].r*line[i].r+line[i].x*line[i].x));
B[line[i].i][line[i].i]+=line[i].b;
G[line[i].j][line[i].j]+=line[i].r/(line[i].r*line[i].r+line[i].x*line[i].x);
G[line[i].j][line[i].j]+=line[i].g;
B[line[i].j][line[i].j]+=(-line[i].x)/(line[i].r*line[i].r+line[i].x*line[i].x);
B[line[i].j][line[i].j]+=line[i].b;
}
printf(“\n請輸入總節點數:”);scanf(“%d”,npoint);
for(i=1;i=npoint;i++)
{
printf(“請輸入節點%d的數據\n”,i);
printf(“選擇節點類型(1-平衡節點,2-PQ節點,3-PV節點):”);
scanf(“%d”,(pointpri[i].sign));
if(pointpri[i].sign==1)
{
printf(“請輸入該節點的電壓幅值和相位角(用逗號隔開):”);
scanf(“%f,%f”,(pointpri[i].voltage),(pointpri[i].cta));
pointpri[i].p=0;pointpri[i].q=0;
nbal++;
}
else if(pointpri[i].sign==2)
{
printf(“請輸入該節點的注入有功和無功(用逗號隔開):”);
scanf(“%f,%f”,(pointpri[i].p),(pointpri[i].q));
pointpri[i].voltage=1;pointpri[i].cta=0;
npq++;
}
else if(pointpri[i].sign==3)
{
printf(“請輸入該節點的有功注入和電壓幅值(用逗號隔開):”);
scanf(“%f,%f”,(pointpri[i].p),(pointpri[i].voltage));
pointpri[i].q=0;pointpri[i].cta=0;
npv++;
}
else
{
printf(“選擇無效,請重新輸入\n”);
i–;
}
if(nbal1)
{
printf(“出現多個平衡節點,請重新輸入\n”);
i–;nbal–;
}
}
}
void view()
{
int i,j;
for(i=1;i=npoint;i++)
{
for(j=1;j=npoint;j++)
printf(“%f+j%f ,”,G[i][j],B[i][j]);
printf(“\n”);
}
for(i=1;i=npoint;i++)
{
printf(“節點%d參數:”,i);
if(pointpri[i].sign==1)printf(“平衡節點 v=%f,theta=%f\n”,pointpri[i].voltage,pointpri[i].cta);
else if(pointpri[i].sign==2)printf(“PQ節點 P=%f,Q=%f\n”,pointpri[i].p,pointpri[i].q);
else printf(“PV節點 P=%f,v=%f\n”,pointpri[i].p,pointpri[i].voltage);
}
}
void modify()
{
}
void run()
{
int i,j,k,m,n;
float E,e;//E為題目所要求的迭代精度,由鍵盤輸入,e為每一步迭代的實際計算精度,用以和E比較
int numPQ[N];//PQ節點號
int numPV[N];//PV節點號
int numBAL; //平衡節點號
int np_th[N],nq_v[N];//迭代方程中的有功-電壓相位角方程、無功-電壓幅值方程分別對應的節點號
float B1_fac[N][N]={0},B2_fac[N][N]={0},a;
j=1;k=1;m=1;n=1;
for(i=1;i=npoint;i++){B1_fac[i][i]=1;B2_fac[i][i]=1;}
for(i=1;i=npoint;i++)
{//將數據存入一個新的結構體數組,保證在迭代過程中即使數據有改變,仍能保留住原始數據
pointaft[i].sign=pointpri[i].sign;
pointaft[i].voltage=pointpri[i].voltage;
pointaft[i].cta=pointpri[i].cta;
pointaft[i].p=pointpri[i].p;
pointaft[i].q=pointpri[i].q;
//統計PV節點和PQ節點序號,並存入臨時數組
if(pointpri[i].sign==1)numBAL=i;
else if(pointpri[i].sign==2){numPQ[j++]=i;np_th[m++]=i;nq_v[n++]=i;}
else {numPV[k++]=i;np_th[m++]=i;}
}
//形成有功-相位角的迭代方程係數矩陣B1
for(i=1;i=npoint-1;i++)
for(j=1;j=npoint-1;j++)
B1[i][j]=B[np_th[i]][np_th[j]];
//形成因子表
for(k=1;k=npoint-1;k++)
for(i=k+1;i=npoint-1;i++)
{ a=B1[i][k];
for(j=1;j=npoint-1;j++)
{
B1[i][j]-=a*B1[k][j]/B1[k][k];
B1_fac[i][j]-=a*B1_fac[k][j]/B1[k][k];
}
}
//形成無功-電壓幅值的迭代方程的係數矩陣B2
for(i=1;i=npq;i++)
for(j=1;j=npq;j++)
B2[i][j]=B[nq_v[i]][nq_v[j]];
//形成因子表
for(k=1;k=npq;k++)
for(i=k+1;i=npq;i++)
{ a=B2[i][k];
for(j=1;j=npq;j++)
{
B2[i][j]-=a*B2[k][j]/B2[k][k];
B2_fac[i][j]-=a*B2_fac[k][j]/B2[k][k];
}
}
printf(“請輸入迭代精度:”);scanf(“%f”,E);
k=-1;
do
{
e=0;
k++;
//有功迭代
//首先計算有功不平衡量
for(i=1;i=npoint-1;i++)
{
detp[i]=pointaft[np_th[i]].p/pointaft[np_th[i]].voltage;
for(j=1;j=npoint;j++)
detp[i]-=pointaft[j].voltage*(G[np_th[i]][j]*cos(pointaft[np_th[i]].cta-pointaft[j].cta)+B[np_th[i]][j]*sin(pointaft[np_th[i]].cta-pointaft[j].cta));
printf(“%f,”,detp[i]);
}
for(i=1;i=npoint-1;i++)
{
detct[i]=0;
for(j=1;j=npoint-1;j++)
detct[i]+=B1_fac[i][j]*detp[j];
}
for(i=npoint-1;i=1;i–)
{
for(j=npoint-1;ji;j–)
detct[i]-=B1[i][j]*detct[j];
detct[i]/=B1[i][i];
}
for(i=1;i=npoint-1;i++)detct[i]/=(-pointaft[np_th[i]].voltage);//求出相位角的修正量
for(i=1;i=npoint-1;i++){pointaft[np_th[i]].cta+=detct[i];e+=detct[i]*detct[i];}//修正角度,並計算精度
printf(“第%d次迭代後的相位角:”,k);
for(i=1;i=npoint;i++)printf(“%f,”,pointaft[i].cta);
printf(“\n”);
//無功迭代
//首先計算無功不平衡量
for(i=1;i=npq;i++)
{
detq[i]=pointaft[nq_v[i]].q/pointaft[nq_v[i]].voltage;
for(j=1;j=npoint;j++)
detq[i]-=pointaft[j].voltage*(G[nq_v[i]][j]*sin(pointaft[nq_v[i]].cta-pointaft[j].cta)-B[nq_v[i]][j]*cos(pointaft[nq_v[i]].cta-pointaft[j].cta));
printf(“%f,”,detq[i]);
}
for(i=1;i=npq;i++)
{
detv[i]=0;
for(j=1;j=npq;j++)
detv[i]+=B2_fac[i][j]*detq[j];
}
for(i=npq;i=1;i–)
{
for(j=npq;ji;j–)
detv[i]-=B2[i][j]*detv[j];
detv[i]/=B2[i][i];
}
for(i=1;i=npq;i++)detv[i]/=(-1);//求出電壓的修正量
for(i=1;i=npq;i++){pointaft[nq_v[i]].voltage+=detv[i];e+=detv[i]*detv[i];}//修正電壓
printf(“第%d次迭代後的電壓幅值為:”,k);
for(i=1;i=npoint;i++)printf(“%f,”,pointaft[i].voltage);
printf(“\n”);
}while(eEk100);
//輸出結果
printf(“在滿足精度E=%f的情況下,計算結果為:”,E);
for(i=1;i=npoint;i++)
printf(“v%d=%f,cta%d=%f\n”,i,pointaft[i].voltage,i,pointaft[i].cta);
//計算平衡節點注入功率
pointaft[numBAL].p=0;pointaft[numBAL].q=0;
for(i=1;i=npoint;i++)
{
pointaft[numBAL].p+=pointaft[i].voltage*(G[numBAL][i]*cos(pointaft[numBAL].cta-pointaft[i].cta)+B[numBAL][i]*sin(pointaft[numBAL].cta-pointaft[i].cta));
pointaft[numBAL].q+=pointaft[i].voltage*(G[numBAL][i]*sin(pointaft[numBAL].cta-pointaft[i].cta)-B[numBAL][i]*cos(pointaft[numBAL].cta-pointaft[i].cta));
}
pointaft[numBAL].p*=pointaft[numBAL].voltage;
pointaft[numBAL].q*=pointaft[numBAL].voltage;
printf(“平衡節點注入功率為:%f+j%f\n”,pointaft[numBAL].p,pointaft[numBAL].q);
//計算各支路潮流
for(k=1;k=nline;k++)
{
float aa,bb,cc;
i=line[k].i;j=line[k].j;
aa=pointaft[i].voltage*cos(pointaft[i].cta)-pointaft[j].voltage*cos(pointaft[j].cta);
bb=pointaft[i].voltage*sin(pointaft[i].cta)-pointaft[j].voltage*sin(pointaft[j].cta);
cc=line[k].r*line[k].r+line[k].x*line[k].x;
line[k].pij=(line[k].r*(pointaft[i].voltage*cos(pointaft[i].cta)*aa+pointaft[i].voltage*sin(pointaft[i].cta*bb))-line[k].x*(pointaft[i].voltage*sin(pointaft[i].cta*aa-pointaft[i].voltage*cos(pointaft[i].cta)*bb)))/cc;
line[k].qij=(line[k].x*(pointaft[i].voltage*cos(pointaft[i].cta)*aa+pointaft[i].voltage*sin(pointaft[i].cta*bb))+line[k].r*(pointaft[i].voltage*sin(pointaft[i].cta*aa-pointaft[i].voltage*cos(pointaft[i].cta)*bb)))/cc;
line[k].pji=(line[k].r*(pointaft[j].voltage*cos(pointaft[j].cta)*(-aa)+pointaft[j].voltage*sin(pointaft[j].cta*(-bb)))-line[k].x*(pointaft[j].voltage*sin(pointaft[j].cta*(-aa)-pointaft[j].voltage*cos(pointaft[j].cta)*(-bb))))/cc;
line[k].qji=(line[k].x*(pointaft[j].voltage*cos(pointaft[j].cta)*(-aa)+pointaft[j].voltage*sin(pointaft[j].cta*(-bb)))+line[k].r*(pointaft[j].voltage*sin(pointaft[j].cta*(-aa)-pointaft[j].voltage*cos(pointaft[j].cta)*(-bb))))/cc;
printf(“由節點%d流向節點%d的功率為:%f+j%f\n”,i,j,line[k].pij,line[k].qij);
printf(“由節點%d流向節點%d的功率為:%f+j%f\n”,j,i,line[k].pji,line[k].qji);
}
}
main ()
{
int a;
printf(“\n”);
printf(“***************電力系統潮流計算**************\n”);
printf(“\n”);
printf(” 設計者: 李 冰 設計:2014 年 5 月\n”);
printf(“\n”);
printf(“\n”);
printf(” 註:各參數用標么值表示,角度均以弧度製表示\n”);
printf(“\n”);
printf(“\n”);
do
{
printf(“請選擇:1-建立電網;2-查看數據;3-修改數據;4-運行計算;0-退出程序:”);//由鍵盤輸入選項
scanf(“%d”,a);
if (a==0) //如果選中0,就表示退出程序
{
exit(0);
}
else if (a==1) //如果選中1,就跳去執行建立電網,即creat處
{
creat();
}
else if (a==2) //如果選中2,就跳去執行查看數據,即view處
{
view();
}
else if (a==3) //如果選中1,就跳去執行修改數據,即modify處
{
modify();
}
else if (a==4) //如果選中1,就跳去執行運行計算,即run處
{
run();
}
else //如果以上都不是,則表示無效輸入,重新要求輸入選擇
{
printf(“\n無效輸入,請重新選擇\n”);
}
}while(1);
}
不知道能不能幫到你
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/244585.html