2018.7.17 00:23由于CSDN文章有審核機制誊稚,晚上等了兩個多小時沒人審核假丧,故搬家至此
7.16 Lec5
//鏈表排序輸出輸入的整數(shù)
//by Gallien
#include <stdio.h>
#include <stdlib.h>
struct node
{
int n;
struct node * pNext;
};
int main(void)
{
struct node *pHead = NULL, *pEnd = NULL, *pNode = NULL, *Judge1 = NULL, *Judge2 = NULL, *oldHead=NULL;
int i = 1;
printf("Please input a integer:\n");
printf("en by inputing 0:");
p1:
do
{
scanf("%d",&i);
if(0!=i)
{
pNode = (struct node *)malloc(sizeof(struct node));
if(NULL!=pNode)
{
pNode->n=i;
pNode->pNext=NULL;
if(NULL == pHead)
{
pHead = pNode;
pEnd = pNode;
}
else
{ //要改的地方审胚,老師的程序的這里是把新輸入的數(shù)放到結(jié)尾恕沫,應(yīng)改為判斷位置然后插入
Judge1 = pHead; //利用兩個指針Judge1,Judge2,byGallien來判斷應(yīng)該插入在哪里
if (pHead->n<i)
{
if (pHead==pEnd) //如果pHead=pEnd绞呈,那么鏈表中此時只有一個數(shù)贸人,且前置條件為鏈表中的那個數(shù)小于pNode中存的數(shù)
{
pHead->pNext=pNode; //故這里操作為把pNode加在pHead后面
pEnd=pNode;
continue;
}
else
Judge2=pHead->pNext;
}
else
{
oldHead = pHead; //若pNode中的數(shù)比pHead中的還小,只需加在pHead前就行
pHead = pNode;
pHead->pNext = oldHead;
continue;
}
while (Judge2->n<i) //此循環(huán)用于定位到底該插在哪里佃声,當結(jié)構(gòu)中的n有如下關(guān)系時停止:Judge1<pNode<=Judge2
{
if (Judge2 == pEnd) //特殊情況艺智,若pNode比鏈表中所有數(shù)都大,我們就把它接在鏈表后面
{
pEnd->pNext = pNode;
pEnd = pNode;
goto p1; //因為符合兩個Judge中間的插入操作接在循環(huán)后面圾亏,故特殊情況接在結(jié)尾后應(yīng)跳轉(zhuǎn)至總循環(huán)前十拣,故用goto
}
else
{
Judge1 = Judge2; //把Judge1封拧,Judge2往后推一位的操作
Judge2 = Judge2->pNext;
}
}
Judge1->pNext = pNode; //當循環(huán)結(jié)束的時候,若到了這里夭问,說明已經(jīng)找到了插入的地方泽西,插入即可
pNode->pNext = Judge2;
} //修改結(jié)束
}
}
}while(i!=0);
pNode = pHead;
while(pNode!=NULL)
{
printf("%d\t",pNode->n);
pHead = pNode;
pNode = pNode->pNext;
free(pHead);
}
printf("\n");
return 0;
}
7.17 Lec6
encrypt
//加密程序 用法:在cmd用進入到exe文件所在路徑
//然后輸入exe名 空格 將被加密的文件名 即可,例如encrypt.exe data.txt
//輸出的密文的文件名為locked.txt
//by Gallien
#include <stdio.h>
int main(int argc,char *argv[]) //有參數(shù)的主函數(shù)甲喝,讀取字符串
{
FILE *fp, *lock;
char ch;
fp = fopen(argv[1],"r"); //將exe后面第一個字符串作為被打開文件名字
lock = fopen("locked.txt","w+"); //創(chuàng)建一個txt文件用于寫入被加密后的文本
if (fp == NULL)
{
printf("can't open %s",argv[1]); //若當前目錄無次文件則失敗并提醒用戶
return 0;
}
while((ch = getc(fp)) != EOF) //讀到文件結(jié)尾
fprintf(lock,"%c",ch-25); //加密尝苇,每個字符對于ASCII碼中編碼數(shù)小25的字符
fclose(fp);
fclose(lock);
printf("Ok!");
return 0;
}
decrypt
//解密程序 用法:在cmd用進入到exe文件所在路徑
//然后輸入exe名 空格 將被加密的文件名 即可,例如decrypt.exe locked.txt
//輸出的解密文件名為unlocked.txt
//by Gallien
#include <stdio.h>
int main(int argc,char *argv[])
{
FILE *fp, *unlock;
char ch;
fp = fopen(argv[1],"r");
unlock = fopen("unlocked.txt","w+");
if (fp == NULL)
{
printf("can't open %s",argv[1]);
return 0;
}
while((ch = getc(fp)) != EOF)
fprintf(unlock,"%c",ch+25);
fclose(fp);
fclose(unlock);
printf("Ok!");
return 0;
}
大作業(yè)
main放一個.cpp埠胖,類的聲明放一個.h糠溜,類的實現(xiàn)放一個.cpp里
由于沒怎么學(xué)過CPP,其實我還是用C的想法來寫的這題直撤,完全沒有CPP的思想非竿,把老師分的幾個模塊給統(tǒng)一到了Solve_and_Write里了,所以private里也去掉了T
//需要一個支持C99或者更高標準的編譯器
//計算二維方塊中特定初始條件下的溫度演變數(shù)據(jù)
//可由用戶決定的數(shù)據(jù)為分割長度(delta_x),間隔時間(delta_t)(0.1-0.5) 和 總時間(T)
//若想修改其他參數(shù)則需從本文件宏部分更改然后編譯即可
//交了作業(yè)后才發(fā)現(xiàn)其實老師的頻率函數(shù)設(shè)置是有道理的
//因為這是有限元法谋竖,delta_t得取得比較小红柱,如果取大了,甚至?xí)霈F(xiàn)負溫度的結(jié)果
//所以可以優(yōu)化一下蓖乘,給輸出部分的代碼設(shè)一個計數(shù)器來輸出自己想要的間隔
//比如delta_t設(shè)為0.5锤悄,但是想要10000秒的數(shù)據(jù),就可以設(shè)每200次(即100s)輸出一次
//當然這個最好也是由用戶決定嘉抒,所以還得在用戶那里多獲取一個參數(shù)來確定輸出頻率
//by Gallien
#include <iostream>
#include "Heat2D.h"
#include "Heat2D.cpp"
#define SIZE 100.0 //不建議改零聚,因為中心高溫處
#define k_left 0.05
#define k_right 0.5
#define Heat_Capacity 2.0
#define Density 5.0
using namespace std;
int main()
{
cout << "This program is used for solveing a particular probleme and output some datas."<<endl; //與用戶交互并提示獲取一些解題所需信息
cout << "Please set the parameters for your own probleme before the program work."<<endl;
cout << endl << "<WARNING>: There would be many txt files, so please move the exe file to an empty folder"<<endl<<endl; //建議用戶把exe程序移至空文件夾,因為生成文件過多些侍,怕混亂
float delta_x,delta_t,Time;
cout << "Please set the length of the divided square:"<<endl;
cin >> delta_x;
cout << "the time interval (delta t, better chosen among 0,1 0.2 0.3 0.4 0.5):"<<endl;
cin >> delta_t;
cout << "the time T:"<<endl;
cin >> Time;
Heat2D myproblem(SIZE,delta_x,delta_t,Time); //創(chuàng)建類
myproblem.SetPhysicalParameters(k_left,k_right,Heat_Capacity,Density); //設(shè)置物理參數(shù)隶症,更改參數(shù)請在本文件頭部更改
myproblem.Solve_and_Write(Time);
return 0;
}
//類的聲明
class Heat2D
{
private:
float m_Size; //大方塊長度
float m_delta_x; //分割長度
int m_N; //分割段數(shù)
float dt; //時間間隔
int m_N_time; //注意這里并非時間,而是時間個數(shù)
float m_t_end; //總時間by Gallien
double m_const_left; //左邊半塊的系數(shù)
double m_const_right; //右邊半塊的系數(shù)
public:
Heat2D(float size,float delta_x,float delta_t,float Time);
void SetPhysicalParameters(float k1,float k2,float c, float rou); //設(shè)置物理參數(shù)的函數(shù)
void Solve_and_Write(float t_end);
};
//成員函數(shù)
#include <stdio.h>
Heat2D::Heat2D(float size,float delta_x,float delta_t,float Time)
{
m_Size = size;
m_delta_x = delta_x;
m_N = (int)(size/delta_x)+1;
dt = delta_t;
m_t_end = Time;
m_N_time =(int)(Time/delta_t);
}
void Heat2D::SetPhysicalParameters(float k1,float k2,float c, float rou)
{
m_const_left = (k1*dt)/(c*rou*m_delta_x*m_delta_x);
m_const_right = (k2*dt)/(c*rou*m_delta_x*m_delta_x);
}
void Heat2D::Solve_and_Write(float t_end)
{
float T[m_N][m_N];
float Tnext[m_N][m_N];
///設(shè)置初始條件/////////////////////////////////////////////////////////////////////////////////////////////
int x,y,t;
for (x = 0;x < m_N;x++)
for (y = 0;y <m_N;y++)
T[x][y]=0.; //先把背景0度給設(shè)了
for (x = 0;x < m_N;x++)
{
T[x][0] = 500.;
T[x][m_N-1] = 500.; //左右邊五百度的賦值
}
for (x = 0;x <m_N;x++)
for (y = 0;y<m_N;y++)
if ( ((x*1.)/(m_N-1)*100 >= 45)&&
((y*1.)/(m_N-1)*100 >= 45)&&
((x*1.)/(m_N-1)*100 <= 55)&&
((y*1.)/(m_N-1)*100 <= 55) )//判斷點是否在2000度的范圍內(nèi),若在岗宣,則賦值
T[x][y] = 2000.;
FILE *fp;
for (t = 0;t <= m_N_time;t++)
{ ///計算下一時刻的方陣/////////////////////////////////////////////////////////////////////////////////
for (x = 1;x < m_N-1;x++) //計算下一時刻除去四邊的值
for(y = 1;y < m_N-1;y++)
{
if (y <= m_N/2) //左側(cè)賦值
Tnext[x][y] = (int)((m_const_left*(T[x-1][y]+T[x+1][y]+T[x][y-1]+T[x][y+1]-4*T[x][y])+T[x][y])*100)/100.;
else //右側(cè)賦值
Tnext[x][y] = (int)((m_const_right*(T[x-1][y]+T[x+1][y]+T[x][y-1]+T[x][y+1]-4*T[x][y])+T[x][y])*100)/100.;
}
for (y = 1;y < m_N-1;y++) //計算Tnext上下邊界的值
{
Tnext[0][y] = Tnext[1][y];
Tnext[m_N-1][y] = Tnext[m_N-2][y];
}
for (x = 0;x < m_N;x++) //為左右邊界賦值
{
Tnext[x][0] = 500.;
Tnext[x][m_N-1] =500.;
}
///為每個時刻創(chuàng)建文件并輸出數(shù)據(jù)///////////////////////////////////////////////////////////////////////////
char name[20];
sprintf(name,"t=%.1fs.txt",t*dt);
fp = fopen(name,"w+");
for (x = 0;x < m_N;x++) //輸出數(shù)據(jù)所用循環(huán)
{
for (y = 0;y <m_N;y++)
fprintf(fp,"%-8.1f",T[x][y]);
fprintf(fp,"\n" );
}
fclose(fp);
printf("OK for t=%-5.1fs !\n", dt*t); //為每個時刻文件輸出成功說明蚂会,若程序出錯則可判斷哪個時刻開始錯誤
///T時刻繼承Tnext的數(shù)據(jù)//////////////////////////////////////////////////////////////////////////////////
for(x = 0;x <m_N;x++)
for(y = 0;y <m_N;y++)
T[x][y] = Tnext[x][y];
}
}