C语言作业

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];
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容