DEVC怎么建工程

Stella981
• 阅读 266

#1.DEVC建工程 ##1.1 新建项目 打开文件,选择新建-->项目-->ConsoleApplication(控制台程序),输入项目名,选择保存路径。(单独建一个文件夹存放) DEVC怎么建工程

项目建成功后,打开项目管理,看到自动生成的一个main文件。注意每个项目只能有一个main函数,是系统的入口。默认main.cpp已经包含main函数,其他文件不能再有main函数。 DEVC怎么建工程

##1.2 工程中新建c文件 项目管理中,右击项目名,选择New File,则可以在项目新建一个c或头文件。比如新建头文件,可以头文件写结构体定义、函数声明内容后,选择保存类型为*.h即可生成头文件 DEVC怎么建工程 项目管理中多了自定义头文件student.h。其他c文件生成一样操作。

我们会生成了项目,但是如何把多个文件用项目管理一起呢,现在以学生管理系统为例。

#2.多文件的C语言系统示例--学生成绩管理 示例功能比较简单,主要实现功能:

  • 读取学生文件数据
  • 修改学生成绩
  • 控制台上展示学生数据
  • 保存数据到文件中

设计3个文件实现该系统。

  • 头文件student.h:封装结构体定义、函数声明
  • blog.c:函数具体实现,包括文件读取、数据展示等功能
  • main.c:实现菜单操作,功能函数调用

3个文件实现不同功能。函数定义和函数实现分2个文件实现。更好封装数据类型。main文件主要做函数调用。

文件数据:blog_score.txt

具体数据,如图所示: DEVC怎么建工程

看到上述数据,每行数据代表一个学生记录,故可以用结构体封装,具体见2.1节介绍。 ##2.1 头文件student.h 头文件主要结构体定义、函数声明。也就是数据表达这块,可以写在头文件中。不要在头文件定义变量,因为其他c文件也要包含头文件,如果多次包含,容易出现变量重定义。如学生系统头文件如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
    char stuNum[13]; //学号 
    char stuName[8];//姓名 
    double score[8];//成绩 
}STU;//定义结构体类型 
int ReadSTUFile(FILE *fp,STU stu[]); //读取文件数据 
void PrintSTU(STU stu[],int total);//展示数据,total表示学生数量 
void UpdateSTU(STU stu[],int total);//修改成绩 
int FindSTU(STU *stuPtr,int total,const char *stuName,int *loc);//按学号查找数据 
void SaveSTUFile(STU *stuPtr,int total,FILE *fp);//保存数据到文件 

建议:如果你的系统功能比较复杂,而且读取又是多个文件,每个文件代表不同类型数据,可以每种数据类型封装一个自定义头文件。这有点像面向对象类的概念,头文件就像类的接口,把函数具体实现封装了,只展示函数的接口。 ##2.2 函数实现文件blog.c 在头文件中定义函数,其实现尽量封装在一个独立c文件中,后续要修改,只要找对应c文件修改即可,这样避免我们的主文件main.c过长。具体实现函数为:

  • 读取文件数据函数

  • 修改结构体数据

  • 查找数据

  • 写入数据到文件

    #include "student.h" int ReadSTUFile(FILE *fp,STU stu[]) { int i=0,j; while(!feof(fp)) { fscanf(fp,"%s%s",stu[i].stuNum,stu[i].stuName); for(j=0;j<3;j++) fscanf(fp,"%lf",&stu[i].score[j]); i++; } return i; } void UpdateSTU(STU stu[],int total) { char stuName[20];//存放更改学号 int courseID;//更改课程号,从1开始编号,数组编号从0开始 double score;//更改成绩 int loc;//记录在数组编号 printf("输入更改学号:"); scanf("%s",stuName); if(FindSTU(stu,total,stuName,&loc))//找到 { printf("输入修改课程号:"); scanf("%d",&courseID); printf("输入修改成绩:"); scanf("%lf",&score); stu[loc].score[courseID-1]=score;//修改结构体中对应数据。 } else { printf("\n没有该学生!\n"); } } int FindSTU(STU *stuPtr,int total,const char *stuNum,int *loc) { int i=0,j; for(i=0;i<total;i++,stuPtr++) { if(strcmp(stuPtr->stuNum,stuNum)==0) //找到记录 { *loc=i;//记住找到的记录编号 return 1; } } return 0; } void PrintSTU(STU stu[],int total) { int i=0,j; for(i=0;i<total;i++) { printf("%s %s",stu[i].stuNum,stu[i].stuName); for(j=0;j<3;j++) printf(" %lf ",stu[i].score[j]); printf("\n"); } } void SaveSTUFile(STU *stuPtr,int total,FILE *fp) { int i=0,j; rewind(fp);//文件前面读后,在文件尾,所以得重新定位文件指针。 for(i=0;i<total;i++,stuPtr++) { fprintf(fp,"%s %s",stuPtr->stuNum,stuPtr->stuName); for(j=0;j<3;j++) fprintf(fp," %.1f ",stuPtr->score[j]); if(i<total-1) fprintf(fp,"%s","\n"); // 最后一行不写空行 } printf("\n文件保存成功!!\n"); }

这里注意就是:

  • blog.c文件中用到结构体类型及一些库函数,所以这个文件需要把自定义头文件包含进来。#include "student.h"
  • 上述文件读取是用fscanf函数,不过对于结构体数据的增删改,还是用随机文件访问更快,建议用fread和fwrite读写数据。
  • 这个文件里面可以继续扩展多学生数据增删改实现函数。
  • 感谢林颖贤老师的指正,原SaveSTUFile文件里面多写了换行符,导致文件再次读出,最后一行是0。

##2.3 主函数文件main.c 主要实现分散在各个c文件中的函数调用及一些主要数组、全局变量定义。

#include "student.h" 
void Menu();
int main(void)
{
     FILE *fp;
    int sel;//输入选择菜单操作 
    STU students[100];
    int total;
    if((fp=fopen("blog_score.txt","r+")) == NULL)
    {     
           printf("File open error!\n"); exit(0);
    }
    total=ReadSTUFile(fp,students);//读文件 
    while(1) 
    {
        Menu();
        scanf("%d",&sel);
        if(sel==0) break;
        switch(sel)
        {
            case 1:UpdateSTU(students,total);break;//修改成绩
        case 2: PrintSTU(students,total); break;//展示成绩 
        case 3:SaveSTUFile(students,total,fp);break;//保存成绩 
    }
        system("pause");//dos命令暂停
        system("cls");//dos命令清屏
    }   
    fclose(fp);
    return 0;
}
void Menu()
{
    printf("1:修改成绩\n");
    printf("2:展示成绩\n");
    printf("3:保存成绩\n");
    printf("0:退出\n");    
    printf("\n输入操作项:");
} 

main文件一样要包含#include "student.h",数组不建议设为全局数组,虽然多个函数共享,但是由于多文件,容易出错。建议用数组地址做函数参数传递,效率更高。注意点:

  • 菜单单独封装一个函数,确实比较好用,如果需要修改菜单选项,只要Menu函数修改即可。这个学习班上同学做法。确实不错。
  • 保存文件单独一个菜单,提示用户注意数据保存。也把文件写入单独一个函数去完成。
  • 文件打开方式用w+,数据会被清空,所以用'r+',才能覆盖,重新写入。
  • 菜单加了清屏操作,可视化更好!

至此,项目所有文件创建完毕,可以编译运行测试。

#3.小结 综合设计中,一般我们是给一个文件数据,如: DEVC怎么建工程

  • 学会用C语法对文件数据的表达,即如何保存数据。可以定义结构体表示每条数据。

  • 学会文件中数据读取,存入结构体数组,如上述的int ReadSTUFile(FILE *fp,STU stu[]);函数

  • 学会在结构体数组增删改、查找、排序操作。可参考浙大版C教材P255内容,或上述函数

    void UpdateSTU(STU stu[],int total);//修改成绩 int FindSTU(STU *stuPtr,int total,const char *stuName,int *loc);//按学号查找数据

  • 学会结构体数据写入文件操作。如void SaveSTUFile(STU *stuPtr,int total,FILE *fp)

#4.项目文件容易出现问题

  • 自定义头文件定义变量,其他文件又都包含头文件,导致变量多次定义,如: DEVC怎么建工程

  • 自定义头文件中声明的函数原型名称和main函数调用中函数名称不一样,或者main中要调用函数,没有函数实现,则会出现:undefined reference to 函数 DEVC怎么建工程

  • 待补充。。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
2年前
2021 最顶级 React 组件库推荐
点上方蓝字关注公众号「前端从进阶到入院」作者丨MaxRozen译者丨王强策划丨小智AntDesign!(https://oscimg.oschina.net/oscnet/a85c35f23bd04e5da6a1e5e68a24119b.png)项目链接:AntDesignh
Wesley13 Wesley13
2年前
1995年的资深工程师,和你谈谈如何进阶
1995年的资深工程师,和你谈谈如何进阶自我介绍网络ID:杭城小刘,城市:顾名思义,人在杭州。1995年出生,本科毕业,现在是一名iOS资深工程师,年薪35w。兴趣爱好广泛:乒乓球、美食、电影、健身、山地车、养了2只布偶猫(Simba&Bella)、养花。技术领域:iOS、Web前端,写
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
2年前
Postman 使用方法详细介绍
1,下载安装:https://www.getpostman.com/apps2,打开Postman,如图所示:!(https://oscimg.oschina.net/oscnet/00f434cd831f2f74fea6f6d7b86bc46a751.png)3,创建一个接口项目!(https://oscimg.oschina.
可莉 可莉
2年前
2021 最顶级 React 组件库推荐
点上方蓝字关注公众号「前端从进阶到入院」作者丨MaxRozen译者丨王强策划丨小智AntDesign!(https://oscimg.oschina.net/oscnet/a85c35f23bd04e5da6a1e5e68a24119b.png)项目链接:AntDesignh
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
2年前
Eclipse 中的Maven常见报错及解决方法
1.不小心将项目中的MavenDependencies删除报错!(https://oscimg.oschina.net/oscnet/fd35e500e2580bca2afb81f35233b87a6ee.png)项目报错:!(https://oscimg.oschina.net/oscnet/8623bd4293fea39ca83a6
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这