| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 569 人关注过本帖
标题:无语了 暂时 混乱至极
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在这里贴给你吧,看思路(留意如何写出方便调用者使用的界面,菜单项用填表方式很容易修改维护扩充,扩充部分如增加函数指针则可避用switch,而且菜单函数是可以反复使用的),不要死抄代码。

这里是使用点:
程序代码:
VOID wmain(VOID)
{
    screen.SetTitle(L"学生管理系统");
    screen.SetTextAttribute(FOREGROUND_WHITE | BACKGROUND_BLUE);
    screen.Cls();

    const MENU main_menu[] = {
        {L'1', L"1.录入学生信息"},
        {L'2', L"2.添加学生信息"},
        {L'3', L"3.删除学生信息"},
        {L'4', L"4.显示学生信息"},
        {L'0', L"0.结束程序返回"},
        {L'\0'}
    };
    int choice;
    do
    {
        choice = Menu(main_menu, 2, 2, FOREGROUND_WHITE | BACKGROUND_GREEN, FOREGROUND_YELLOW | BACKGROUND_RED);
        switch (choice)
        {
        case 1:
            Input_Data();
            break;
        }
    } while (choice != 0);
}


头文件my_tools.h:
程序代码:
#ifndef MYTOOLS_H
#define MYTOOLS_H

#include <string>

// 统计宽字符串中字符数
size_t CountByAnsi(const WCHAR* string);

// 暂停等待,按Esc键继续
VOID Pause(VOID);

// 检测是否ASCII字符
BOOL IsAscii(const WCHAR character);
// 检测是否汉字
BOOL IsHz(const WCHAR character);

// 菜单
typedef struct _MENU
{
    WCHAR Key;
    std::wstring Bar;
} MENU;
int Menu(const MENU menu[], const SHORT x, const SHORT y, const WORD text_attr, const WORD get_attr);

#endif


头文件接口的实现部分my_tools.cpp:
程序代码:
int Menu(const MENU menu[], const SHORT x, const SHORT y, const WORD text_attr, const WORD get_attr)
{
    size_t bar_width(0);
    size_t bar_number(0);
    while (menu[bar_number].Key)
    {
        size_t number(CountByAnsi(menu[bar_number].Bar.c_str()));
        if ( number > bar_width)
        {
            bar_width = number;
        }
        ++bar_number;
    }

    WORD old_attr(screen.GetTextAttribute());
    screen.SetTextAttribute(text_attr).Box(x, y, x + bar_width + 1, y + bar_number + 3, text_attr);

    for (size_t index = 0; index != bar_number; ++index)
    {
        screen.MoveCursor(x + 2, y + index + 1).WriteText(menu[index].Bar);
    }
    screen.MoveCursor(x + 2, y + bar_number + 2).WriteText(L"选择:");

    screen.SetTextAttribute(get_attr);
    COORD pos(screen.GetCursorPosition());
    WCHAR choice;
    BOOL finish(false);
    while (!finish)
    {
        screen.MoveCursor(pos).WriteText(L' ');
        choice = screen.MoveCursor(pos).ReadKey();
        for (size_t index = 0; index != bar_number; ++index)
        {
            if (choice == menu[index].Key)
            {
                screen.MoveCursor(pos).WriteText(choice);
                finish = true;
                break;
            }
        }
    }
   
    screen.SetTextAttribute(old_attr);

    return choice - L'0';
}

授人以渔,不授人以鱼。
2011-10-25 15:11
零波丽
Rank: 3Rank: 3
来 自:莉莉斯
等 级:论坛游侠
帖 子:222
专家分:107
注 册:2011-9-8
收藏
得分:0 
好的 刚才 又 读了 一下 程序 发现 功能都写重了 .....
诶 几天 写的 就是 思路 跟不上 诶
我去研究研究 希望能写出  起码 能上眼的 程序 恩 加油 闭关!

