| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1314 人关注过本帖
标题:我又回来了 ~前几天出事了没写程序 现在看着 突然 看不懂我写的..
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
链表就是一个一个的结,每个结是一个struct数据,读写都是整个struct地read()和write(),唯一要注意的是,在往文件写和读的时候,要按照顺序写、用同样的顺序读,读回来的时候,结点的指针要修改为实际内存的地址(读一个结点分配一个结点的内存,取得它的地址写入链中)。

授人以渔,不授人以鱼。
2011-11-06 01:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
链表在内存中是散的,但写到文件中时一定是顺序的线性表(写下去的时候不用理会那个指针的实际值,读出来时才写上实际内存地址),如果你把数据文件整块地读入,那么全部数据就是一块连续的内存中,这样写指针还更快(但这种做法有点风险,万一内存分配有间隙就会弄坏链表),不要为快而快,安全才是第一位的。

写入、读出,都按照逻辑顺序,不是链表的内存顺序。

授人以渔,不授人以鱼。
2011-11-06 01:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你要安全,并把这个程序写好,最好使用C++的标准库容器vector数据结构,不要再在这种细节上花费太多时间,不值得。

授人以渔,不授人以鱼。
2011-11-06 01:17
零波丽
Rank: 3Rank: 3
来 自:莉莉斯
等 级:论坛游侠
帖 子:222
专家分:107
注 册:2011-9-8
收藏
得分:0 
晕~快停电了~恩 ~明天来看!!该死的学校~

人又是什么?神造出来的东西。 人是人造出来的东西。
2011-11-06 01:17
零波丽
Rank: 3Rank: 3
来 自:莉莉斯
等 级:论坛游侠
帖 子:222
专家分:107
注 册:2011-9-8
收藏
得分:0 
好的~恩 ~C++ 我才看见~输入输出~...当时感觉 好像 有很简单似的~除了类~别的 和C感觉 差不多~
诶 ~该死的台式机~~....

人又是什么?神造出来的东西。 人是人造出来的东西。
2011-11-06 01:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用现成的标准库不必写类,用而已,而且有你所需要的增、删、改、排序、查询算法,其算法效率比任何人教你写的都要高、也更优化。

授人以渔,不授人以鱼。
2011-11-06 01:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你参考一下我这里给出的程序:https://bbs.bccn.net/thread-353858-1-1.html
这是每一行的文字(text)写到文件中,再从文件读回内存增、删、改的,就是专门为你这种需要做的示范程序。

下面是依据上面原理改进得到的界面:
https://bbs.bccn.net/redirect.php?tid=351853&goto=lastpost#lastpost

[ 本帖最后由 TonyDeng 于 2011-11-6 01:34 编辑 ]

授人以渔,不授人以鱼。
2011-11-06 01:27
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:7 
以下是引用TonyDeng在2011-11-6 01:06:08的发言:

链表就是一个一个的结,每个结是一个struct数据,读写都是整个struct地read()和write(),唯一要注意的是,在往文件写和读的时候,要按照顺序写、用同样的顺序读,读回来的时候,结点的指针要修改为实际内存的地址(读一个结点分配一个结点的内存,取得它的地址写入链中)。

你就对链表这点认识?
2011-11-06 09:32
零波丽
Rank: 3Rank: 3
来 自:莉莉斯
等 级:论坛游侠
帖 子:222
专家分:107
注 册:2011-9-8
收藏
得分:0 
hahaha哈哈哈哈 终于完了尼玛的 头晕晕~ TonyDeng 你说的现在就去看~不过C++我确实不太明白是怎么回事 可能才开始 看吧~
程序代码:
# include <stdio.h>//提取输入输出函数 
# include <stdlib.h>//提取fflush(stdin)清空缓冲区以及
# include <malloc.h>//提取动态定义内存的函数
# define student_1 sizeof (struct student)//宏定义结构体的大小方便使用
# define NULL 0//宏定义为0 为了后面的空指针指向链表末尾
# include <windows.h> //暂时不知道为什么定义~一会看见了改正

//首先程序功能是 学生数据管理 所以 需要的功能尽量写上去
//突然发现~ 10天没写的程序是那么的陌生~不知道原来我是怎么的思路~然后~备注写的很烂~我发现~看来需要 改正啊~诶~

