启航预备役每日总结17

1.每日一题

向字符串添加空格

https://leetcode.cn/problems/adding-spaces-to-a-string/description/

思路与算法:

可以运用双指针的思想,使用两个指针分别遍历字符串 s 和数组 spaces。记前者的指针为 i,后者的指针为 ptr当 spaces 恰好与 i 相等时,我们在答案字符串的末尾放入一个空格,并将 ptr向右移动一个位置。此外,还需要在答案字符串的末尾放入 s[i],并将 i向右移动一个位置。在两个指针全部遍历完成后,就得到了修改后的字符串。

代码如下:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;

int main()
{
	string s;
	getline(cin, s);//自行输入字符串
	vector<int>spaces = { 8,13,15 };//可以自己更改要加空格的位置和数量
	int n = s.size();
	string ans;
	ans.reserve(n + spaces.size());//将ans的长度定义为spaces长度和字符串s的长度之和
	int ptr = 0;
	for (int i = 0; i < n; ++i) 
	{
		if (ptr < spaces.size() && spaces[ptr] == i)
		{
			ans.push_back(' ');
			++ptr;
		}
		ans.push_back(s[i]);
	}
	cout << ans << endl;
	return 0;
}

 2.每日学习

继续编写了数据结构的项目图书管理系统

优化图书的记录,输入的图书编号和文件中的相同则报错,要重新输入

代码如下:

void init(struct LNode *L)
{
    FILE *fp, *shu;
    int U, i;
    system("cls"); //清屏
    printf("\n\n\n\n");
    printf("\t\t***************************************\n");
    printf("\t\t*                                     *\n");
    printf("\t\t*           图书信息录入              *\n");
    printf("\t\t*                                     *\n");
    printf("\t\t***************************************\n");
    printf("\t\t请输入你要录入的的数量:");
    scanf("%d", &U); //输入需要读入的图书数量
    printf("\n\n");
    fp = fopen("book.txt", "a"); //打开图书的信息,准备存储
    for (i = 1; i <= U;)
    {
        struct book *p = (struct book *)malloc(sizeof(struct book)); //分配动态空间
        p->next = NULL;                                                 //初始化单链表
        printf("\t\t请输入第%d本书的编号:", i);
        scanf("%lld", &p->num);
        // 检查输入的书号是否与文件中的重复
        struct book *q = L->next;
        int duplicate = 0;
        while (q != NULL)
        {
            if (p->num == q->num)
            {
                duplicate = 1;
                break;
            }
            q = q->next;
        }
        if (duplicate)
        {
            printf("\t\t书号已存在,请重新输入!\n");
            free(p);
            continue;
        }
        printf("\t\t请输入第%d本书的书名:", i);
        scanf("%s", p->name);
        printf("\t\t请输入第%d本书的作者:", i);
        scanf("%s", p->author);
        printf("\t\t请输入第%d本书的出版社:", i);
        scanf("%s", p->make);
        printf("\t\t请输入第%d本书的出版日期,年月日间用‘ ’隔开,且二月输入为:2,不是02\n\t\t日期:", i);
        scanf("%d %d %d", &p->s.year, &p->s.month, &p->s.day);
        printf("\t\t该书是否被借阅,如果借出则输入1,未借出则输入0:");
        scanf("%d", &p->Borrow);
        printf("\n\n");
        fprintf(fp, "%lld %s %s %s %d %d %d %d\n", p->num, p->name,p->author, p->make, p->s.year, p->s.month, p->s.day, p->Borrow); //将图书信息写入文件
        struct book *temp = L->next;
        L->next = p;
        p->next = temp;
        i++;
    }
    fclose(fp); //关闭文件
    printf("\t\t图书信息录入成功!\n");
    printf("\t\t按任意键返回主菜单...");
    getch();
}

优化删除图书时的操作,有书名和作者相同的书都要陈列,然后再根据查出来的书号删除

代码如下:

void delete_name(struct LNode *L)
{
    FILE *fp;
    int U;
    char name[200];
    char c;
    int flag = 0;
    printf("请输入你要删除的图书名称,如果要退出则输入“exit”:");
    while (1)
    {
        scanf("%s", name);
        if (!strcmp(name, "exit"))
        {
            printf("按任意键退出..........\n");
            getch();
            return;
        }
        struct book *p, *prev, *temp;
        p = L->next;
        prev = L; // 用于保存上一个节点
        int found = 0; // 用于标记是否找到匹配的书名
        while (p != NULL)
        {
            if (!strcmp(name, p->name))
            {
                printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
                if (p->Borrow == 1)
                {
                    printf("\t\t已借出\n");
                }
                else
                {
                    printf("\t\t未借出\n");
                }
                printf("\t是否删除此书(‘Y’或者‘N’)");
                getchar();
                scanf("%c", &c);
                if (c == 'Y')
                {
                    prev->next = p->next;
                    temp = p;
                    p = p->next; // 更新 p 指针
                    free(temp);
                    found = 1; // 设置标志位为找到
                }
                else
                {
                    printf("已经取消操作,按任意键继续查找下一本重复的书...\n");
                    getch();
                    prev = p; // 更新 prev 指针
                    p = p->next; // 更新 p 指针
                }
            }
            else
            {
                prev = p; // 更新 prev 指针
                p = p->next; // 更新 p 指针
            }
        }
        if (found == 0)
        {
            system("cls");
            printf("图书系统没有记录该书名的书,请重新输入(输入“exit”退出):");
            getch();
        }
        else
        {
            fp = fopen("book.txt", "w");
            struct book *p;
            p = L->next;
            while (p != NULL)
            {
                fprintf(fp, "%d\t%s\t%s\t%d\t%d\t%d\t%d\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day, p->Borrow);
                p = p->next;
            }
            fclose(fp);
            printf("删除成功,按任意键继续查找下一本重复的书...\n");
            getch();
            flag = 1;
        }
    }
    if (flag == 0)
    {
        printf("操作取消,按任意键退出...\n");
        getch();
    }
}

void delete_author(struct LNode *L)
{
    FILE *fp;
    int U;
    char author[200];
    char c;
    int flag = 0;
    printf("请输入你要删除的图书的作者,如果要退出则输入“exit”:");
    while (1)
    {
        scanf("%s", author);
        if (!strcmp(author, "exit"))
        {
            printf("按任意键退出..........\n");
            getch();
            return;
        }
        struct book *p, *prev, *temp;
        p = L->next;
        prev = L; // 用于保存上一个节点
        int found = 0; // 用于标记是否找到匹配的书名
        while (p != NULL)
        {
            if (!strcmp(author, p->author))
            {
                printf("\t\t书号:%d\n\t\t书名:%s\n\t\t出版社:%s\n\t\t出版日期:%d年%d月%d日", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day);
                if (p->Borrow == 1)
                {
                    printf("\t\t已借出\n");
                }
                else
                {
                    printf("\t\t未借出\n");
                }
                printf("\t是否删除此书(‘Y’或者‘N’)");
                getchar();
                scanf("%c", &c);
                if (c == 'Y')
                {
                    prev->next = p->next;
                    temp = p;
                    p = p->next; // 更新 p 指针
                    free(temp);
                    found = 1; // 设置标志位为找到
                }
                else
                {
                    printf("已经取消操作,按任意键继续查找下一本重复的书...\n");
                    getch();
                    prev = p; // 更新 prev 指针
                    p = p->next; // 更新 p 指针
                }
            }
            else
            {
                prev = p; // 更新 prev 指针
                p = p->next; // 更新 p 指针
            }
        }
        if (found == 0)
        {
            system("cls");
            printf("图书系统没有记录该作者的书,请重新输入(输入“exit”退出):");
            getch();
        }
        else
        {
            fp = fopen("book.txt", "w");
            struct book *p;
            p = L->next;
            while (p != NULL)
            {
                fprintf(fp, "%d\t%s\t%s\t%d\t%d\t%d\t%d\n", p->num, p->name, p->make, p->s.year, p->s.month, p->s.day, p->Borrow);
                p = p->next;
            }
            fclose(fp);
            printf("删除成功,按任意键继续查找下一本重复的书...\n");
            getch();
            flag = 1;
        }
    }
    if (flag == 0)
    {
        printf("操作取消,按任意键退出...\n");
        getch();
    }
}

优化了密码修改,只要输入密码就可以,因为已经登录,账号不需要进行输入比较

代码如下:

void changeuserpassword()
{
    FILE* fp;
    char password[200], newPassword[200];
    system("cls");
    printf("\n\n\n\n");
    printf("\t\t***************************************\n");
    printf("\t\t*                                     *\n");
    printf("\t\t*  =================================  *\n");
    printf("\t\t*                                     *\n");
    printf("\t\t*           欢迎用户密码修改          *\n");
    printf("\t\t*                                     *\n");
    printf("\t\t*  =================================  *\n");
    printf("\t\t*                                     *\n");
    printf("\t\t***************************************\n");
    printf("请输入您原来的密码:");
    scanf("%s", password);
    if(strcmp(user_mima,password))
    {
        printf("与原来密码不匹配!无法修改密码!");
        return;
    }
    printf("请输入您的新密码:");
    scanf("%s", newPassword);
    FILE* temp = fopen("temp.txt", "w+"); // 创建一个临时文件用于保存修改后的账号信息
    fp = fopen("user.txt", "r");
    int found = 0; // 标记是否找到要修改密码的账号
    char line[500];
    while (fgets(line, sizeof(line), fp)) {
        char tempUsername[200], tempPassword[200];
        sscanf(line, "%s %s", tempUsername, tempPassword); // 从文件中读取账号和密码
        if (strcmp(tempPassword, user_mima) == 0) { // 使用用户输入的原密码进行比较
            found = 1; // 找到要修改密码的账号且原密码匹配
            fprintf(temp, "%s %s\n", tempUsername, newPassword); // 将修改后的账号信息写入临时文件
        } else
            fprintf(temp, "%s %s\n", tempUsername, tempPassword); // 将其他账号信息写入临时文件
    }
    fclose(fp);
    fclose(temp);
    remove("user.txt");      // 删除原用户账号信息文件
    rename("temp.txt", "user.txt"); // 将临时文件重命名为用户账号信息文件
    if (found)
        printf("用户密码修改成功!\n");
    else
        printf("未找到指定账号或原密码错误,密码修改失败!\n");
    getch();
}

明天要将该系统完成并再进行优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值