DEVC怎么建工程
1.DEVC建工程
1.1 新建项目
打开文件,选择新建-->项目-->ConsoleApplication(控制台程序),输入项目名,选择保存路径。(单独建一个文件夹存放)
项目建成功后,打开项目管理,看到自动生成的一个main文件。注意每个项目只能有一个main函数,是系统的入口。默认main.cpp已经包含main函数,其他文件不能再有main函数。
1.2 工程中新建c文件
项目管理中,右击项目名,选择New File,则可以在项目新建一个c或头文件。比如新建头文件,可以头文件写结构体定义、函数声明内容后,选择保存类型为*.h即可生成头文件
项目管理中多了自定义头文件student.h。其他c文件生成一样操作。
我们会生成了项目,但是如何把多个文件用项目管理一起呢,现在以学生管理系统为例。
2.多文件的C语言系统示例--学生成绩管理
示例功能比较简单,主要实现功能:
- 读取学生文件数据
- 修改学生成绩
- 控制台上展示学生数据
- 保存数据到文件中
设计3个文件实现该系统。
- 头文件student.h:封装结构体定义、函数声明
- blog.c:函数具体实现,包括文件读取、数据展示等功能
- main.c:实现菜单操作,功能函数调用
3个文件实现不同功能。函数定义和函数实现分2个文件实现。更好封装数据类型。main文件主要做函数调用。
文件数据:blog_score.txt
具体数据,如图所示:
看到上述数据,每行数据代表一个学生记录,故可以用结构体封装,具体见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.小结
综合设计中,一般我们是给一个文件数据,如:
- 学会用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.项目文件容易出现问题
自定义头文件定义变量,其他文件又都包含头文件,导致变量多次定义,如:
自定义头文件中声明的函数原型名称和main函数调用中函数名称不一样,或者main中要调用函数,没有函数实现,则会出现:
undefined reference to 函数
待补充。。
DEVC怎么建工程的更多相关文章
- STM3210x建工程库函数版本
1.首先下载一个固件库,我下载的是stm32f10x_stdperiph_lib 3.5V版的 2.新建一个文件夹,可命名为"STM32建工程库函数版本" 3.在"STM ...
- Cocos2d-x建工程时避免copy文件夹和库
方法一:(官方做法) 打开F:\cocos2d-1.0.1-x-0.9.1目录下的cocos2d-win32.vc2010.sln文件,然后右键点击解决方案,选择"添加"—&quo ...
- eclipse 利用已有c++代码建工程,并编译执行
如果你想建一个带Makefile的c++ 工程 1. 新建一个C++空工程,工程类型是makefile project,选择Linux GCC: 2. 将源码连同makefile文件一同作为一个文件系 ...
- [转]Cocos2d-x建工程时避免copy文件夹和库
原文链接: http://www.cnblogs.com/andyque/archive/2011/09/27/2192920.html 在上一篇教程中,我们演示了如何使用VS2010来新建一个工程 ...
- stm32库函数建工程和使用Keil自带库建工程有没有区别?发现了同样的程序在两种情况下keil自带库可以运行的情况,不知是什么原因
我使用库函数建的工程(非Keil自带库),为了实现SPI对Si24r1芯片数据的读写,以验证stm32是否可以和si24r1能够正常通信,发现使用库函数建的工程程序不能通过,读出来的数据和写的数据不一 ...
- Uiautomator-----新建工程
一.前提: 安装好安卓开发环境:jdk.安卓SDK.ADT.ant.eclipse 配置环境 二.新建uiautomator工程 1.打开eclipse,新建一个工程(这个网上资料很多,大家自 ...
- DS-5建工程
DS-5教程-使用ARM DS-5 和DSTREAM仿真器调试裸机程序 http://bbs.elecfans.com/jishu_453909_1_1.html i2c( 楼主 )2014-10-1 ...
- Xilinx 学习笔记1---新建工程和创建源代码文件
最近终于有空可以记录一些之前学习的内容,本博客系列记录笔者Xilinx ISE学习之旅,当然现在Vivado是学习热门,一步一步来.搞定 ISE,Vivado上手也会很快. 1.安装软件 软件部分的下 ...
- source insight 如何建工程--以及快捷方式查找调用函数方法
在source insight的view菜单中点出relation window,然后右键点relation window,选relation window properties,然后把view re ...
随机推荐
- RAC环境修改参数生效测试
本篇文档--目的:实验测试在RAC环境下,修改数据库参数与单实例相比,需要注意的地方 --举例说明,在实际生产环境下,以下参数很可能会需要修改 --在安装数据库完成后,很可能没有标准化,初始化文档,没 ...
- SQLI DUMB SERIES-6
less6 输入 ?id=1" 说明双引号未被过滤,输入的id被一对双引号所包围,存在注入点,可以闭合双引号. 而输入正常时 情况和less5相同,因此注入同less5.
- HDU 1686:Oulipo(KMP模板,子串出现次数)
Oulipo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- review
一.123 第二部分:面向对象 . 谈谈你对面向对象的认识. . 约束 Java: - 接口,约子类中必须包含某个方法(约束). Interface IMessage: def func1(self) ...
- hdu4424 Conquer a New Region 并查集/类似最小生成树
The wheel of the history rolling forward, our king conquered a new region in a distant continent.The ...
- Linux 修改yum源
第一种方式: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 第二种方式: ...
- 01python简介
目录 1. Python起源 2. 解释器 3. Python 的设计目标 4. Python 的设计哲学 5. 为什么选择 Python ? 6. Python 特点 7. Pyth ...
- lch 儿童围棋课堂 初级篇2 (李昌镐 著)
第1章 吃子 第2章 死活:实战演练 第3章 劫争 第4章 布局:定式篇 第5章 布局:三线,四线和大场 第6章 布局:布局类型与形势判断 第7章 中盘:分断 第8章 官子:价值的计算 第9章 对杀技 ...
- 自制操作系统Antz -- 系列文章
自制操作系统Antz day10——实现shell(上) AntzUhl 2018-10-10 16:25 阅读:192 评论:0 Linux内核源码分析 day01——内存寻址 AntzUhl ...
- Spring MVC里面xss攻击的预防
关于xss的介绍可以看 Asp.net安全架构之1:xss(跨站脚本)和 腾讯微博的XSS攻击漏洞 网页, 具体我就讲讲Spring MVC里面的预防: 第一种方法,使用Spring MVC web. ...