2018.7.17 00:23由于CSDN文章有审核机制,晚上等了两个多小时没人审核,故搬家至此
7.16 Lec5
//链表排序输出输入的整数
//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
{ //要改的地方,老师的程序的这里是把新输入的数放到结尾,应改为判断位置然后插入
Judge1 = pHead; //利用两个指针Judge1,Judge2,byGallien来判断应该插入在哪里
if (pHead->n<i)
{
if (pHead==pEnd) //如果pHead=pEnd,那么链表中此时只有一个数,且前置条件为链表中的那个数小于pNode中存的数
{
pHead->pNext=pNode; //故这里操作为把pNode加在pHead后面
pEnd=pNode;
continue;
}
else
Judge2=pHead->pNext;
}
else
{
oldHead = pHead; //若pNode中的数比pHead中的还小,只需加在pHead前就行
pHead = pNode;
pHead->pNext = oldHead;
continue;
}
while (Judge2->n<i) //此循环用于定位到底该插在哪里,当结构中的n有如下关系时停止:Judge1<pNode<=Judge2
{
if (Judge2 == pEnd) //特殊情况,若pNode比链表中所有数都大,我们就把它接在链表后面
{
pEnd->pNext = pNode;
pEnd = pNode;
goto p1; //因为符合两个Judge中间的插入操作接在循环后面,故特殊情况接在结尾后应跳转至总循环前,故用goto
}
else
{
Judge1 = Judge2; //把Judge1,Judge2往后推一位的操作
Judge2 = Judge2->pNext;
}
}
Judge1->pNext = pNode; //当循环结束的时候,若到了这里,说明已经找到了插入的地方,插入即可
pNode->pNext = Judge2;
} //修改结束
}
}
}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[]) //有参数的主函数,读取字符串
{
FILE *fp, *lock;
char ch;
fp = fopen(argv[1],"r"); //将exe后面第一个字符串作为被打开文件名字
lock = fopen("locked.txt","w+"); //创建一个txt文件用于写入被加密后的文本
if (fp == NULL)
{
printf("can't open %s",argv[1]); //若当前目录无次文件则失败并提醒用户
return 0;
}
while((ch = getc(fp)) != EOF) //读到文件结尾
fprintf(lock,"%c",ch-25); //加密,每个字符对于ASCII码中编码数小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;
}
大作业
main放一个.cpp,类的声明放一个.h,类的实现放一个.cpp里
由于没怎么学过CPP,其实我还是用C的想法来写的这题,完全没有CPP的思想,把老师分的几个模块给统一到了Solve_and_Write里了,所以private里也去掉了T
//需要一个支持C99或者更高标准的编译器
//计算二维方块中特定初始条件下的温度演变数据
//可由用户决定的数据为分割长度(delta_x),间隔时间(delta_t)(0.1-0.5) 和 总时间(T)
//若想修改其他参数则需从本文件宏部分更改然后编译即可
//交了作业后才发现其实老师的频率函数设置是有道理的
//因为这是有限元法,delta_t得取得比较小,如果取大了,甚至会出现负温度的结果
//所以可以优化一下,给输出部分的代码设一个计数器来输出自己想要的间隔
//比如delta_t设为0.5,但是想要10000秒的数据,就可以设每200次(即100s)输出一次
//当然这个最好也是由用户决定,所以还得在用户那里多获取一个参数来确定输出频率
//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); //创建类
myproblem.SetPhysicalParameters(k_left,k_right,Heat_Capacity,Density); //设置物理参数,更改参数请在本文件头部更改
myproblem.Solve_and_Write(Time);
return 0;
}
//类的声明
class Heat2D
{
private:
float m_Size; //大方块长度
float m_delta_x; //分割长度
int m_N; //分割段数
float dt; //时间间隔
int m_N_time; //注意这里并非时间,而是时间个数
float m_t_end; //总时间by Gallien
double m_const_left; //左边半块的系数
double m_const_right; //右边半块的系数
public:
Heat2D(float size,float delta_x,float delta_t,float Time);
void SetPhysicalParameters(float k1,float k2,float c, float rou); //设置物理参数的函数
void Solve_and_Write(float t_end);
};
//成员函数
#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];
///设置初始条件/////////////////////////////////////////////////////////////////////////////////////////////
int x,y,t;
for (x = 0;x < m_N;x++)
for (y = 0;y <m_N;y++)
T[x][y]=0.; //先把背景0度给设了
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度的范围内,若在,则赋值
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) //左侧赋值
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 //右侧赋值
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.;
}
///为每个时刻创建文件并输出数据///////////////////////////////////////////////////////////////////////////
char name[20];
sprintf(name,"t=%.1fs.txt",t*dt);
fp = fopen(name,"w+");
for (x = 0;x < m_N;x++) //输出数据所用循环
{
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的数据//////////////////////////////////////////////////////////////////////////////////
for(x = 0;x <m_N;x++)
for(y = 0;y <m_N;y++)
T[x][y] = Tnext[x][y];
}
}