首页 > 解决方案 > C如何将一个选项卡排序为多个选项卡

问题描述

我目前正在尝试将一个选项卡分类为多个选项卡。重点是“重新创建”乐透纸板,例如:

宾果号码

所以基本上我是从一个这样排序的 txt 文件中获取我所有的数字:

00001;12;26;37;52;66;02;18;27;53;76;09;38;48;61;82

00002;29;40;67;70;85;02;14;48;54;65;13;28;30;75;89

我需要获取它们,将它们保存到一个选项卡中,然后将它们分类到多个选项卡中,以便正确获取它们。最后我必须将它们导出到一个 csv 文件中,这在这里并不难。

我尝试了很多东西,都是徒劳的。在这里,我可以获取我的所有数据,将它们保存到一个选项卡中。现在我必须将它们分成 9 个值的三个选项卡,并比较三个选项卡之间的值,以使其像乐透纸板一样。*示例:如果选项卡的第一列的值 > 10,我必须将值移到下一列并在前一列中输入 0。就像乐透纸板一样。到目前为止,这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#define Taille_Max 28
#define NBLIGNES 3


//Déclaration variables
FILE* fichierTxt = NULL;
FILE* fichierCsv = NULL;
int chaine[Taille_Max] = { 0 };
int i = 0;


struct carton {
   char* numeroCarton[5];
   int ligne1[9] = { 0 }, linge2[9] = { 0 }, ligne3[9] = { 0 };

};




