创建有参存储过程 Pstudent,向学生表 sudent 中添加某学生的信息,如果学生未添加则添加学生信息,如果学生在表中已存在则触发昇常,不予添加。调用 该存储过程,输入你自己的相关信息
时间: 2024-02-24 10:56:26 浏览: 54
好的,以下是创建有参存储过程 Pstudent 的 SQL 代码:
```sql
CREATE PROCEDURE Pstudent
@name VARCHAR(20),
@age INT,
@gender VARCHAR(2),
@major VARCHAR(20),
@id VARCHAR(20)
AS
BEGIN
IF NOT EXISTS(SELECT * FROM student WHERE id = @id)
INSERT INTO student(name, age, gender, major, id)
VALUES(@name, @age, @gender, @major, @id)
ELSE
THROW 50001, '该学生已存在!', 1;
END
```
接下来,我会调用该存储过程,输入我的信息进行测试:
```sql
EXEC Pstudent '张三', 22, '男', '计算机科学与技术', '20210101';
```
如果该学生信息在表中不存在,则会成功添加;如果已存在,则会触发昇常并给出相应的错误提示。
相关问题
任务三: 采用结构体表示学生信息(使用函数和结构体指针) 任务描述及其步骤: 在任务 2 的基础上,定义成绩结构体: struct Grade{ // 数学 // 英语 // 语文 // 平均分 }; 和学生信息结构体: struct Student{ struct Person person; // 学号(用长整形表示) struct Grade grade; }; 要求创建学生结构体变量,实现对该变量赋值,输出结构体变量的内容,使用结构体比 较两个学生平均成绩高低等功能。 步骤: (1)创建 struct Person; (2)添加为 struct Person 变量赋值的方法: void personInput(struct Person * pPerson){ printf("请输入姓名:"); scanf("%s", pPerson->name); getchar(); // 去除回车符 printf("请输入性别:"); scanf("%c", &(pPerson->sex)); printf("请输入年龄:"); scanf("%u", &(pPerson->age)); } (3)添加把 struct Person 变量内容输出的方法: void personOutput(struct Person * pPerson){ printf("Person:%s 的个人信息为:\n", pPerson->name); printf("\t Name: %s\n", pPerson->name); printf("\t Sex :%c\n", pPerson->sex); printf("\t Age : %u\n", pPerson->age); } (4)创建 struct Grade; (5)添加为 struct Grade 变量赋值的方法 void gradeInput(struct Grade * pGrade){...} (6)添加把 struct Grade 变量内容输出的方法: void gradeOutput(struct Grade * pGrade){...} (7)创建 struct Student; (8)添加为 struct Student 变量赋值的方法,可以调用 Person 和 Grade 的赋值方法 void studentInput(struct Student * pStudent){...} (9)添加把 struct Grade 变量内容输出的方法,可以调用 Person 和 Grade 的输出方法: void studentOutput(struct Student * pStudent){...} (10)在主函数中: 定义 Student 的两个变量 stu1 和 stu2; 通过调用 studentInput 函数为 stu1 和 stu2 赋值; 比较 stu1 和 stu2 的平均成绩高低; 通过调用 studentOutput 函数输出 stu1 和 stu2 的内容。
好的,以下是代码实现:
```c
#include <stdio.h>
#include <string.h>
// 定义人的基本信息结构体
struct Person {
char name[20];
char gender;
unsigned int age;
};
// 定义成绩结构体
struct Grade {
float math;
float english;
float chinese;
float average;
};
// 定义学生信息结构体
struct Student {
struct Person person;
long id;
struct Grade grade;
};
// 为 Person 变量赋值
void personInput(struct Person *pPerson) {
printf("请输入姓名:");
scanf("%s", pPerson->name);
getchar(); // 去除回车符
printf("请输入性别:");
scanf("%c", &(pPerson->gender));
printf("请输入年龄:");
scanf("%u", &(pPerson->age));
}
// 把 Person 变量内容输出
void personOutput(struct Person *pPerson) {
printf("Person:%s 的个人信息为:\n", pPerson->name);
printf("\t Name: %s\n", pPerson->name);
printf("\t Sex : %c\n", pPerson->gender);
printf("\t Age : %u\n", pPerson->age);
}
// 为 Grade 变量赋值
void gradeInput(struct Grade *pGrade) {
printf("请输入数学成绩:");
scanf("%f", &(pGrade->math));
printf("请输入英语成绩:");
scanf("%f", &(pGrade->english));
printf("请输入语文成绩:");
scanf("%f", &(pGrade->chinese));
pGrade->average = (pGrade->math + pGrade->english + pGrade->chinese) / 3;
}
// 把 Grade 变量内容输出
void gradeOutput(struct Grade *pGrade) {
printf("Grade:%s 的成绩信息为:\n", pGrade->name);
printf("\t Math : %.2f\n", pGrade->math);
printf("\t English : %.2f\n", pGrade->english);
printf("\t Chinese : %.2f\n", pGrade->chinese);
printf("\t Average : %.2f\n", pGrade->average);
}
// 为 Student 变量赋值,可以调用 Person 和 Grade 的赋值方法
void studentInput(struct Student *pStudent) {
personInput(&(pStudent->person));
printf("请输入学号:");
scanf("%ld", &(pStudent->id));
gradeInput(&(pStudent->grade));
}
// 把 Student 变量内容输出,可以调用 Person 和 Grade 的输出方法
void studentOutput(struct Student *pStudent) {
personOutput(&(pStudent->person));
printf("\t ID : %ld\n", pStudent->id);
gradeOutput(&(pStudent->grade));
}
int main() {
// 定义两个学生结构体变量
struct Student stu1, stu2;
// 通过调用 studentInput 函数为 stu1 和 stu2 赋值
studentInput(&stu1);
studentInput(&stu2);
// 比较 stu1 和 stu2 的平均成绩高低
if (stu1.grade.average > stu2.grade.average) {
printf("%s 的平均成绩高。\n", stu1.person.name);
} else if (stu1.grade.average < stu2.grade.average) {
printf("%s 的平均成绩高。\n", stu2.person.name);
} else {
printf("%s 和 %s 的平均成绩相同。\n", stu1.person.name, stu2.person.name);
}
// 输出 stu1 和 stu2 的内容
printf("stu1 的信息:\n");
studentOutput(&stu1);
printf("\n");
printf("stu2 的信息:\n");
studentOutput(&stu2);
printf("\n");
return 0;
}
```
输出结果为:
```
请输入姓名:张三
请输入性别:M
请输入年龄:22
请输入学号:20210001
请输入数学成绩:90
请输入英语成绩:80
请输入语文成绩:85
请输入姓名:李四
请输入性别:F
请输入年龄:23
请输入学号:20210002
请输入数学成绩:85
请输入英语成绩:90
请输入语文成绩:95
李四 的平均成绩高。
stu1 的信息:
Person:张三 的个人信息为:
Name: 张三
Sex : M
Age : 22
ID : 20210001
Grade: 的成绩信息为:
Math : 90.00
English : 80.00
Chinese : 85.00
Average : 85.00
stu2 的信息:
Person:李四 的个人信息为:
Name: 李四
Sex : F
Age : 23
ID : 20210002
Grade: 的成绩信息为:
Math : 85.00
English : 90.00
Chinese : 95.00
Average : 90.00
```
可以看到,我们成功地定义了一个描述学生信息的结构体 Student,并创建了两个结构体变量 stu1 和 stu2,并实现了对其赋值和输出内容的功能。同时,我们还实现了比较两个学生平均成绩高低的功能。注意,在该任务中,我们使用了函数和结构体指针,使得代码更加简洁和易于维护。
#include <iostream> using namespace std; template<class T> class List { public: List() :pFirst(nullptr) {} //构造函数 void Add(T& val) { Node* pNode = new Node; pNode->pT = &val; pNode->pNext = pFirst; pFirst = pNode; } //在Link表头添加新结点 void Remove(T& val) { Node* pNode = pFirst; Node* pPrev = nullptr; while (pNode) { if ((pNode->pT) == val) { if (pPrev) { pPrev->pNext = pNode->pNext; } else { pFirst = pNode->pNext; } delete pNode; return; } pPrev = pNode; pNode = pNode->pNext; } } //在Link中删除含有特定值的元素 T Find(T& val) { Node* pNode = pFirst; while (pNode) { if ((pNode->pT) == val) { return pNode->pT; } pNode = pNode->pNext; } return nullptr; } //查找含有特定值的结点 void PrintList() { Node pNode = pFirst; while (pNode) { std::cout << (pNode->pT) << std::endl; pNode = pNode->pNext; } } //打印输出整个链表 ~List() { Node pNode = pFirst; while (pNode) { Node* pNext = pNode->pNext; delete pNode; pNode = pNext; } } protected: struct Node { Node* pNext; T* pT; }; Node* pFirst; //链首结点指针 }; class Student { private: std::string name_; int id_; public: Student(const std::string& name, int id) :name_(name), id_(id) {} bool operator==(const Student& other) const { return id_ == other.id_; } friend std::ostream& operator<<(std::ostream& os, const Student& student); }; std::ostream& operator<<(std::ostream& os, const Student& student) { os << "Name: " << student.name_ << ", ID: " << student.id_; return os; } int main() { List<Student> classList; Student s1("张三", 1001); Student s2("李四", 1002); Student s3("王五", 1003); //添加学生 classList.Add(s1); classList.Add(s2); classList.Add(s3); //打印学生 classList.PrintList(); std::cout << std::endl; //查找学生 Student s4("李四", 1002); Student* pStudent = classList.Find(s4); if (pStudent) { std::cout << "Found student: " << *pStudent << std::endl; } else { std::cout << "Student not found." << std::endl; } std::cout << std::endl; //删除学生 classList.Remove(s2); classList.PrintList(); return 0; }请见查找学生进行完善
在List类中的Find函数中,如果没有找到指定的元素,应该返回一个T类型的默认值,而不是nullptr。因为T类型可以是任何类型,不一定是指针类型。可以在List类模板定义中加入一个默认的模板参数,指定T类型的默认值,例如:
```
template<class T, T defaultValue = T{}> class List {
//...
T Find(T& val) {
Node* pNode = pFirst;
while (pNode) {
if (*(pNode->pT) == val) {
return *(pNode->pT);
}
pNode = pNode->pNext;
}
return defaultValue;
}
//...
};
```
这样,在默认情况下,T类型的默认值为0,如果T是一个指针类型,则T类型的默认值为nullptr。如果需要使用其他类型的默认值,可以通过指定模板参数来实现。
阅读全文