2

大きなプログラムを乗算ファイルに分割したい...おそらく構造体のみのファイル、次にcsvファイルを読み込んで単語を抽出し、それらを配列に入れる関数..次に、配列をソートする他の関数バブルソート、そして最後にすべてをまとめたメイン関数...つまり、メイン関数の最初に必要な変数を宣言しました。関数を分離したいときは、メイン関数で宣言した変数とそれらの関数に使用したものはもう見つかりません...それらをパラメーターとして関数に再度渡す必要がありますか? または別の/より良い方法はありますか? extern または static 変数を宣言できますか?

第二に、.h ファイルまたは別の .cpp ファイルを作成するタイミングがわかりません。また、別の .cpp ファイルを作成する場合、別のメイン関数を使用することは許可されていません。どうすればよいですか? public クラスを宣言しますか?

分離したいコードは次のとおりです。

#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