| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 656 人关注过本帖
标题:这段程序怎么改可以运行
只看楼主 加入收藏
lzzz
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2023-10-10
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
这段程序怎么改可以运行
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Record
{
    int sequence;
    char studentID[12];
    char name[50];
};

typedef struct Record DataType;

struct SeqList
{
    int MAXNUM; // 顺序表中最大的元素个数
    int n;      // 存放在顺序表中元素的个数
    DataType* element; /* element[0]、element[1],……,element[n-1] 存放线性表中的元素 */
};

typedef struct SeqList* PSeqList;

PSeqList createNullList_seq(int m)
{
    PSeqList palist = (PSeqList)malloc(sizeof(struct SeqList));
    if (palist != NULL) {
        palist->element = (DataType*)malloc(sizeof(DataType) * m);
        if (palist->element) {
            palist->MAXNUM = m;
            palist->n = 0; // 空顺序表长度为0
            return palist;
        }
        else {
            free(palist);
        }
    }
    printf("Failed!\n"); // 存储分配失败
    return NULL;
}

int isNullList_seq(PSeqList palist)
{
    return (palist->n == 0);
}

int locate_seq(PSeqList palist, DataType x)
{
    for (int p = 0; p < palist->n; p++)
    {
        if (palist->element[p].sequence == x.sequence)
            return p;
    }
    return -1;
}

int insertPre_seq(PSeqList palist, int p, DataType x)
{
    int q;
    if (palist->n >= palist->MAXNUM)  // 溢出
    {
        printf("Overflow!\n");
        return 0;
    }
    if (p < 0 || p > palist->n)
    {
        printf("Not exist!\n");
        return 0;
    }
    for (q = palist->n - 1; q >= p; q--)  // 注意要从最后一个开始往后移
        palist->element[q + 1] = palist->element[q]; // 全部后移一个
    palist->element[p] = x;
    palist->n = palist->n + 1;  // 元素个数+1
    return 1;
}

void com(PSeqList seqList)
{
    FILE* inputFile;
    char filename[100]; // 声明一个足够大的数组来存储文件名
    int capacity = 1000; // 假设顺序表的最大容量为1000

    // 打开原始文件
    inputFile = fopen("D:\\202111010038\\2021sjjgANSI.txt", "r");

    if (inputFile == NULL) {
        printf("无法打开原始文件!\n");
        return;
    }

    // 读取列标题并跳过
    fscanf(inputFile, "%*[^\n]"); // 跳过一行数据,不存储到变量中

    // 从文件中读取 Record 结构体数据并插入到顺序表中
    DataType recordToInsert;

    while (fscanf(inputFile, "%d %s %[^\n]", &recordToInsert.sequence, recordToInsert.studentID, recordToInsert.name) != EOF)
    {
        if (insertPre_seq(seqList, seqList->n, recordToInsert))
        {
            ;
        }
        else
        {
            printf("数据插入失败: %d %s %s\n", recordToInsert.sequence, recordToInsert.studentID, recordToInsert.name);
        }
    }

    // 关闭文件
    fclose(inputFile);

    // 在这里可以继续插入更多数据
    DataType additionalRecord;

    printf("请输入学生的学号\n");
    scanf("%s", additionalRecord.studentID);
    printf("请输入学生的姓名\n");
    scanf("%s", additionalRecord.name);

    // 构建动态文件名
    sprintf(filename, "D:\\202111010038\\2021sjjg加%s.txt", additionalRecord.name);

    // 推荐插入位置,以确保按学号正序排列
    int insertPosition = -1; // 默认插入到最后
    for (int i = 0; i < seqList->n; i++) {
        if (strcmp(additionalRecord.studentID, seqList->element[i].studentID) < 0) {
            insertPosition = i;
            printf("程序推荐您插入位置序号为%d\n", i + 1);
            break;
        }
    }

    // 更新插入的序号
    additionalRecord.sequence = seqList->n + 1;

    if (insertPre_seq(seqList, insertPosition, additionalRecord))
    {
        ;
    }
    else
    {
        printf("数据插入失败: %s %s\n", additionalRecord.studentID, additionalRecord.name);
    }

    // 在将数据写入输出文件之前,打印顺序表中的数据
    for (int i = 0; i < seqList->n; i++) {
        ;
    }

    // 将数据写入输出文件
    FILE* outputFile = fopen(filename, "w");
    if (outputFile == NULL) {
        printf("无法创建输出文件!\n");
        return;
    }

    fprintf(outputFile, "序号 学号 姓名\n");

    for (int i = 0; i < seqList->n; i++) {
        fprintf(outputFile, "%d %s \n", i + 1, seqList->element[i].studentID);
    }

    // 关闭文件
    fclose(outputFile);

    printf("数据已插入到顺序表并保存到 %s 文件中。\n", filename);
}

void menu()
{
    int m;
    printf("                             \n");
    printf("      1.开始     2.结束      \n");
    printf("                             \n");
    scanf("%d", &m);
    if (m == 1)
    {
        PSeqList seqList = createNullList_seq(1000); // 创建一个空的顺序表

        if (seqList == NULL) {
            printf("创建顺序表失败!\n");
            return;
        }

        com(seqList);

        // 清空顺序表
        seqList->n = 0;

        goto again;
    }
    else
        exit(0);

again:
    printf("           是否继续          \n");
    printf("      1.继续     2.结束      \n");
    printf("                             \n");

    scanf("%d", &m);
    if (m == 1) {
        menu(); // 递归调用菜单函数以继续处理数据
    }
    else
        exit(0);
}

int main()
{
    menu(); // 调用菜单函数处理数据

    return 0;
}
搜索更多相关主题的帖子: printf 数据 element return int 
2023-10-10 11:04
lzzz
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2023-10-10
收藏
得分:0 
在线等!急!

2023-10-10 11:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
不知所云!
为什么不肯说出你遇到的问题,而是让别人乱猜?
2023-10-10 14:29
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:5 
不用费心了,一定是抄的。
如果自己能写出这么长一段代码,不可能不会调试。
如果是抄的,一定要抄整段正确答案,切记不要抄半成品。
2023-10-10 14:54
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:225
专家分:1656
注 册:2023-6-29
收藏
得分:5 
不需要该就能运行, 使用dev c++ , 或者https://www.bccn.net/run/ 这个在线编辑器都能运行
2023-10-10 15:05
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
改写了一下,发现有两处逻辑不通的地方。懒得问了

程序代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <filesystem>

struct Record
{
    unsigned sequence;
    std::string studentID;
    std::string name;
};

bool foo( const std::filesystem::path& filename )
{
    auto TrimString = []( std::string& s ) -> std::string&
    {
        size_t q = s.find_last_not_of("\t\n\v\f\r ");
        if( q != std::string::npos )
        {
            s.erase( q+1 );
            size_t p = s.find_first_not_of("\t\n\v\f\r ");
            s.erase( 0, p );
        }
        return s;
    };

    auto OutputToFile = []( const std::vector<Record>& records, std::ostream& file )
    {
        file << "序号\t学号\t姓名\n";
        for( const auto& rd : records )
            file << rd.sequence << '\t' << rd.studentID << '\t' << rd.name << '\n';
    };

    std::vector<Record> records;

    unsigned max_sequence = 0;
    {
        std::ifstream file( filename );
        if( file )
        {
            file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); // 略过第一行
            for( Record rd; (file>>rd.sequence>>rd.studentID) && std::getline(file,rd.name) && !TrimString(rd.name).empty(); )
            {
                records.push_back( rd );

                if( max_sequence < rd.sequence )
                    max_sequence = rd.sequence;
            }
            std::ranges::stable_sort( records, {}, &Record::studentID );
        }
    }
    if( !records.empty() )
    {
        std::cout << "存在于文件 " << filename << " 中的原有数据:\n";
        OutputToFile( records, std::cout );
    }

    bool newly_added = false;
    for( ; ; )
    {
        Record rd;
        std::cout << "\n";
        std::cout << "请输入学生的学号: ";
        if( !std::getline(std::cin,rd.studentID) || TrimString(rd.studentID).empty() || rd.studentID.find_first_of("\t\n\v\f\r ")!=std::string::npos )
            break;
        std::cout << "请输入学生的姓名: ";
        if( !std::getline(std::cin,rd.name) || TrimString(rd.name).empty() )
            break;
        rd.sequence = ++max_sequence;

        auto pos = std::upper_bound( records.begin(), records.end(), rd, [](const Record& a, const Record& b){return a.studentID<b.studentID;} );
        records.insert( pos, rd );
        newly_added = true;
    }
    std::cout << "\n";

    if( newly_added )
    {
        std::filesystem::create_directories( filename.parent_path() );
        std::ofstream file( filename );
        if( !file )
        {
            puts( "无法创建输出文件!" );
            return false;
        }

        OutputToFile( records, file );
        file << "序号 学号 姓名\n";
        if( !file )
        {
            puts( "无法写入输出文件!" );
            return false;
        }
    }

    if( newly_added )
    {
        std::cout << "写入进文件 " << filename << " 中的新数据:\n";
        OutputToFile( records, std::cout );
    }
    return true;
}

int main( void )
{
    const char* menu = "                          \n"
                       "      你直接瞎鸡巴输      \n"
                       "                          \n";
    std::cout << menu;

    foo( R"(D:\202111010038\2021sjjgANSI.txt)" );
}

2023-10-10 16:29
邹生笑谈
Rank: 2
等 级:论坛游民
帖 子:16
专家分:48
注 册:2020-12-5
收藏
得分:5 
试了一下,应该没问题。但是有很多限定条件
1.源文件的格式固定,即txt文件内第二行,必须有数据,且格式为【整型】【空格】【字符串】【空格】【字符串】
2.【整型】【空格】【字符串】【空格】也可以
3.【整型】【空格】会导致后面的数据输出烫烫烫
4.无数据会导致无输出。

===================
一些特性
源程序导致,每次只能插入一行数据,且存储在新的文件里,且姓名不存在里面,而是存在文件名上。
第一行默认是【序号】【学号】【姓名】,即便不写也没事,不会读取,且在新文件里会写的。
正确输入后,无论序号原来如何,序号会从上到下重排为123..,且新数据从前行插入,后面的数据整体下移一行,且姓名没有保存而是存在外面文件名上。

===================
简单优化:
1.在 fprintf(outputFile, "%d %s \n", i + 1, seqList->element[i].studentID);
改为fprintf(outputFile, "%d %s %s \n", i + 1, seqList->element[i].studentID,seqList->element[i].name);
名字name就写进去了
===================
还有的bug:
原文件的第二列即ID是中文的话,在读入写出后的新文件里,变成乱码。(虽然定义是char[]格式)




2023-10-10 17:40
快速回复:这段程序怎么改可以运行
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057207 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved