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();
}
明天要将该系统完成并再进行优化

220

被折叠的 条评论
为什么被折叠?



