学生管理系统(链表+数据库)学习小结

//学生管理系统的小结(另一个版本http://blog.csdn.net/ytz_linuxer/archive/2009/07/18/4358937.aspx)
作者:刘晓兵
语言:C语言,主要是链表的操作,要对数据库进行“读”、“删”、“存”操作
环境:Linux下gcc编译器
数据库:MySQL


小结:
1、sizeof 是运算符,不是函数!
    sizeof对数组和指针数组的不同之处:
    如果是char *m="liudehua";
    sizeof(m)==4
    如果是char m[120]="liudehua";
    sizeof(m)==120
   
2、字符串的赋值函数 strncpy
    strncpy(m,n,sizeof(n));
    值得注意的是sizeof对指针数组而言,她的值永远是4!
    例:
    char *m="liudehua";
    char  n[120];
    strncpy( n, m, sizeof(m));//错误赋值,得不到想要的,只能将"liud"赋给n;
    strncpy( n, m, 10);//赋值正确,可以将"liudehua"赋给n,但这样可能会浪费资源(暂时没有不知道有什么好方法可以解决这个问题)
   
3、学到了一个新的SQL语句:
    清空数据表效率最高的函数:TRUNCATE TABLE '表名';
    这个比Delete删除方式快非常多并且很简单,不留日志!

4、 malloc_usable_size(p1)
    用free(p)释放内存,怎样知道你的free(p)起作用了?真正释放了?
    在Linux下gcc编译器中用malloc_usable_size(p)可以计算指针p所指向的内存区大小(好像有点偏大);
    在windows下用_msize(p)可以比较准确的计算指针p所指向的内存区大小
    eg:
    /
    int len = malloc_usable_size(p1);  /*释放前p1占用的空间长度*/
    free(p1);                            /*释放p1指向的空间*/
    int alen = malloc_usable_size(p1);/*释放后p1占用的空间长度*/
    printf("%d %d/n",len,alen);/*打印出释放前后的对比效果*/
    //

5、掌握了链表的运行原理,对指针也有更深入的理解!也学会了用C语言链接数据库。

 

6、思想上的问题:
    这些天事情比较多,也比较杂,有些事情搞的很不爽,就天天没做事情,一个学生管理系统做到现在了!
    估计有10天了吧!其实真正做事情的时间也就两三天时间!
    分析了一下自己的原因:
    自己的思想不够~紧迫!最开始是刚考试完,想休息一下,不想做事情!
    过了两天老爸要我回家,又犹豫着回不回去,后来又是博创的比赛需要图片我又帮着制作!
    好像一有什么杂事情,就静不下心来做正事了!
    要改!

附:代码(初学水平)

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include"/usr/include/mysql/mysql.h"
#include "/usr/include/mysql/mysql_version.h"
#include "/usr/include/mysql/errmsg.h"
#define LEN sizeof(struct student)
MYSQL*stumysql;
MYSQL_RES*stures;
MYSQL_ROW row;

struct student
{
    int num;
    char name[12000];
    float score1;
    float score2;
    float everange;
    struct student *next;
};
struct student *head;
int n;
void insert_stu();    /*添加信息*/
void delete_stu();    /*删除信息*/
void modify_stu();    /*修改信息*/
void selecte_stu();    /*查看个人信息*/
void everange_stu();/*计算平均分*/
void save_stu();    /*保存*/
void save();         /*保存到数据库*/
void print();        /*输出head的函数*/
void logout();        /*退出*/
void switch_stu();    /*主菜单*/
/*main.c*/
int main()
{   
   
    struct student *p1,*p2;
    int j;
    unsigned long i;
    n=0;
    stumysql=mysql_init(NULL);                                  /*实现数据库连接*/
    if(mysql_real_connect(stumysql,"localhost","root","123456","student",0,NULL,0))
    {
            printf("Connect Successfully!数据库连接成功!/n");
    }
    else
    {
            printf("Connect Failed!数据库连接失败!/n");
    }
    if(!mysql_query(stumysql,"select * from stu_info order by num"))
    {
        stures=mysql_store_result(stumysql);
        i=mysql_num_rows(stures);
        p1=p2=( struct student* )malloc(LEN);
        head = NULL;
        for(j=0;j<i;j++)
        {
            row=mysql_fetch_row(stures);
            p1->num = atoi(row[1]);
            strncpy(p1->name,row[2],15);
            //printf("%s,%s/n",row[2],p1->name);
            p1->score1 = atof(row[3]);
            p1->score2 = atof(row[4]);
            p1->everange = atof(row[5]);
            n=n+1;
            if(n==1)
            {
                head=p1;
            }
            else
            {
                p2->next=p1;
            }
            p2=p1;
            p1=(struct student *)malloc(LEN);
        }
        p2->next=NULL;
    }
    print(head);
    switch_stu();
    mysql_close(stumysql);
    //printf("mysql close");
    return 0;
}
/*switch_stu()*/
void switch_stu()
{   
    int a;
    printf("请选择您要进行的操作:/n");
    printf("1、插入信息  2、删除信息  3、修改信息(按学号)/n");
    printf("4、查看个人信息(按学号)  5、保存信息  0、退出系统/n输入相应序号进行操作:");
    scanf("%d",&a);
    switch(a)
    {
        case 0:
        {
            //printf("退出系统/n");
            logout();
            break;
            }
        case 1:
        {
            insert_stu();
            break;
        }
        case 2:
        {
            delete_stu();
            break;
        }
        case 3:
        {
            //printf("modify_stu/n");
            modify_stu();
            break;
        }
        case 4:
        {
            //printf("everange_stu/n");
            selecte_stu();
            break;
        }
        case 5:
        {
            //printf("save/n");
            save_stu();
            break;
        }
        default :
        {
            printf("输入有误!重新输入:/n");
            switch_stu();
        }
    }
}
/*print.c*/
void print(struct student * head)
{   
    struct student *p;
    printf("/n现在有%d条记录 :/n",n);
    printf("num   name        score1 score2 everange/n");
    p=head;
    if(head!=NULL)
        while(p!=NULL)
        {
            printf("%1d %-12s %-6.1f %-6.1f %-6.1f/n",p->num,p->name,p->score1,p->score2,p->everange);
            p=p->next;
        }
}