人又是什么?神造出来的东西。 人是人造出来的东西。
2011-10-25 15:16
零波丽
Rank: 3Rank: 3
来 自:莉莉斯
等 级:论坛游侠
帖 子:222
专家分:107
注 册:2011-9-8
收藏
得分:0 
好了 首先  我看了看 竟然发现 不确定 是否是 C语言 ....我没见过 那种 东西
然后 没用成 TonyDeng 兄 怎么办了?~
然后 用原来的 方法 没BUG的 写完了 第一个 选项 然后 感觉 首先 代码 过于长了 其二 感觉 应该有很多地方 可以省略的 或者 简短 没办法
所以 这方面的 书 必须 学学了 然后 hellovfp 兄  你的 那本书 我会看的 这个 周末就去看 尽量能用上去  或者 以后 在写 一个 反正 TonyDeng 也说过 起码能够 改正一年 所以 不急
我觉得 要是 写出来 的 东西  要是 别人 肯去 试试 或者是 用用的 界面?~还不会 以后 一会 加上 做一个东西 就要把它 做到 完美的 说 所以 加油了 闭关 下午没去上课 一个 爽啊 ~哈哈
程序代码:
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# define student_1 sizeof (struct student)
# define NULL 0
# include <windows.h>

//首先程序功能是 学生数据管理 所以 需要的功能尽量写上去

void esc_esc (void);
void hello_1 (void);
struct student * head, * p1, * p2;
void wait_3 (void);
void getchar_1_1 (struct student *);
void getchar_1_2 (struct student *);
void getchar_1_3 (struct student *);
void getchar_1_4 (struct student *);
void getchar_1_5 (struct student *);
void getchar_1_4 (struct student *);
void wait_1_1 (void);
void wait_1_2 (void);
void wait_1_3 (void);
void wait_1_4 (void);
void wait_1_5 (void);
void wait_1_6 (void);
void endschar (void);
void getchar_1_x (void);
void hello_1 (void);
void judge_1_x (int );
void wait_1 (void);//首先调用进入的窗口
int wait_2 (void);//用户选择输入函数 (主菜单)
void bigan_1 (int z);//判断选择
int i = 2;

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 judge_no (void)//错误后输入
{
    int z;
    printf ("\n对不起,您的输入有误请重新输入...");
    fflush(stdin);//清空磁盘缓冲区
    scanf ("%d",&z);
    return z;
}

void changes (struct student * p1,struct student * p2)//此函数用于更改链表 思路 源于 TonyDeng兄
{
    
}

struct student * godis (void);

void changes_1 (struct student * p, struct student * n)//此函数用于连接链表 
{
    p->next = n;
}

void goto_1 ()//继续输入
{
    struct student * p;
    p2->next = p = godis ();
    p2 = p;
    p->number = i++;
    getchar_1_1 (p);
    endschar ();
    hello_1 ();
    getchar_1_x ();
}
void changes_1_x ()//更改的
{
    getchar_1_1 (p2);
    hello_1 ();
    getchar_1_x ();
}
void putchar_1 ()//输出 
{
    int j = 0;
    p1 = head;
    for (;j<i-1;)
    {
        printf ("姓名:%s \n性别:%s \n数学成绩:%f \n语文成绩:%f \n英语成绩:%f \n计算机成绩:%f\n", p1->name,p1->sex,p1->score_1,p1->score_2,p1->score_3,p1->score_4);
        endschar ();
        p1 = p1->next;
        j++;
    }
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    hello_1 ();
    getchar_1_x ();
}

void judge_1_x (int a)
{
    int 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 getchar_1_x (void)//判断 
{
    int a;
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    scanf ("%d", & a);
    for (;(a<=4)||(a>=1);)
    {
        if (a>4)
        {
            a = judge_no ();
        }
        else if (a<1)
        {
            a = judge_no ();
            
        }
        else 
        {    
            system("cls");//清屏
            break;
        }
    }
    judge_1_x (a);
}

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

void save_1 (void)
{}

void read_1 (void)
{}

void endschar (void)
{
    printf ("\n*******************************************************************************\n");
}

void wait_1_6 (void)
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生计算机成绩按回车结束......");
}

