Bronya_Zaychik 发表于 2023-8-4 15:38:49

小甲鱼课后作业是不是写错了

欢迎进入鱼C电话簿
请输入命令(I:录入/C:查询/D:删除/P:打印/E:退出):I
·录入模式
--
请输入姓名:小甲鱼
请输入手机号码:15999999999
是否继续录入(Y/N):Y
请输入姓名:不二如是
请输入手机号码:1388888888
输入不合法,请重新输入:1388888888a
输入不合法,请重新输入:13888888888
是否继续录入(Y/N):Y
请输入姓名:小甲鱼
该姓名己录入,手机号码是:
15999999999
请问是否修改(Y/N):Y
请输入新的手机号码:15666666666
是否继续录入(Y/N):N
请输入命令(I:录入/C:查询/D:删除/P:打印/E:退出):C
·查询模式--
请输入姓名:小甲鱼
小甲鱼:15666666666
是否继续查询(Y/N):N
请输入命令(I:录入/C:查询/D:删除/P:打印/E:退出):D
·删除模式
请输入姓名:不二如是
是否继续删除(Y/N):N
请输入命令(I:录入/C:查询/D:删除/P:打印/E:退出):P
--打印模式--
小甲鱼:15666666666
请输入命令(I:录入/C:查询/D:删除/P:打印/E:退出):E

上面为小甲鱼新版课程第37讲中的课后作业题示例,示例中将姓名为不二如是的用户删除后选择了不继续删除,应该是保存着,但在打印模式中又没有将其打印出来,是示例错误还是打印模式应该默认打印第一位用户?

Mike_python小 发表于 2023-8-4 15:39:17

回答:小甲鱼新版课程第37讲中的课后作业题示例中存在一个逻辑错误。

在删除模式下,示例中并没有将姓名为"不二如是"的用户删除,而是选择了不继续删除操作。然而,在打印模式下并没有将该用户打印出来,这是一个错误。

根据示例的逻辑,应该在删除模式中选择不删除后,该用户信息应该继续保留,并且在打印模式下应该打印出所有用户的信息。

因此,可以将代码进行以下修改以修复这个错误:


contacts = {}

def add_contact():
    while True:
      name = input("请输入姓名:")
      if name in contacts:
            print("该姓名已录入,手机号码是:")
            print(contacts)
            choice = input("请问是否修改(Y/N):")
            if choice == 'Y':
                number = input("请输入新的手机号码:")
                contacts = number
      else:
            number = input("请输入手机号码:")
            contacts = number
      choice = input("是否继续录入(Y/N):")
      if choice != 'Y':
            break

def search_contact():
    while True:
      name = input("请输入姓名:")
      if name in contacts:
            print(name + ":" + contacts)
      else:
            print("未找到该联系人")
      choice = input("是否继续查询(Y/N):")
      if choice != 'Y':
            break

def delete_contact():
    while True:
      name = input("请输入姓名:")
      if name in contacts:
            choice = input("是否确认删除(Y/N):")
            if choice == 'Y':
                del contacts
                print(name + "的联系信息已删除")
      else:
            print("未找到该联系人")
      choice = input("是否继续删除(Y/N):")
      if choice != 'Y':
            break

def print_contacts():
    for name, number in contacts.items():
      print(name + ":" + number)

def main():
    while True:
      command = input("请输入命令(I:录入/C:查询/D:删除/P:打印/E:退出):")
      if command == 'I':
            add_contact()
      elif command == 'C':
            search_contact()
      elif command == 'D':
            delete_contact()
      elif command == 'P':
            print_contacts()
      elif command == 'E':
            break
      else:
            print("无效命令")

if __name__ == '__main__':
    main()


通过以上修改,保留了删除操作中选择不删除后的用户信息,并在打印模式下打印出所有用户的信息。

isdkz 发表于 2023-8-4 15:39:26

根据给出的示例,我们可以看到在删除模式中,当要删除的用户选择不继续删除时,该用户应该被保留。然而,在打印模式中,只有一个用户被打印出来,即姓名为"小甲鱼"的用户。