int main()
{


   //Creation carton
   struct carton Carton;

   //Ouvre fichier lecture et ecriture
   fichierTxt = fopen("DESCAR.txt", "r");
   fichierCsv = fopen("DESCAR.csv", "w");



   //T fichierTxt
   if (fichierTxt != NULL) {

       for (i = 0; i < NBLIGNES; i++) {
           //Recupere toute la chaine
           fscanf(fichierTxt, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", &chaine[0],
               &chaine[1], &chaine[2], &chaine[3], &chaine[4], &chaine[5], &chaine[6], &chaine[7], &chaine[8], &chaine[9],
               &chaine[10], &chaine[11], &chaine[12], &chaine[13], &chaine[14], &chaine[15]);


           for (int c = 0; c < sizeof(Carton.ligne1); c++) {
               if ()

               Carton.ligne1[c] = chaine[c];



           }
           printf("%d %d %d %d %d %d %d %d %d", Carton.ligne1[0],
               Carton.ligne1[1], Carton.ligne1[2], Carton.ligne1[3], Carton.ligne1[4], Carton.ligne1[5], Carton.ligne1[6], Carton.ligne1[7], Carton.ligne1[8]);

       /*  if (chaine[1] > 10 || chaine[5] > 10 || chaine [10] > 10) {

               for (int n = sizeof(chaine) ; n > 0; n--) {

                   chaine[n+1] = chaine[n];
               }
               chaine[1] = 0;
               chaine[5] = 0;
               chaine[10] = 0;
           } 

           if (chaine[2] > 20 || chaine[6] > 20 || chaine[11] > 20) {

               for (int n = sizeof(chaine); n > 0; n--) {

                   chaine[n + 1] = chaine[n];
               }
               chaine[2] = 0;
               chaine[6] = 0;
               chaine[11] = 0;
           }


           //Affiche la chaine
           printf("%d\n   %d %d %d %d %d\n    %d %d %d %d %d\n    %d %d %d %d %d\n\n", chaine[0],
               chaine[1], chaine[2], chaine[3], chaine[4], chaine[5], chaine[6], chaine[7], chaine[8], chaine[9],
               chaine[10], chaine[11], chaine[12], chaine[13], chaine[14], chaine[15]);



       }


       fclose(fichierTxt);
   }   
   else {
       printf("Impossible d'ouvrir le fichier txt");
   }
           // fichierCSV
           /*if (fichierCsv != NULL) {

               fputs(chaine, fichierCsv);


           }
           else {
               printf("Impossible d'ouvrir ou d'écrire dans le fichier");
           }
           */















   return 0;

}  

标签: csortingtabs

解决方案


好的,这就是我将如何处理这个问题。

顺便说一句,当您说“tab”时,您要查找的词是“array”。


假设(我不熟悉宾果/乐透卡!):

  • 卡片每行正好有五个数字
  • 卡片数据按数字升序预先排序
  • 卡数据不包含重复的数字
  • 卡数据几乎都是有效的(您没有提供格式错误的条目示例)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct card card;
struct card {
    int id;
    int num[3][5];
    card *nxt_card;
};

int main(int argc, char *argv[]) {
    FILE *fileTxt = NULL;
    FILE *fileCsv = NULL;
    card *first_card = NULL;

    fileTxt = fopen("cards.txt", "r");
    fileCsv = fopen("cards.csv", "w+"); // create file if it doesn't exist

    if(fileTxt) {
        char buffer[128];
        while(fgets(buffer, sizeof(buffer), fileTxt)) { // read line-by-line
            if(strlen(buffer) <= 3) continue; // skip blanks
            card c; // format data into a struct on the stack
            memset(&c, 0, sizeof(card));
            if(sscanf(buffer, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", &c.id, &c.num[0][0], &c.num[0][1], &c.num[0][2], &c.num[0][3], &c.num[0][4],
              &c.num[1][0], &c.num[1][1], &c.num[1][2], &c.num[1][3], &c.num[1][4], &c.num[2][0], &c.num[2][1], &c.num[2][2], &c.num[2][3], &c.num[2][4]) < 16) {
                printf("Could not process a card.\n");
                continue;
            } else {
                // copy the struct to the heap
                card *s = malloc(sizeof(card));
                if(s) {
                    memcpy(s, &c, sizeof(card));
                    if(!first_card) {
                        first_card = s;
                    } else {
                        card *i = first_card;
                        while(i->nxt_card) i = i->nxt_card;
                        i->nxt_card = s;
                    }
                    s = NULL;
                } else {
                    printf("Memory allocation error!\n");
                    continue;
                }
            }
        }
        fclose(fileTxt);

        if(!fileCsv) printf("Error opening CSV file for writing.\n");
        // traverse the linked list
        card *c = first_card;
        while(c) {
            // test for duplicate numbers in a card here, if required!

            printf("\nCard #%05i:\n", c->id);
            if(fileCsv) fprintf(fileCsv, "%05i\n", c->id);
            for(int row=0; row<3; row++) {
                // sort row elements ascending here, if required!

                int l = 0; // keep track of numbers per row
                for(int col=0; col<9; col++) {
                    if(l == 5) { // print empty columns after 5 numbers are in a row
                        printf("|  ");
                    } else {
                        if((c->num[row][l]) < (col+1)*10) {
                            // print the lth element in its appropriate column
                            printf("|%2i", c->num[row][l]);
                            if(fileCsv) fprintf(fileCsv, "%i", c->num[row][l]);
                            l++;
                        } else printf("|  "); // print empty middle columns
                    }
                    if(fileCsv && col<8) fprintf(fileCsv, ","); // skip empty extra column in csv
                }
                printf("|\n"); // next row (with dividers in middle)
                if(row < 2) printf("----------------------------\n");
                if(fileCsv) fprintf(fileCsv, "\n");
            }
            if(fileCsv) fprintf(fileCsv, "\n");
            c = c->nxt_card;
        }
        printf("\n");
        if(fileCsv) fclose(fileCsv);

        // free allocated heap
        card *i, *j;
        for(i = first_card; i != NULL; i = j){
            j = i->nxt_card;
            free(i);
        }
        i = NULL; j = NULL;

    } else printf("Could not open the cards data file.\n");

    return 0;
}

卡片.txt

00001;12;26;37;52;66;02;18;27;53;76;09;38;48;61;82

00002;29;40;67;70;85;02;14;48;54;65;13;28;30;75;89

标准输出

Card #00001:
|  |12|26|37|  |52|66|  |  |
----------------------------
| 2|18|27|  |  |53|  |76|  |
----------------------------
| 9|  |  |38|48|  |61|  |82|

Card #00002:
|  |  |29|  |40|  |67|70|85|
----------------------------
| 2|14|  |  |48|54|65|  |  |
----------------------------
|  |13|28|30|  |  |  |75|89|

卡片.csv

00001
,12,26,37,,52,66,,
2,18,27,,,53,,76,
9,,,38,48,,61,,82

00002
,,29,,40,,67,70,85
2,14,,,48,54,65,,
,13,28,30,,,,75,89


推荐阅读