在运行的时候出问题,不知道是代码有问题导致功能运行不了,还是操作问题
你这不是运行成功了吗
得把代码贴出来。
整体修改完善如下,供参考:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student
{
char name[20];
char sex[4]; // sex[2];
long long phone; //int long phone;
char adress[40];
int number;
char e_mail[30];
}stu[100];
int N = 0;
void show()
{
int i, j;
if (N) {
printf("下面将会显示输入的数据:\n");
printf("%-6s %-20s %-6s %-12s %-40s %-6s %-30s\n", "序号",
"姓名", "性别", "电话", "工作地址", "学号", "E - mail");
for (i = 0; i < N; i++)
{
printf("%-6d %-20s %-6s %-12lld %-40s %-6d %-30s\n", i + 1, stu[i].name,
stu[i].sex,stu[i].phone, stu[i].adress, stu[i].number, stu[i].e_mail);
}
printf("显示结束\n");
}
else
printf("记录为空!\n");
}
void nameseek()
{
int i;
char d[20];
printf("请输入要查找学生的名字:");
scanf("%s", d);
for (i = 0; i < N; i++)
{
if (strcmp(d, stu[i].name) == 0)
{
printf("你要查找的学生信息为:\n");
printf("%-20s %-6s %-12s %-40s %-6s %-30s\n", "姓名",
"性别", "电话", "工作地址", "学号", "E - mail");
printf("%-20s %-6s %-12lld %-40s %-6d %-30s\n", stu[i].name,
stu[i].sex, stu[i].phone, stu[i].adress, stu[i].number, stu[i].e_mail);
break;
}
}
if (i >= N)
printf("未找到相关记录!\n");
}
void numberseek()
{
int i;
long long e;
printf("请输入要查找的电话号码:");
scanf("%lld", &e);
for (i = 0; i < N; i++)
{
if (e == stu[i].phone)
{
printf("你要查找的学生信息为:\n");
printf("%-20s %-6s %-12s %-40s %-6s %-30s\n", "姓名",
"性别", "电话", "工作地址", "学号", "E - mail");
printf("%-20s %-6s %-12lld %-40s %-6d %-30s\n", stu[i].name,
stu[i].sex, stu[i].phone, stu[i].adress, stu[i].number, stu[i].e_mail);
break;
}
}
if (i >= N)
printf("未找到相关记录!\n");
}
void seek()
{
int q;
if (N) {
do {
printf("请选择搜索方式:1.按名字查找 2.按电话号码查找 3.退出查询\n");
printf("请选择查找方式:");
scanf("%d", &q);
switch (q)
{
case 1:nameseek(); break;
case 2:numberseek(); break;
}
} while (q != 3);
}
else
printf("记录为空!\n");
}
void add()
{
int i, n = N;
while (1) {
printf("姓名 性别 电话 工作地址 学号 E-mail\n");
scanf("%s%s%lld%s%d%s", stu[n].name, stu[n].sex,
&stu[n].phone, stu[n].adress, &stu[n].number, stu[n].e_mail);
n++;
do {
printf("是否继续添加记录:1 是 2 否\n");
scanf("%d", &i);
} while (i < 1 || i >2);
if (i == 2) break;
}
N = n;
}
void sort()
{
int i, j;
struct Student temp;
for (i = N - 1; i > 0; i--)
{
for (j = 0; j < i; j++)
{
if (strcmp(stu[j].name, stu[j+1].name) > 0) // 按名字升序排序
{
temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp;
}
}
}
printf("排序成功\n");
show();
}
void out()
{
int i, t;
if (N) {
printf("请输入要删除的学生编号:");
scanf("%d", &t);
for (i = 0; i < N; i++)
{
if (stu[i].number == t)
break;
}
if (i >= N)
printf("未找到相关记录!\n");
else {
for (; i < N - 1; i++)
stu[i] = stu[i + 1];
N--;
printf("删除完毕\n");
}
}
else
printf("记录为空!\n");
}
void keep()
{
FILE* fp;
int i;
char filename[50] = "data.txt";
//printf("请输入要保存的文件名:");
//scanf("%s", filename);
if ((fp = fopen(filename, "w")) == NULL)
{
printf("文件无法打开\n");
exit(0);
}
fprintf(fp, "序号 姓名 性别 电话号 工作地址 学号 E-mail\n");
for (i = 0; i < N; i++)
{
fprintf(fp, "%d %s %s %lld %s %d %s\n", i + 1, stu[i].name,
stu[i].sex, stu[i].phone, stu[i].adress, stu[i].number, stu[i].e_mail);
}
fclose(fp);
printf("保存在文件成功!\n");
}
void total()
{
FILE* fp;
char buff[1024];
int m = 0, i = 0;
if (N) {
printf("目前通讯录中共有 %d 名联系人\n", N);
}
else {
if ((fp = fopen("data.txt", "r")) == NULL)
{
printf("文件不存在!\n");
return;
}
fgets(buff, sizeof(buff), fp);
while (1) {
if (fscanf(fp, "%d %s %s %lld %s %d %s\n", &m, stu[i].name,stu[i].sex,
&stu[i].phone, stu[i].adress, &stu[i].number, stu[i].e_mail) != 7) break;
i++;
}
fclose(fp);
printf("目前通讯录中共有 %d 名联系人\n", m); // 将统计的个数输出
N = i;
}
}
void menu()
{
printf("\t开始*\n\n");
printf("\t 1. 显示通讯录\n");
printf("\t 2. 查找\n");
printf("\t 3. 添加通讯录\n");
printf("\t 4. 按姓名排序\n");
printf("\t 5. 删除通讯录\n");
printf("\t 6. 将记录保存在文件\n");
printf("\t 7. 统计总人数\n");
printf("\t 8. 结束\n");
printf("\t***********************************************\n");
printf("请输入序号:");
}
int main()
{
int ch, exit = 1;
while (exit) {
menu();
scanf("%d", &ch);
switch (ch)
{
case 1:show(); break;
case 2:seek(); break;
case 3:add(); break;
case 4:sort(); break;
case 5:out(); break;
case 6:keep(); break;
case 7:total(); break;
case 8:exit = 0; break;
default:
break;
}
}
return 0;
}
涉及到两个函数:
1.(动态规划)MatrixChainOrder():得到最小乘法代价时的乘法的结合方式,并且求出最小乘法代价的数值
2.(递归)PrintPath():根据MatrixChainOrder()得到的s[i][j],得到输出乘法结合方式
代码讲解:
本代码涉及到的矩阵例子是:六个矩阵,如下图