void wait_1 (void);//此函数用于输出制作人界面函数无实际作用请忽略
int wait_2 (void);//此函数用于输出主菜单然后调用函数
void wait_3 (void);//此函数用于输出主菜单
int getchar_1 (void);//此函数用于使用户输入一个整数值然后返回其值
int judge_1 (int z);//此函数用于判断用户输入的值 用于主菜单
int judge_no (void);//此函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值
void bigan_1 (int z);//此函数用于对用户的正确输入进行判断调用用户选择的功能(主菜单)
void game_1 (void);//此函数用于用户对第一个功能的选择后调用的函数其功能为定义一个链表并将头指针的值保存然后调用后续函数
struct student * godis (void);//此函数用于建立链表 并返回 头指针 加长!!!!!!!!!!!!!!!!!建立链表的!!!!!!!!!!!!
void wait_1_1 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示
void getchar_1_1 (struct student *);//此函数用于输入姓名函数
void wait_1_2 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示
void getchar_1_2 (struct student *);//此函数用于输入学生性别
void wait_1_3 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示
void getchar_1_3 (struct student *);//此函数用于用户输入学生数学成绩
void wait_1_4 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示
void getchar_1_4 (struct student *);//此函数用于用户输入学生语文成绩
void wait_1_5 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示
void getchar_1_5 (struct student *);//此函数用于用户输入学生英语成绩
void wait_1_6 (void);//此函数用于主菜单第一选择的输入提示 输出用户输入提示
void getchar_1_6 (struct student *);//此函数用于用户输入学生微机成绩
void endschar (void);//无用函数请忽略他吧 为了好看而已
void hello_1 (void);//此函数用于输出学生信息输入完一组后的选项让用户选择
void getchar_1_x (void);//此函数用于让用户输入hello_1的选择并且判断
void judge_1_x (int a);//此函数用于对用户的正确输入进行判断调用用户选择的功能(第一分菜单)
void goto_1 ();//此函数用于继续输入数据
void changes_1_x ();//此函数用于更改先前用户输入的数据
void putchar_1 ();//此函数用于输出先前输入的链表 
void game_2 (void);
void game_3 (void);
void game_4 (void);
void game_5 (void);
void esc_esc (void);



void save_1 (void);//此函数用于函数用于储存信息
void read_1 (void);//此函数用于读取原来程序所保存的值 如果未保存 此函数可以忽略

struct student * head, * p1, * p2; //全局定义结构体指针 方便传递使用以及更改
int i = 1;//定义变量i用于保存学生的学号

struct student//定义结构体 此结构体为学生信息储存及建立链表所需
{
    char name[22];//学生姓名
    char sex[1];//学生性别
    float score_1;//学生数学成绩
    float score_2;//学生语文成绩
    float score_3;//学生英语成绩
    float score_4;//学生微机成绩
    int number;//学生学号
    
    struct student * next;//指向结构体的指针用于建立链表的连接
};

int main (void)//主函数 程序进入口 为了调用后面的菜单和最后结束储存
{
    int a;//定义变量a 用于储存用户对于主菜单的选择
    
    wait_1 ();//调用函数用于输出制作人界面
    a = wait_2 ();//输出主菜单然后调用函数输入以及判断输入信息
    bigan_1 (a);//此函数用于对用户的正确输入进行判断调用用户选择的功能
    save_1 ();//调用函数用于储存信息
    printf ("\n谢谢使用\n");//输出谢谢使用此时函数结束
    free (head);//释放前面的动态内存
    
    return 0;//返回值为0让计算机确认程序结束
}

void wait_1 (void)//此函数用于输出制作人界面函数无实际作用请忽略
{
    printf ("*******************************************************************************\n");
    printf ("*******************************************************************************\n");
    printf ("***            O(∩_∩)O        欢迎使用学生系统      O(∩_∩)O             ***\n");
    printf ("***   O(∩_∩)O                 本系统正在调试期               O(∩_∩)O    ***\n");
    printf ("***            O(∩_∩)O            谢谢使用          O(∩_∩)O             ***\n");
    printf ("**************************************小偌*************************************\n");
    printf ("****************************这个程序的功能会尽力完善***************************\n");
    printf ("**********************************~~~~(>_<)~~~~**************制作人:  小偌*****\n");
    printf ("*******************************************************************************\n");
    printf ("\n\n\n请按回车继续......");
    getchar ();
    system("cls");//清除窗口文字用于方便使用
}

int wait_2 (void)//此函数用于输出主菜单然后调用函数
{
    int z, t;//定义变量z t 用于保存用户输入的值和判断正确后的值
    
    wait_3 ();//输出选择
    z = getchar_1 ();//取的输入值
    t = judge_1(z);//此函数用于判断用户输入的值 用于主菜单
    
    return t;//返回值t 是用户输入正确后的值
}

void wait_3 (void)//此函数用于输出主菜单
{
    printf ("\n\n\n");
    printf ("****************************卍卍卍卍卍卍卍卍卍卍********************************\n");
    printf ("*卍卍卍**卍****/////////****卍1.录入学生数据  卍******/////////******卍卍卍**卍*\n");
    printf ("*****卍**卍****/////////****卍2.学生数据查询  卍******/////////**********卍**卍*\n");
    printf ("*卍卍卍卍卍****/////////****卍3.学生数据更改  卍******/////////******卍卍卍卍卍*\n");
    printf ("*卍**卍********/////////****卍4.数据排序选择  卍******/////////******卍**卍*****\n");
    printf ("*卍**卍卍卍****/////////****卍5.单科成绩查询  卍******/////////******卍**卍卍卍*\n");
    printf ("***************/////////****卍6.退出管理程序  卍******/////////*****************\n");
    printf ("****************************卍卍卍卍卍卍卍卍卍卍********************************\n");
}

int getchar_1 (void)//此函数用于使用户输入一个整数值然后返回其值
{
    int z;//定义变量z用于存储用户输入的值
    
    fflush(stdin);//清空磁盘缓冲区
    printf ("\n\n请输入您的选择后按回车键.......");//提示输入信息
    scanf ("%d",&z);//输入使用整数输入
    system("cls");//清除窗口文字用于方便使用
    
    return z;//返回值z为用户输入的值
}

int judge_1 (int z)//此函数用于判断用户输入的值 用于主菜单
{
    for (;1;)//无限循环直至用户输入正确退出循环
    {
        system("cls");//清除窗口文字用于方便使用
        if (z<1)
        {
            wait_3 ();//输出主菜单让用户确定先前输入
            z = judge_no ();//此函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值
        }
        else if (z>6)
        {
            wait_3 ();//输出主菜单让用户确定先前输入
            z = judge_no ();//此函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值
        }
        else
        {
            break;
        }
    }
    return z;//返回值z是主菜单正确的输入值
}

int judge_no (void)//此函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值
{
    int z;//定义变量z用于存储用户输入的值
    
    printf ("\n对不起,您的输入有误请重新输入...");//提示输入信息
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%d",&z);//输入使用整数输入
    
    return z;//返回值z是用户重新输入的值
}

void bigan_1 (int z)//此函数用于对用户的正确输入进行判断调用用户选择的功能(主菜单)
{
    switch (z)//用于调用用户选择
    {
    case 1:
        {
            game_1 ();//调用函数用于用户对第一个功能的选择后调用的函数其功能为定义一个链表并将头指针的值保存然后调用后续函数
            break;
        }
    case 2:
        {
            game_2 ();
            break;
        }
    case 3:
        {
            game_3 ();
            break;
        }
    case 4:
        {
            game_4 ();
            break;
        }
    case 5:
        {
            game_5 ();
            break;
        }
    default :
        {
            esc_esc ();
        }
    }
}

void game_1 (void)//此函数用于用户对第一个功能的选择后调用的函数其功能为定义一个链表并将头指针的值保存然后调用后续函数
{   
    read_1 ();//读取原来程序所保存的值 如果未保存 此函数可以忽略
    head = godis ();//生成一个链表
    p1 = head;//将头指针的值付给结构体指针
    p2 = head;//将头指针的值付给结构体指针
    head->number = i;//将学号自动加一免除用户输入的麻烦
    getchar_1_1 (p1);//调用函数进行输入
    endschar ();//调用函数输出无用请忽略
    hello_1 ();//调用函数用于输出学生信息输入完一组后的选项让用户选择
    getchar_1_x ();//调用函数其作用为让用户输入hello_1的选择并且判断
}

struct student * godis (void)//此函数用于建立链表 并返回 头指针 加长!!!!!!!!!!!!!!!!!建立链表的!!!!!!!!!!!!
{
    struct student * p;
    p = (struct student *) malloc (student_1);
    return p;
}

void getchar_1_1 (struct student * p1)//此函数用于输入姓名函数 (此处采用连续调用输入方便阅读)
{
    wait_1_1 ();//输出输入提示
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%s", &(p1->name));//输入学生姓名
    printf ("%s", p1->name);//将先前用户的输入输出是用户发现输入错误后及时更改
    getchar_1_2 (p1);//调用函数继续下面的输入
}

void wait_1_1 (void)//此函数用于输出用户输入提示
{
    system("cls");//清屏
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生名字按回车结束......");
}

void getchar_1_2 (struct student * p1)//此函数用于输入学生性别
{
    wait_1_2 ();//输出输入提示
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%s", &(p1->sex));//输入学生性别
    printf ("%s", p1->sex);//将先前用户的输入输出是用户发现输入错误后及时更改
    getchar_1_3 (p1);//调用函数继续下面的输入
}

void wait_1_2 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生性别(如:男)按回车结束......");
}

void getchar_1_3 (struct student * p1)//此函数用于用户输入学生数学成绩
{
    wait_1_3 ();//输出输入提示
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%f", &(p1->score_1));//输入学生数学成绩
    printf ("%f", p1->score_1);//将先前用户的输入输出是用户发现输入错误后及时更改
    getchar_1_4 (p1);//调用函数继续下面的输入
}

void wait_1_3 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生数学成绩按回车结束......");
}

void getchar_1_4 (struct student * p1)//此函数用于用户输入学生语文成绩
{
    wait_1_4 ();//输出输入提示
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%f", &(p1->score_2));//输入学生语文成绩
    printf ("%f", p1->score_2);//将先前用户的输入输出是用户发现输入错误后及时更改
    getchar_1_5 (p1);//调用函数继续下面的输入
}

void wait_1_4 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生语文成绩按回车结束......");
}

void getchar_1_5 (struct student * p1)//此函数用于用户输入学生英语成绩
{
    wait_1_5 ();//输出输入提示
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%f", &(p1->score_3));//输入学生英语成绩
    printf ("%f", p1->score_3);//将先前用户的输入输出是用户发现输入错误后及时更改
    getchar_1_6 (p1);//调用函数继续下面的输入
}

void wait_1_5 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生英语成绩按回车结束......");
}

void getchar_1_6 (struct student * p1)//此函数用于用户输入学生微机成绩
{
    wait_1_6 ();//输出输入提示
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%f", &(p1->score_4));//输入学生微机成绩
    printf ("%f\n", p1->score_4);//将先前用户的输入输出是用户发现输入错误后及时更改

}

void wait_1_6 (void)//此函数用于主菜单第一选择的输入提示 输出用户输入提示
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生计算机成绩按回车结束......");
}

void endschar (void)//无用函数请忽略他吧 为了好看而已
{
    printf ("\n*******************************************************************************\n");
}

void hello_1 (void)//此函数用于输出学生信息输入完一组后的选项让用户选择
{
    printf ("上一位学生信息输入完毕\n");
    printf ("1.继续输入\n");
    printf ("2.更改先前输入(只能更改最后一次输入 谢谢 如需改写前面请回主菜单)\n");
    printf ("3.将先前输入的学生信息输出\n");
    printf ("4.回主菜单\n");
    printf ("*******************************************************************************\n");
    printf ("请选择........");
}

void getchar_1_x (void)//此函数用于让用户输入hello_1的选择并且判断
{
    int a;//定义变量a用于存储用户的输入
    
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%d", & a);//输入整数的用户选择
    for (;1;)//判断用户输入如果正确就进行调用用户选择功能否则提示用户出错并重新输入
    {
        if (a>4)
        {
            a = judge_no ();//调用函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值
        }
        else if (a<1)
        {
            a = judge_no ();//调用函数用于用户在输入错误后提示错误并重新输入然后返回重新输入的值
        }
        else 
        {    
            system("cls");//清屏
            break;
        }
    }
    judge_1_x (a);
}

