2

我想将我的大程序拆分为多个文件......也许只有一个结构,然后是读取 csv 文件并提取单词并将它们放入数组中的函数......然后是另一个对数组进行排序的函数冒泡排序,最后是我把所有东西放在一起的主函数......事情就是,我在主函数的开头声明了必要的变量,当我想分离函数时,我在主函数中声明的变量和我用于这些函数的那些不再被发现......我是否必须再次将它们作为参数传递给函数?或者有另一种/更好的方法吗?我可以声明外部或静态变量吗?

其次,我不知道什么时候制作一个.h文件或另一个.cpp文件,如果另一个.cpp文件,不允许有另一个主要功能,我该怎么办?声明一个公共类?

这是我要分开的代码:

#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
//#include "studentStruct.h"

using namespace std;    


struct Stud{
        long matrnr;
        char vorname[30];
        char name[30];
        char datum[30];
        float note;
    };


void bubbleSort(Stud mystud[], int studentCounter);             


int main(int argc, char **argv)
{   

    const int MAX = 30;
    Stud stud;  
    Stud mystud[30]; // <<-- Array of "Stud" type
    //memset((void*)mystud,0,sizeof(mystud) * sizeof(Stud));
    int wordCounter(0);
    int i(0); //thats the charCounter or index
    int studentCounter(0);
    char wort[MAX];



  FILE * pFile;
  int cnr(0);     

  pFile=fopen("studentendaten.txt","r");  
  if (pFile==nullptr) 
  {
      perror ("Fehler beim öffnen der Datei");
  }

  else
  {       
    while (cnr != EOF) 
    {       
        (cnr=fgetc(pFile)) ;    

        if ((char)cnr == '\n') {
            mystud[studentCounter] = stud;
            studentCounter++;                       
            continue;           
        }

        if ((char)cnr == ';') { 


            wort[i] = '\0'; 

            switch (wordCounter % 5) {

                case 0:             
                stud.matrnr = atol(wort);
                break;

                case 1:
                strcpy(stud.name, wort);
                break;

                case 2:
                strcpy(stud.vorname, wort);
                break;

                case 3:
                strcpy(stud.datum,wort);
                break;

                case 4:
                stud.note = atof(wort); 
                break;
            }           

            wordCounter++;          
            i = 0;
            continue;
        }

        wort[i] = (char)cnr;
        i++;                

    }   

    mystud[studentCounter] = stud;
    fclose (pFile);
}


    bubbleSort(mystud , studentCounter);

    for (int i(0) ; i <= studentCounter; i++) {
    //cout <<mystud[i].matrnr << "  |  " << mystud[i].name << " |  " << mystud[i].vorname <<"  |  " 
    //<< mystud[i].datum <<"  |  " << mystud[i].note << endl;
    printf("%ld %15s    %15s    %15s    %6.1f\n",mystud[i].matrnr,mystud[i].name,mystud[i].vorname,mystud[i].datum,mystud[i].note);  
    }

    return 0;
}

void bubbleSort(Stud mystud[], int studentCounter) {
    Stud tmp;   
    for (int i = 0 ; i<= studentCounter; ++i) {
        for (int j=0; j<= studentCounter-1;  ++j) {
            if (mystud[j].note > mystud[j+1].note) 
            {
                /**
                tmp = mystud[j+1];
                mystud[j+1] = mystud[j];
                mystud[j] = tmp;
                **/

                    tmp.matrnr = mystud[j+1].matrnr;
                    strcpy(tmp.vorname,mystud[j+1].vorname);
                    strcpy(tmp.name,mystud[j+1].name);
                    strcpy(tmp.datum , mystud[j+1].datum);
                    tmp.note = mystud[j+1].note;

                    mystud[j+1].matrnr = mystud[j].matrnr;
                    strcpy(mystud[j+1].vorname ,mystud[j].vorname);                 
                    strcpy(mystud[j+1].name , mystud[j].name);
                    strcpy(mystud[j+1].datum ,mystud[j].datum);
                    mystud[j+1].note = mystud[j].note;

                    mystud[j].matrnr = tmp.matrnr;
                    strcpy(mystud[j].vorname , tmp.vorname);
                    strcpy(mystud[j].name , tmp.name);
                    strcpy(mystud[j].datum , tmp.datum);
                    mystud[j].note = tmp.note;


                }           
            }
        }       
    }
4

2 回答 2

2

最好(和标准)的做法可能是:

  1. 写一个类 Stud,而不是一个结构(类的私有成员将是namevorname等等)
  2. 制作一个头文件,您将在其中使用所有函数的原型编写类的定义
  3. 在单独的 .cpp 文件中定义这些函数
  4. 最后,您只需为实现(主要)制作另一个 .cpp 文件。

当然,您需要将头文件包含在 .cpp 文件中。

于 2013-11-09T15:26:20.687 回答
0
  • 头文件说 - 我们可以做到这一点。
  • 一个 .cpp 文件说 - 我们就是这样做的 - 即。将其编译为对象。

.cpp 文件使用头文件来了解可用的内容。

编译 .cpp 文件。生成目标文件。将它们连接在一起,这将把松散的末端绑起来。Bang - 得到一个可执行文件。

于 2013-11-09T14:47:58.830 回答