这可能是示例中的一个错误。根据逻辑,打印模式应该打印所有录入的用户信息,而不仅仅是第一个用户。因此,我们可以认为这是一个示例错误。

要修复这个问题,我们可以在打印模式中添加一个循环,以便打印所有录入的用户信息。具体的实现方法如下:

1. 在打印模式中,添加一个循环来遍历保存用户信息的数据结构(例如列表或字典)。
2. 对于每个用户,打印出其姓名和手机号码。
3. 在循环结束后,询问用户是否继续查询,如果用户选择不继续查询,则返回主菜单。

以下是修复后的代码示例:

# 定义一个字典来保存用户信息
phonebook = {}

while True:
    command = input("请输入命令(I:录入/C:查询/D:删除/P:打印/E:退出):")
   
    if command == "I":
      # 录入模式
      print("录入模式")
      while True:
            name = input("请输入姓名:")
            phone = input("请输入手机号码:")
            
            if name in phonebook:
                print("该姓名已录入,手机号码是:")
                print(phonebook)
                modify = input("请问是否修改(Y/N):")
                if modify == "Y":
                  phonebook = phone
            else:
                phonebook = phone
            
            continue_input = input("是否继续录入(Y/N):")
            if continue_input != "Y":
                break
   
    elif command == "C":
      # 查询模式
      print("查询模式")
      while True:
            name = input("请输入姓名:")
            
            if name in phonebook:
                print(name + ":" + phonebook)
            else:
                print("未找到该用户")
            
            continue_query = input("是否继续查询(Y/N):")
            if continue_query != "Y":
                break
   
    elif command == "D":
      # 删除模式
      print("删除模式")
      while True:
            name = input("请输入姓名:")
            
            if name in phonebook:
                delete = input("是否继续删除(Y/N):")
                if delete == "Y":
                  del phonebook
            else:
                print("未找到该用户")
            
            continue_delete = input("是否继续删除(Y/N):")
            if continue_delete != "Y":
                break
   
    elif command == "P":
      # 打印模式
      print("--打印模式--")
      for name, phone in phonebook.items():
            print(name + ":" + phone)
      
      continue_print = input("是否继续打印(Y/N):")
      if continue_print != "Y":
            break
   
    elif command == "E":
      # 退出
      break



修复后的代码中,在打印模式中添加了一个循环来遍历保存用户信息的字典phonebook,并打印出每个用户的姓名和手机号码。这样,所有录入的用户信息都会被正确地打印出来。

希望以上解答能够帮到你!如果你还有其他问题,请随时提问。

tyh小号 发表于 2023-8-4 15:39:30

根据你提供的代码示例,我注意到在删除模式中,当用户选择不继续删除(输入"N")后,并没有保存被删除的姓名和手机号码。因此,在打印模式中并没有将被删除的用户打印出来是符合代码逻辑的。

如果你希望在删除模式中继续保存被删除的用户信息,并且在打印模式中能够显示出来,你需要对代码进行相应地修改。一种修改方式是使用一个列表(ArrayList)来保存电话簿中的用户信息,包括姓名和手机号码。

以下是基于你提供的代码示例进行修改的版本,可以保留删除的用户信息并在打印模式中显示出来:

import java.util.ArrayList;
import java.util.Scanner;

public class TelephoneBook {
    public static void main(String[] args) {
      ArrayList<String> names = new ArrayList<>();
      ArrayList<String> phoneNumbers = new ArrayList<>();
      Scanner sc = new Scanner(System.in);
      String command;

      do {
            System.out.print("请输入命令(I:录入/C:查询/D:删除/P:打印/E:退出): ");
            command = sc.next();

            switch (command.toUpperCase()) {
                case "I":
                  System.out.print("录入模式--请输入姓名:");
                  String name = sc.next();
                  System.out.print("请输入手机号码:");
                  String phoneNumber = sc.next();

                  if (names.contains(name)) {
                        int index = names.indexOf(name);
                        phoneNumbers.set(index, phoneNumber);
                        System.out.println("该姓名已录入,手机号码已更新");
                  } else {
                        names.add(name);
                        phoneNumbers.add(phoneNumber);
                        System.out.println("信息已录入");
                  }

                  System.out.print("是否继续录入(Y/N): ");
                  String continueInput = sc.next();
                  if (!continueInput.equalsIgnoreCase("Y")) {
                        command = "E"; // 结束程序
                  }
                  break;

                case "C":
                  System.out.print("查询模式--请输入姓名:");
                  name = sc.next();

                  if (names.contains(name)) {
                        int index = names.indexOf(name);
                        phoneNumber = phoneNumbers.get(index);
                        System.out.println(name + ": " + phoneNumber);
                  } else {
                        System.out.println("该姓名未录入电话号码");
                  }

                  System.out.print("是否继续查询(Y/N): ");
                  continueInput = sc.next();
                  if (!continueInput.equalsIgnoreCase("Y")) {
                        command = "E"; // 结束程序
                  }
                  break;

                case "D":
                  System.out.print("删除模式--请输入姓名:");
                  name = sc.next();

                  if (names.contains(name)) {
                        int index = names.indexOf(name);
                        names.remove(index);
                        phoneNumbers.remove(index);
                        System.out.println("信息已删除");
                  } else {
                        System.out.println("该姓名未录入电话号码");
                  }

                  System.out.print("是否继续删除(Y/N): ");
                  continueInput = sc.next();
                  if (!continueInput.equalsIgnoreCase("Y")) {
                        command = "E"; // 结束程序
                  }
                  break;

                case "P":
                  System.out.println("--打印模式--");

                  for (int i = 0; i < names.size(); i++) {
                        System.out.println(names.get(i) + ": " + phoneNumbers.get(i));
                  }

                  System.out.print("是否继续打印(Y/N): ");
                  continueInput = sc.next();
                  if (!continueInput.equalsIgnoreCase("Y")) {
                        command = "E"; // 结束程序
                  }
                  break;

                case "E":
                  System.out.println("程序已退出");
                  break;

                default:
                  System.out.println("无效命令,请重新输入");
                  break;
            }
      } while (!command.equals("E"));
    }
}


这段修改后的代码使用两个 ArrayList 分别存储姓名和手机号码。在录入模式中,如果输入的姓名已存在于列表中,则会更新该姓名对应的手机号码;否则,将姓名和手机号码分别添加到对应的列表中。在删除模式中,会删除对应的姓名和手机号码。在打印模式中,会遍历列表并依次显示姓名和手机号码。

希望这次的解答能够帮助到你!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

学习编程中的Ben 发表于 2023-8-4 15:46:18

把你的代码发一下哦

tommyyu 发表于 2023-8-4 16:14:54

它问的是“是否继续删除”,即是否再删除一个人。不二如是此时已经被删除了。它在问要不要继续删。

Bronya_Zaychik 发表于 2023-8-4 17:02:02

tommyyu 发表于 2023-8-4 16:14
它问的是“是否继续删除”,即是否再删除一个人。不二如是此时已经被删除了。它在问要不要继续删。

已经懂了,把代码写到这里就知道他说的是什么意思了,不过还是有点歧义的意思{:10_266:}

Bronya_Zaychik 发表于 2023-8-4 17:03:34

Mike_python小 发表于 2023-8-4 15:39
回答:小甲鱼新版课程第37讲中的课后作业题示例中存在一个逻辑错误。

在删除模式下,示例中并没有将姓名为 ...

你怎么看起来跟AI一样{:10_284:}

Bronya_Zaychik 发表于 2023-8-4 17:03:59

isdkz 发表于 2023-8-4 15:39
根据给出的示例,我们可以看到在删除模式中,当要删除的用户选择不继续删除时,该用户应该被保留。然而,在 ...

你怎么看起来也跟AI一样{:10_284:}
页: [1]
查看完整版本: 小甲鱼课后作业是不是写错了