void judge_1_x (int a)//此函数用于对用户的正确输入进行判断调用用户选择的功能(第一分菜单)
{
    int b;//定义变量b用于储存用户正确输入的值
    
    switch (a)//用于调用用户选择
    {
    case 1:
        {
            goto_1 ();//调用函数用于用户的继续输入
            break;
        }
    case 2:
        {
            changes_1_x ();//调用函数用于用户更改先前的输入
            break;
        }
    case 3:
        {
            putchar_1 ();//调用函数用于输出用户先前输出的值
            break;
        }
    default :
        {
            save_1 ();//调用函数用于储存信息
            b = wait_2 ();//调用函数用于输出主菜单然后调用函数
            bigan_1 (b);//调用函数用于对用户的正确输入进行判断调用用户选择的功能(主菜单)
        }
    }
}

void goto_1 ()//继续输入
{
    p2 = godis ();//调用函数使其生成一个结构体
    p1->next = p2;//将上一个结构体与生成的结构体连接    
    p1 = p2;//将上一个结构体的指针换到下一个结构体
    p1->number = ++i;//学号自加免去用户操作麻烦
    getchar_1_1 (p1);//调用函数用于输入姓名函数 (此处采用连续调用输入方便阅读)
    endschar ();//调用函数输出无用请忽略
    hello_1 ();//调用函数用于输出学生信息输入完一组后的选项让用户选择
    getchar_1_x ();//调用函数用于让用户输入hello_1的选择并且判断
}

void changes_1_x ()//此函数用于更改先前用户输入的数据
{
    getchar_1_1 (p2);//调用函数用于输入姓名函数 (此处采用连续调用输入方便阅读)
    hello_1 ();//调用函数用于输出学生信息输入完一组后的选项让用户选择
    getchar_1_x ();//调用函数用于让用户输入hello_1的选择并且判断
}

void putchar_1 ()//输出 
{
    int j = 0;//定义变量j用于后面for循环的使用 i-1 为实际链表长度
    struct student * p;
    
    p = head;//使指针归于头指针
    for (;j<=i-1;)//循环直到最后一个链表结束
    {
        printf ("学号:%d \n姓名:%s \n性别:%s \n数学成绩:%f \n语文成绩:%f \n英语成绩:%f \n计算机成绩:%f\n",p->number,p->name,p->sex,p->score_1,p->score_2,p->score_3,p->score_4);
        endschar ();//调用函数输出无用请忽略
        p = p->next;//使指针p1指向下一个元素
        j++;//j自加
    }
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    hello_1 ();////调用函数用于输出学生信息输入完一组后的选项让用户选择
    getchar_1_x ();//调用函数用于让用户输入hello_1的选择并且判断
}

void game_2 (void)
{}
    
void game_3 (void)
{}

void game_4 (void)
{}

void game_5 (void)
{}

void esc_esc (void)
{
    printf ("\n\n退出中......");
}

void save_1 (void)//此函数用于函数用于储存信息
{}
void read_1 (void)//此函数用于读取原来程序所保存的值 如果未保存 此函数可以忽略
{}


就附上我第一个C++程序吧

# include <iostream>

int main (void)
{
    int a, b, sum = 0, i;//定义变量哈
    std::cout<<"你好嘿嘿 请输入吧 你懂得 直接点 输入两个数 程序会比大小 然后输出 两个数中间数字的和"<<std::endl<<"请输入...a = ";
    std::cin>>a;
    std::cout<<std::endl<<"请输入...b = ";
    std::cin>>b;
    if (a>b)
    {
        i = b + 1;
        for (;i<a;)
        {
            sum = i + sum;
            i++;
        }
    }
    else if (b>a)
    {
        i = a + 1;
        for (;i<b;)
        {
            sum = i + sum;
            i++;
        }
    }
    else sum = 0;
    std::cout<<std::endl<<sum<<"是他们中间的数字和"<<std::endl;

    return 0;
}

人又是什么?神造出来的东西。 人是人造出来的东西。
2011-11-06 12:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你用它的函数和类就行了,不必全按照它的格式写的。

授人以渔,不授人以鱼。
2011-11-06 12:47
快速回复:我又回来了 ~前几天出事了没写程序 现在看着 突然 看不懂我写的..
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022983 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved