c语言练习2

简单计算器

#include<stdio.h>
int main()
{
    int a=0,b=0;
    char c = 0;
    scanf("%d %c %d",&a,&c,&b);
    if(c=='\\' && b ==0){printf("Divided by zero!");
    }
    else{
        switch(c){
            case '+':printf("%d",a+b);break;
            case '-':printf("%d",a-b);break;
            case '*':printf("%d",a*b);break; 
            case '/':printf("%d",a/b);break;
            default:printf("Invalid operator!");
        }
    }
    return 0;
}

 图书管理系统

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int nCount =0;
typedef struct Node {
    struct Node * Blink;//指向上一个节点 
    struct Node * Flink;//指向下一个节点 
    char BookName[50];
    float BookPrice;
    int BookNumber;
};
struct Node * ndHeaderNode =NULL;//全局的头节点 
struct Node * AppendNode(struct Node * CurrentNode,char * BookName,int BookNumber,float BookPrice)//CurrentNode当前节点 
{
    struct Node * pNewNode = NULL;//一个新节点 
    struct Node * pTempNode = NULL;//一个临时节点 
    struct Node * pHeadNode = CurrentNode;//一个头节点,接收当前节点作为头节点使用 
    pNewNode = (struct Node *)malloc(sizeof(struct Node));//新节点开辟内存,申请一个节点大小的内存 
    if(pNewNode == NULL)//判断新节点是否仍然指向null,如果指向的话,则证明内存申请失效 
    {
        printf("memory malloc failed!\n");
        return pNewNode;
    }
    if(CurrentNode == NULL)//如果当前节点为空,即为一个空链表,插入的节点为头节点 
    {
        CurrentNode = pNewNode;//当前节点也是一块内存,把当前节点指向新申请的内存 
        CurrentNode->Blink = NULL;//当前节点的前节点为空 
        CurrentNode->Flink = NULL;//当前节点的后节点为空,即可证明当前节点为头节点 
    }
    else
    {
        while(pHeadNode->Flink != NULL)//如果头节点的后一个节点不为空,即从第一个节点到最后一个节点依次遍历 
        {
            pTempNode = pHeadNode;//临时的节点指针指向头节点 
            pHeadNode = pHeadNode->Flink;//头节点等于自己的后一个节点 
        }
        pHeadNode->Flink = pNewNode;//循环过后,头节点到达末尾,将新节点的值赋予给头节点 
        pHeadNode->Blink = pTempNode;//将头节点的上一个节点设置为临时节点(之前临时节点就在头节点前面) 
    }
    strcpy(pNewNode->BookName,BookName);//赋予新节点的名字 
    pNewNode->BookPrice = BookPrice;//赋予新节点的价格 
    pNewNode->BookNumber = BookNumber;//赋予新节点的书号 
    pNewNode->Flink=NULL;//使新节点的后一个节点为 
    nCount++;//添加节点的数量 
    return CurrentNode;//返回当前节点,即返回了添加节点之后的节点 
}
void QueryNode(struct Node * HeaderNode,char * BookName)//根据书名去查找 
{
    if(HeaderNode == NULL)//判断头节点是否为空 
    {
        printf("ERROR:HeaderNode == NULL\n");
        return;
    }
    if (strcmp(HeaderNode->BookName, BookName) == 0)
    {
        printf("书名:%s\n", HeaderNode->BookName);
        printf("定价:%f\n", HeaderNode->BookPrice);
        printf("书号:%d\n", HeaderNode->BookNumber);
        return;
    }
//    for(size_t i = 0;i<nNodeCount,i++)
//    {
//        if(strcmp(HeaderNode->BookName,BookName) == 0)
//        {
//            printf("书名:%s\n",HeaderNode->BookName);
//            printf("定价:%f\n",HeaderNode->BookPrice);
//            printf("书号:%d\n",HeaderNode->BookNumber);
//            return; 
//        }
//        HeaderNoder = HeaderNode->Flink;
//    }
    
    while(HeaderNode->Flink != NULL)//判断头节点后面的是否为空 
    {
        HeaderNode = HeaderNode->Flink;//头节点后移一位 
        if(strcmp(HeaderNode->BookName,BookName)==0)//
        {
            printf("书名:%s\n", HeaderNode->BookName);
            printf("定价:%f\n", HeaderNode->BookPrice);
            printf("书号:%d\n", HeaderNode->BookNumber);
            return;
         } 
    }
    printf("Can Not Found!\n");
}

void ModifyNode(struct Node * HeaderNode,char * BookName,float BookPrice)//根据书名修改定价 
{
    if(HeaderNode == NULL)//判断头节点是否为空 
    {
        printf("ERROR:HeaderNode==NULL\n");
        return;
    }
    if(strcmp(HeaderNode->BookName,BookName)==0)//如果头节点和我们输入的参数相等,即不需要向下遍历了 
    {
        HeaderNode->BookPrice = BookPrice;//修改头节点的价格 
        printf("ModifyNode Success!\n");
        return;
    }
    while(HeaderNode->Flink!=NULL)//如果头节点的下一个节点不为空 
    {
        HeaderNode = HeaderNode->Flink;//先把自己,即头节点指向下一个节点,因为头节点的书名已经对比过了 
        if(strcmp(HeaderNode->BookName,BookName)==0)//如果头节点和我们输入的参数相等,即不需要向下遍历了
        {
            HeaderNode->BookPrice=BookPrice;//修改头节点的价格
            printf("ModifyNode Success!\n");
            return;
        }
    }
    printf("ModifyNode Failed!\n");
    return;
 } 
void DeleteNode(struct Node * HeaderNode,char * BookName)
{
    struct Node * pNode = NULL;//定义一个临时节点 
    pNode = HeaderNode;//临时节点指向头节点的地址 
    for(size_t i = 0;i<nCount;i++)// 
    {
        if(strcmp(pNode->BookName,BookName)==0)//判断节临时点的书名字是否与查询的书名相同 
        {
            if(pNode == HeaderNode)//如果发现找到的节点与头节点相同 
            {
                pNode = HeaderNode->Flink;//将临时节点后移到当前这个头节点的下一个节点 
                free(HeaderNode);//释放了头节点的空间 
                ndHeaderNode=pNode;//将全局的头节点指向我们的临时节点,当前的头节点已经没了 
                HeaderNode = ndHeaderNode;//头节点指向全局的头节点 
                nCount--;//数量减一 
                return;
             } 
             if(pNode->Flink==NULL)//删除尾节点,判断这个节点的下一个为空 
             {
                 pNode->Blink->Flink=NULL;//将当前节点的上一个节点的下一个节点设置为null,这样上一个节点就认为自己是尾节点 
                 free(pNode);//free临时节点 
                 nCount--;
                 printf("Delete Success!\n");
                 return;
             }
             //下面是中间的节点 
             pNode->Blink->Flink=pNode->Flink;//临时节点的前一个节点的后一个节点,指向临时节点的后一个节点 
             pNode->Flink->Blink=pNode->Blink;//临时节点的后一个节点的前一个节点,指向临时节点的前一个节点 
             free(pNode);//这样这个临时节点就可以free了 
             nCount--;
             printf("Delete Success!\n");
             return;
        }
        pNode = pNode->Flink;//当前节点等于下一个节点 
    }
}
void WriteFile(struct Node * HeaderNode,char * szFilePath)
{
    struct Node *p = HeaderNode;//定义一个临时节点 
    FILE * w = fopen(szFilePath,"wb");//以写方式打开当前目录下文件,使w指向该文件,可以通过w操作该文件(b,二进制文件) 
    if(w ==NULL)
    {
        printf("open file failed!\n");
        system("pause");//调用操作系统暂停功能 
        fclose(w);
        exit(0);
    }
    while(p)
    {
        printf("%s",p->BookName);
        printf("%f",p->BookPrice);
        printf("%d",p->BookNumber);
        printf("\n");
        fprintf(w,"%s",p->BookName);// fprintf发送格式化输出到流 stream 中
        fprintf(w,"%f",p->BookPrice);
        fprintf(w,"%d",p->BookNumber);
        fprintf(w,"\n");
        p=p->Flink; //p向后移动一位 
    }
    fprintf(w,"\n");
    fclose(w);
    return;
}
struct Node * ReadFile(char * szFilePath)
{
    struct Node * head = (struct Node *)malloc(sizeof(struct Node));//(Node *)malloc(sizeof(Node))是指在malloc成功后返回一个Node类型的指针
    head->Blink = NULL;//头节点前一个为空 
    head->Flink = NULL;//头节点后一个为空 
    char name[50];
    memset(name,0,50);//常用于内存空间初始化。
    float price;
    int number;
    struct Node * p;
    struct Node * q;
    p = q = head;
    FILE * r = fopen(szFilePath,"rb");
    if(r == NULL)
    {
        printf("open file failed!\n");
        system("pause");
        fclose(r);
        exit(0); 
    }
    while(fscanf(r,"%s",name)!=EOF)//在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件
    {
        q = (struct Node *)malloc(sizeof(struct Node));//(Node *)malloc(sizeof(Node))是指在malloc成功后返回一个Node类型的指针
        fscanf(r,"%f",&price);
        fscanf(r,"%d",&number);
        strcpy(q->BookName,name);//string copy(字符串复制)的缩写
        q->BookPrice = price;
        q->BookNumber = number;
        q->Blink = p;//q的前一位为p 
        p=q;
    }
    p->Flink = NULL;//p的后一位为空 
    return head->Flink;//返回头的后一位 
}
void show(struct Node * HeaderNode)
{
    printf("书名:%s\n",HeaderNode->BookName);
    printf("定价:%f\n",HeaderNode->BookPrice);
    printf("书号:%d\n",HeaderNode->BookNumber);
    while(HeaderNode->Flink !=NULL)
    {
        HeaderNode = HeaderNode->Flink;
        printf("书名:%s\n",HeaderNode->BookName);
        printf("定价:%f\n",HeaderNode->BookPrice);
        printf("书号:%d\n",HeaderNode->BookNumber);
    }
}
void Start()
{
    while(1)
    {
        int nFlag = 0;
        int ReadFlag = 0;
        char szBookName[50];
        float fBookPrice = 0;
        float fNewBookPrice = 0;
        int nBookNumber = 0;
        printf("请输入需要使用的功能:\n");
        printf("1.添加书籍信息\n");
        printf("2.查询书籍信息\n");
        printf("3.修改书籍信息\n");
        printf("4.删除书籍信息\n");
        printf("5.将书籍信息存入文件\n");
        printf("6.从文件中读取书籍信息\n");
        printf("7.展示所有书籍信息\n");
        printf("8.退出\n");
        scanf("%d",&ReadFlag);
        switch(ReadFlag)
        {
            case 1:
                printf("请输入书名:");
                scanf("%s",szBookName);
                printf("请输入定价 :");
                scanf("%f", &fBookPrice);
                printf("请输入书号:");
                scanf("%d", &nBookNumber);
                ndHeaderNode = AppendNode(ndHeaderNode,szBookName,nBookNumber,fBookPrice);
                break;
            case 2:
                printf("请输入书名:");
                scanf("%s",szBookName);
                QueryNode(ndHeaderNode,szBookName);
                break;
            case 3:
                printf("请输入书名:");
                scanf("%s", szBookName);
                printf("请输入新的定价:");
                scanf("%f", &fNewBookPrice);
                ModifyNode(ndHeaderNode,szBookName,fNewBookPrice);
                break;
            case 4:
                printf("请输入书名:");
                scanf("%s", szBookName);
                DeleteNode(ndHeaderNode,szBookName);
                break;
            case 5:
                WriteFile(ndHeaderNode,"information.txt");
                break;
            case 6:
                ndHeaderNode = ReadFile("information.txt");
                break;
            case 7:
                show(ndHeaderNode);
                break;
            case 8:
                nFlag =1;
                break;
            }
            
            if(nFlag)
            {
                break;
    }
        
    }
}
int main()
{
    Start();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习和练习C语言可以通过编写和测试不同的demo来提高编程能力。C语言是一种通用的编程语言,广泛应用于各个领域,掌握它可以为今后的工作提供更多的机会和可能性。 在学习C语言的过程中,可以通过编写一些简单的demo来熟悉语言的基本语法和特性。比如,可以从最基础的"Hello World"开始,通过输出一段简单的文本来验证编译器和环境的正确性。然后,可以尝试编写一些算术运算的demo,例如计算两个数字的和、差、乘积和商等。这些简单的demo能够帮助掌握C语言基本的变量、运算符和控制流程等知识点。 随着学习的深入,可以挑战一些稍微复杂一点的demo,例如实现一些简单的排序算法(如冒泡排序、插入排序)或者简单的数据结构(如链表、栈、队列等)的操作。这些练习可以帮助提高编程逻辑和问题解决能力,同时也是对C语言的更深入理解。 除了自己编写demo外,还可以通过参考其他人的代码来学习C语言的一些实际应用。例如,可以在网上搜索一些开源项目或者社区中分享的代码,了解其他人是如何应用C语言进行实际项目开发的。这有助于理解C语言的实际应用场景和开发规范。 总之,通过学习和练习C语言的demo,能够提高编程能力和解决问题的能力。不断挑战自己,不断学习,相信在不久的将来可以在C语言领域取得很大的进步。 ### 回答2: C语言学习的过程中,练习demo是一种非常好的方式。通过练习demo,我们可以巩固和应用所学的知识,提高编程能力和解决问题的能力。 练习demo可以涉及各种不同的主题和难度级别。对于初学者来说,可以从一些简单的案例入手,例如打印一句话、计算两个数的和等。通过这些练习,我们可以熟悉C语言的基本语法和常见的编程方式。 随着我们的学习不断深入,可以挑战一些更具有挑战性的练习demo,例如实现一个简单的计算器、编写一个猜数字的游戏等。这些练习可以帮助我们巩固掌握C语言的各种高级特性,如条件语句、循环语句、函数等。 在练习demo的过程中,我们还可以探索一些实际应用的场景,例如文件操作、网络编程、图形界面等。这些练习可以将我们的C语言能力应用到实际问题中,提高我们的实际编程能力。 此外,还可以参考一些优秀的示例代码和开源项目,通过阅读和理解这些代码,学习他们的编程思想和设计模式,从而提高自己的编程水平。 无论是初学者还是有经验的程序员,练习demo都是学习C语言的重要环节。通过不断地练习和实践,我们可以提高自己的编程能力,培养解决问题的思维方式,最终成为一名优秀的C语言程序员。 ### 回答3: C语言是一门广泛使用的编程语言,学习这门语言可以让我们掌握计算机编程的基础知识和技能。在学习C语言的过程中,练习demo是一个很重要的环节。 练习demo是通过编写小程序来巩固自己所学知识的一种方式。通过练习demo,我们可以将理论知识转化为实际应用,更好地理解和掌握C语言的各种语法和功能。 练习demo可以从简单的程序开始,比如输出"Hello World",逐渐增加难度,涉及到不同的C语言特性,比如条件语句、循环结构、数组、函数等等。我们可以通过编写各种实际场景中可能遇到的问题来练习demo,比如计算器、学生成绩管理系统、图书管理系统等等。 在练习demo的过程中,我们可以尝试不同的解决方法和算法,通过对比和分析不同的实现方式,提高我们的编程思维和解决问题的能力。同时,练习demo也可以帮助我们发现自己的不足之处,及时改进和提升。 此外,练习demo还可以培养我们的耐心和毅力。编写一个完整的程序可能需要很长时间和多次尝试,但坚持下来,最终得到正确的结果,会给我们带来成就感和满足感。 总之,通过练习demo,我们可以在实际操作中加深对C语言的理解和运用,提高编程能力,并为以后实际项目的开发打下坚实的基础。因此,学习C语言时,我们应该勤加练习demo,不断提升自己的编程水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值