for循环语句的bug?

本文探讨了一个特定的C/C++程序在处理大规模数组时出现无响应的问题。通过对代码的逐行分析,指出了可能导致死循环的原因,并寻求有效的优化方案。

我写了如下程序,运行怎么没有反应,难道FOR循环有时间限制?
double GetMax(int *array, DWORD size)
{
    double maxG = 0, currentG;
    for(int h1=0; h1<360; h1++)
    {
       for(int h2=0; h2>h1; h2--)
       {
           currentG = 0;
           for(DWORD i=0; i<size; i++)
           {
               if(h1 < array[i] && h2 > array[i])
               {
                  currentG += array[i];
               }
            }
            if(currentG > maxG)
            {
               maxG = currentG;
             }
       }
     }
     return maxG;
}

调用如上函数,当数组的长度为1024*1024,程序就没有响应了!


哪位大虾知道是怎么回事?
 

以下是对提供的 Java 代码的 BUG 分析: ### 数组初始化问题 ```java String []a={}; String name[]={}; int hour[]={}; int day[]={}; int grade[]={}; ``` 这些数组被初始化为空数组,之后尝试通过索引赋值会导致 `ArrayIndexOutOfBoundsException`。应该在使用前根据实际需求分配合适的大小,或者使用动态数组(如 `ArrayList`)。 ### SQL 语句拼接问题 ```java String sql="insert into users(name,hour,day,grade)values('a[0]','a[1]','a[2]','a[3]')"; ``` 这里的 `a[0]` 等不会被解析为变量的值,而是作为普通字符串插入到数据库中,会导致插入的数据不正确。应该使用 `PreparedStatement` 来避免 SQL 注入问题并正确插入变量值。 ### 结果集遍历问题 ```java while (resultSet.next()) { //调用输列 name[i]=resultSet.getString("name"); hour[i]=resultSet.getInt("hour"); day[i]= resultSet.getInt("day"); grade[i]=resultSet.getInt("grade"); i++; } if (resultSet.next()) { int rowCount = resultSet.getInt(1); for(int a1=0;a1<rowCount;a1++){ Employee03 e1=new Employee03(); e1.getSalary(name[i],hour[i],day[i],grade[i]); } } ``` 第一个 `while` 循环已经将结果集遍历到末尾,第二个 `if (resultSet.next())` 会返回 `false`,因为结果集已经没有更多行。而且在 `for` 循环中使用的 `i` 可能会越界,因为在第一个 `while` 循环中 `i` 已经超了数组的边界。 ### 修正后的代码示例 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import java.util.Scanner; class Employee03 { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } void getSalary(String name, int hour, int day, int grade) { double g; double money; switch (grade) { case 1: g = 1; money = hour * day * g; System.out.println(name + " 本年工资为 " + money); break; case 2: g = 1.5; money = hour * day * g; System.out.println(name + " 本年工资为 " + money); break; case 3: g = 2; money = hour * day * g; System.out.println(name + " 本年工资为 " + money); break; } } } public class work03 { public static void main(String[] args) { String[] array = {"姓名", "每日工作时间", "本月工作天数", "薪资等级"}; List<String> inputList = new ArrayList<>(); try (Scanner scanner = new Scanner(System.in)) { for (int i = 0; i < 4; i++) { System.out.println("请输入" + array[i]); inputList.add(scanner.next()); } } try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "xzy2363325"); PreparedStatement insertStatement = connection.prepareStatement("insert into users(name,hour,day,grade) values(?,?,?,?)")) { insertStatement.setString(1, inputList.get(0)); insertStatement.setInt(2, Integer.parseInt(inputList.get(1))); insertStatement.setInt(3, Integer.parseInt(inputList.get(2))); insertStatement.setInt(4, Integer.parseInt(inputList.get(3))); insertStatement.executeUpdate(); try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM users")) { List<String> names = new ArrayList<>(); List<Integer> hours = new ArrayList<>(); List<Integer> days = new ArrayList<>(); List<Integer> grades = new ArrayList<>(); while (resultSet.next()) { names.add(resultSet.getString("name")); hours.add(resultSet.getInt("hour")); days.add(resultSet.getInt("day")); grades.add(resultSet.getInt("grade")); } for (int i = 0; i < names.size(); i++) { Employee03 e1 = new Employee03(); e1.getSalary(names.get(i), hours.get(i), days.get(i), grades.get(i)); } } } catch (Exception e) { e.printStackTrace(); } } } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值