zoukankan      html  css  js  c++  java
  • 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("
    没有该学生!
    "); 
    	}
    }
    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("
    ");
    	}
    }
    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","
    "); // 最后一行不写空行 
    	}
    	printf("
    文件保存成功!!
    "); 
    }
    

    这里注意就是:

    • 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!
    "); 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:修改成绩
    ");
        printf("2:展示成绩
    ");
        printf("3:保存成绩
    ");
        printf("0:退出
    ");	
        printf("
    输入操作项:");
    } 
    

    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 函数

    • 待补充。。

  • 相关阅读:
    丰清杨 作业 160809315
    自学C++游戏程序开发学习顺序(转)
    哈佛幸福课相关&积极心理学经典英文原版书籍读书笔记(连载中)(转)
    程序员追求的是什么?
    如何学好游戏编程?
    计算机专业的学生必须掌握的五门课程
    [译]学好数学能让程序员的水平更高
    天下没有免费的午餐
    各个类型书籍推荐
    Peter Norvig:自学编程,十年磨一剑
  • 原文地址:https://www.cnblogs.com/linli069/p/10032889.html
Copyright © 2011-2022 走看看