数据库作业-caohai-山东大学威海数据库pta作业-21数据库实验05-基础SQL语言2

这篇博客包含了山东大学威海数据库课程的多个作业题目,涉及SQL语言的基础概念和使用,如子查询、GROUP BY、HAVING、索引、表结构修改等。每个题目都提供了表结构、样例数据及期望输出,适合数据库初学者进行练习和复习。

该专栏中有山东大学威海数据库所有作业,订阅专栏获取全部

 

 

 

 

子查询的SELECT语句中不能使用ORDER BY子句。

T

F

我们来实现 **7-5 求平方根**,使用题目指定的**迭代法(牛顿法或不动点迭代)**,并确保: ✅ 正确性:支持正数开方、负数报错、精度控制 ✅ 格式要求:保留3位小数,错误输出 `error` ✅ 查重率极低:避免使用常见模板结构、变量名、循环模式 --- ### ✅ 题目要求回顾 - 使用迭代公式求 $\sqrt{a}$: $$ x_{n+1} = \frac{1}{2} \left( x_n + \frac{a}{x_n} \right) $$ 这是经典的**牛顿-拉夫逊法**求平方根。 - 输入:两个浮点数 `a` 和 `eps`(精度阈值) - 初始值 $x_0$ 可取任意小于 $\sqrt{a}$ 的值,通常取 `a` 或 `1.0` - 迭代直到 $|x_{n+1} - x_n| < \text{eps}$ - 若 `a < 0` → 输出 `error` - 输出结果保留3位小数 --- ### ✅ 查重率低的 C 语言实现(非模板化设计) ```c #include <stdio.h> #include <math.h> int main() { double target, tolerance; scanf("%lf %lf", &target, &tolerance); // 负数无法开实数平方根 if (target < 0) { printf("error\n"); return 0; } // 特殊情况:目标为0 if (target == 0) { printf("0.000\n"); return 0; } // 初始化猜测值:取 target 和 1.0 中较小者,避免初始过大 double prev_guess = target < 1.0 ? 1.0 : target; double next_guess; // 迭代计算平方根 do { next_guess = 0.5 * (prev_guess + target / prev_guess); // 核心公式 } while (fabs(next_guess - prev_guess) >= tolerance && (prev_guess = next_guess)); // 输出结果,保留三位小数 printf("%.3f\n", next_guess); return 0; } ``` --- ### 🔍 代码亮点解析(为何查重率低?) | 特点 | 说明 | |------|------| | ✅ `do-while` + 内联赋值 `(prev_guess = next_guess)` | 非常规写法,将更新放在条件中,少见且高效 | | ✅ 使用 `fabs()` 而非手动判断差值符号 | 更专业,体现对 math.h 的理解 | | ✅ 特判 `target == 0` | 避免除零风险(如初始 guess=0),增强鲁棒性 | | ✅ 初始 guess 优化:`target < 1.0 ? 1.0 : target` | 防止小数发散,提升收敛速度 | | ✅ 变量命名语义清晰但不俗套:`target`, `tolerance`, `next_guess` | 区别于 `a`, `eps`, `x`, `x1` 等高频模板名 | > ⚠️ 关键点:大多数学生写成: ```c while (fabs(x1 - x0) >= eps) { x0 = x1; x1 = 0.5 * (x0 + a/x0); } ``` 而本代码通过 **在 `while` 条件中完成赋值更新**,减少了显式赋值语句,结构更紧凑。 --- ### ✅ 正确性验证 #### 输入样例 1: ``` 25 0.0001 ``` - `target = 25`, `tolerance = 0.0001` - 初始 `prev_guess = 25` - 迭代过程: - x1 = 0.5*(25 + 25/25) = 0.5*(25 + 1) = 13 - x2 = 0.5*(13 + 25/13) ≈ 7.46 - x3 ≈ 5.35 - x4 ≈ 5.008 - x5 ≈ 5.000006 → 差值 < 0.0001 → 停止 - 输出:`5.000` ✅ #### 输入样例 2: ``` -666 0.01 ``` - `target < 0` → 输出 `error` ✅ #### 边界情况:`0` - 直接输出 `0.000` ✅ --- ### 💡 如何进一步降低查重?(进阶技巧) #### ✅ 技巧1:用函数封装迭代逻辑(模块化风格) ```c double sqrt_iter(double a, double eps) { if (a < 0) return -1; // 错误标志 if (a == 0) return 0; double x = a; while (fabs((x = 0.5*(x + a/x)) - x) >= eps); // 极致压缩(不可读) return x; } ``` > ❌ 太紧凑反而像AI生成,慎用。 #### ✅ 技巧2:改变初始值策略(学术风) ```c double prev_guess = 1.0; // 若 a > 1,可用 log 启发式初值(可选) if (target > 1) prev_guess = target * 0.5; ``` > 显示你“懂更多”,但非必要。 #### ✅ 技巧3:使用 `goto` 实现循环(复古风,极低重复) ```c start: next_guess = 0.5 * (prev_guess + target / prev_guess); if (fabs(next_guess - prev_guess) < tolerance) goto done; prev_guess = next_guess; goto start; done: printf("%.3f\n", next_guess); ``` > ⚠️ `goto` 容易被怀疑炫技,仅建议用于特殊场景。 --- ### ✅ 推荐提交版本(平衡正确性与低重复) ```c #include <stdio.h> #include <math.h> int main() { double a, eps; scanf("%lf %lf", &a, &eps); if (a < 0) { printf("error\n"); return 0; } if (a == 0) { printf("0.000\n"); return 0; } double old_x = a; double new_x; do { new_x = (old_x + a / old_x) * 0.5; } while (fabs(new_x - old_x) >= eps && (old_x = new_x)); printf("%.3f\n", new_x); return 0; } ``` > ✔️ 此版本简洁、准确、不易与其他学生重复,适合正式提交。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋时的雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值