void wait_1_5 (void)
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生英语成绩按回车结束......");
}

void wait_1_4 (void)
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生语文成绩按回车结束......");
}

void wait_1_3 (void)
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生数学成绩按回车结束......");
}

void wait_1_2 (void)
{
    printf ("\n");
    printf ("*******************************************************************************\n");
    printf ("你好欢迎使用\n请输入学生性别(如:男)按回车结束......");
}

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

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

void getchar_1_6 (struct student * p)
{
    wait_1_6 ();
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    scanf ("%f", &(p->score_4));
}

void getchar_1_5 (struct student * p)
{
    wait_1_5 ();
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    scanf ("%f", &(p->score_3));
    getchar_1_6 (p);
}

void getchar_1_4 (struct student * p)
{
    wait_1_4 ();
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    scanf ("%f", &(p->score_2));
    getchar_1_5 (p);
}

void getchar_1_3 (struct student * p)
{
    float * k;
    k = &p->score_1;
    wait_1_3 ();
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    scanf ("%f", k);
    printf ("%f",* k);
    getchar_1_4 (p);
}

void getchar_1_2 (struct student * p)
{
    wait_1_2 ();
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    scanf ("%s", &(p->sex));
    printf ("%s", p->sex);
    getchar_1_3 (p);
}

void getchar_1_1 (struct student * p)//输入姓名函数 首先 这个 地方 需要 考虑的 是 要是 没有 输入的 话 这个 函数 会生成 一个 链表 所以 这里 采用 一个 函数 来建立链表 最好
{
    wait_1_1 ();//输出选择
    fflush(stdin);//清空磁盘缓冲区 便于重复使用 以及 不影响后面
    scanf ("%s", &p->name);
    printf ("%s", p->name);
    getchar_1_2 (p);
}

void game_1 (void)//一号选择 函数(一号选择主函数 用于定义第一个链表传递值给予输入函数)
{   
    struct student * p;
    read_1 ();//读取
    p = head = p1 = p2 = godis ();
    head = p;
    head->number = 1;
    getchar_1_1 (p);
    endschar ();
    hello_1 ();
    getchar_1_x ();
}

void game_2 (void)
{
}








void game_3 (void)
{}

void game_4 (void)
{}

void game_5 (void)
{}

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

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 ();
        }
    }
}

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;
}

int getchar_1 (void)//输入
{
    int z;
    fflush(stdin);//清空磁盘缓冲区
    printf ("\n\n请输入您的选择后按回车键.......");
    scanf ("%d",&z);
    system("cls");//清屏
    
    return z;
}

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 wait_2 (void)//用户选择输入函数 (主菜单)
{
    int z, t;
    wait_3 ();//输出选择
    z = getchar_1 ();//取的输入值
    t = judge_1(z);
    return t;
}

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 main (void)
{
    int a;
    wait_1 ();//首先调用进入的窗口
    a = wait_2 ();//调用录入函数
    bigan_1 (a);//判断选择
    save_1 ();
    printf ("\n谢谢使用\n");
    free (head);
    return 0;
}

对于 代码 建议 不要看了 我自己 都看着 吃力 只是 附带上 而已
最后 我想说 草泥马 这个 破学校 上课 和高中一样!

人又是什么?神造出来的东西。 人是人造出来的东西。
2011-10-25 17:09
吴军旗
Rank: 5Rank: 5
等 级:职业侠客
帖 子:286
专家分:308
注 册:2011-9-14
收藏
得分:0 
怎么这么多啊,看不下去。。。。。。。。。。

最惨的不是忘不了悲伤的回忆,而是那些悲伤的回忆却开始记不清。。。
2011-10-25 17:12
零波丽
Rank: 3Rank: 3
来 自:莉莉斯
等 级:论坛游侠
帖 子:222
专家分:107
注 册:2011-9-8
收藏
得分:0 
一般般吧 好看点 就这样了

人又是什么?神造出来的东西。 人是人造出来的东西。
2011-10-25 17:13
快速回复:无语了 暂时 混乱至极
数据加载中...
 
   



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

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