/*insert_stu()*/
void insert_stu()
{        struct student *stud;
        struct student *p0,*p1,*p2 = NULL;
        printf("请输入信息(以一个或多个空格隔开,输入0_0_0_0返回主界面):/nnum   name   score1   score2/n");
        stud=(struct student *)malloc(LEN);
        scanf("%ld %s %f %f",&stud->num,&stud->name,&stud->score1,&stud->score2);
        if(stud->num != 0)
        {
            p1=head;
            p0=stud;
            if(head==NULL)
            {
                head=p0;
                p0->next=NULL;
            }
            else
            {
                while((p0->num > p1->num)&&(p1->next!=NULL))
                {
                    p2=p1;
                    p1=p1->next;
                }
                if(p0->num < p1->num)
                {
                    if(head==p1)
                        head=p0;
                    else
                        p2->next=p0;
                    p0->next=p1;
                }
                else if(p0->num > p1->num)
                {
                    p1->next=p0;
                    p0->next=NULL;
                }
                else if(p0->num == p1->num)
                {
                    printf("您输入的学号已经存在,返回/n");
                    print(head);
                    switch_stu();
                    goto end;
                }
            }
            n=n+1;
            everange_stu();
            goto end;
        }
        else
        {
            switch_stu();
            goto end;
        }
        end:
        printf("");
}
/*delete_stu()*/
void delete_stu()
{
    int num;
    struct student *p1,*p2;
    printf("请输入要删除的学号:/n");
    scanf("%d",&num);
    if (head==NULL)
    {
        printf("/nlist null!/n");
        goto end;
    }
    p1=head;
    while(num!=p1->num && p1->next!=NULL)
    {
        p2=p1;p1=p1->next;
    }
    if(num==p1->num)
    {
        if(p1==head)    /*释放头结点*/
        {
            head=p1->next;                       
            int len = malloc_usable_size(p1);  /*释放前占用的空间长度*/
            free(p1);                            /*释放p1指向的空间*/
            //int lenn = malloc_usable_size(p1);/*释放后占用的空间长度*/
            //printf("%d %s %d/n",len,p1->name,lenn);/*打印出释放前后的对比效果*/
            printf("释放的空间有:%d/n",len);
        }
        else    /*释放非头结点*/
        {
            p2->next=p1->next;
            int alen = malloc_usable_size(p1);/*释放前占用的空间长度*/
            free(p1);                            /*释放*/
            //int alenn = malloc_usable_size(p1);/*释放后占用的空间长度*/
            //printf("%d %s %d/n",alen,p1->name,alenn);/*打印出释放前后的对比效果*/
            printf("释放的空间有:%d/n",alen);
        }   
        printf("删除%d成功!/n",num);
        n=n-1;
    }
    else
        printf("学号%d不存在!/n",num);
    end:
    //return (head);
    print(head);
    switch_stu();
}
/*modify_stu()*/
void modify_stu()
{
    int num;
    struct student *p1,*p2;
    printf("请输入学号以修改相应信息:/n");
    scanf("%d",&num);
    if (head==NULL)
    {
        printf("/nlist null!/n");
        goto end;
    }
    p1=head;
    while(num!=p1->num && p1->next!=NULL)
    {
        p2=p1;p1=p1->next;
    }
    if(num==p1->num)
    {
        if(p1==head)    /*释放头结点*/
        {
            head=p1->next;                       
            //int len = malloc_usable_size(p1);  /*释放前占用的空间长度*/
            free(p1);                            /*释放p1指向的空间*/
            //int lenn = malloc_usable_size(p1);/*释放后占用的空间长度*/
            //printf("%d %s %d/n",len,p1->name,lenn);/*打印出释放前后的对比效果*/
            //printf("释放的空间有:%d/n",len);
        }
        else    /*释放非头结点*/
        {
            p2->next=p1->next;
            //int alen = malloc_usable_size(p1);/*释放前占用的空间长度*/
            free(p1);                            /*释放*/
            //int alenn = malloc_usable_size(p1);/*释放后占用的空间长度*/
            //printf("%d %s %d/n",alen,p1->name,alenn);/*打印出释放前后的对比效果*/
        }   
        //printf("删除%d成功!/n",num);
        n=n-1;
        insert_stu();
    }
    else
        printf("学号%d不存在!/n",num);
    end:
        printf("");
}

/*selecte_stu()*/
void selecte_stu()
{
    int num;
    struct student *p1,*p2;
    printf("请输入学号:");
    scanf("%d",&num);
    if (head==NULL)
    {
        printf("/n没有信息!/n");
        goto end;
    }
    p1=head;
    while(num!=p1->num && p1->next!=NULL)
    {
        p2=p1;p1=p1->next;
    }
    if(num==p1->num)
    {
        printf("%ld %-10s %5.1f %5.1f %5.1f/n",p1->num,p1->name,p1->score1,p1->score2,p1->everange);
    }
    else
        printf("学号%d不存在!/n",num);
    end:
        switch_stu();
}
/*everange_stu()*/
void everange_stu()
{   
    int j;
    struct student *p1,*p2;
    if ( head == NULL)
    {   
        printf("链表为空!退出!");
        goto end ;
    }
    p1 = head;
    for ( j=0; j < n; j++)
    {
        p1->everange = (p1->score1 + p1->score2) / 2;
        p2 = p1;
        p1 = p1->next;
    }
    end:
    print(head);
    switch_stu();
}
/*save_stu()*/
void save_stu()
{
    save();
    switch_stu();
}
/*logout()*/
void logout()
{
    int a,j;
    struct student *p1;
    printf("退出前是否保存?1保存/0直接退出/n");
    scanf("%d",&a);
    if( a!=0 )
    {
        save();
        printf("已经存入数据库!/n");
    }   
    for( j=0; j < n; j++ )
    {   
        p1 = head;
        head=p1->next;
        //int len = malloc_usable_size(p1);  /*释放前占用的空间长度*/
        free(p1);                            /*释放p1指向的空间*/
        //int lenn = malloc_usable_size(p1);/*释放后占用的空间长度*/
        //printf("%d %s %d/n",len,p1->name,lenn);/*打印出释放前后的对比效果*/
        //printf("释放的空间有:%d/n",len);
    }
   
    printf("退出成功!/n");
}
/*save()*/
void save()
{
    int a,j;
    char query[256];
    struct student *p1,*p2;
    if (head == NULL)
    {
        printf("链表为空,是否清空数据表!(1清空/0取消)/n");
        scanf("%d",&a);
        printf("%d/n",a);
        if( a == 1)
        {
            if(!mysql_query(stumysql,"TRUNCATE TABLE stu_info"))
            {
                printf("数据表stu_info已经清空!/n");
            }
        }
        else if( a == 0)
        {
            printf("返回/n");
            goto end;
        }
    }
    p1 = head;
    /*if(!mysql_query(stumysql,"TRUNCATE TABLE stu_info"))
    {
        printf("数据表stu_info已经清空!/n");
    }*/
    mysql_query(stumysql,"TRUNCATE TABLE stu_info");
    for ( j=0; j < n; j++)
    {   
        sprintf(query,"insert into stu_info(num,name,score1,score2,everange) values('%ld','%s','%5.1f','%5.1f','%5.1f')",p1->num,p1->name,p1->score1,p1->score2,p1->everange);
        //printf("%s/n",query);
        mysql_query (stumysql,query);
        p2 = p1;
        p1 = p1->next;
    }
    printf("保存成功!数据已经存入数据库!/n");
    end:
    print(head);
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值