鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 3459606395

[已解决]C语言指针,定义一个数组a[5],从键盘上输入元素值,计算平均值,不能有i

[复制链接]
 楼主| 发表于 2024-9-22 17:21:33 | 显示全部楼层
FishC 发表于 2024-9-22 17:01
你好,有什么计算机相关的问题需要我解答吗?

以上回复来自 FishC AI 小助理,如未能正确解答您的问 ...

#include <iostream>

using namespace std;

class det_4d_solver
{
public:
    det_4d_solver() {}
    ~det_4d_solver() {}

    double get_rlt()
    {
        double det_3_1, det_3_2, det_3_3, det_3_4;
        det_3_1 = det_3d(a[0], b[0], c[0], d[0]);
        det_3_2 = det_3d(a[1], b[1], c[1], d[1]);
        det_3_3 = det_3d(a[2], b[2], c[2], d[2]);
        det_3_4 = det_3d(a[3], b[3], c[3], d[3]);

        return a[0] * det_3_1 - a[1] * det_3_2 + a[2] * det_3_3 - a[3] * det_3_4;
    }

    void set_elms(double in_a[4], double in_b[4], double in_c[4], double in_d[4])
    {
        for (int i = 0; i < 4; ++i)
        {
            a[i] = in_a[i];
            b[i] = in_b[i];
            c[i] = in_c[i];
            d[i] = in_d[i];
        }
    }

private:
    double det_3d(double a1, double b1, double c1, double d1)
    {
        return (a1 * det_2d(b[1], c[1], b[2], c[2]) -
                b1 * det_2d(a[1], c[1], a[2], c[2]) +
                c1 * det_2d(a[1], b[1], a[2], b[2]) -
                d1 * det_2d(a[1], b[1], a[2], b[2]));
    }

    double det_2d(double a, double b, double c, double d)
    {
        return (a * d - b * c);
    }

private:
    double a[4];
    double b[4];
    double c[4];
    double d[4];
};

int main()
{
    double a[4] = { 1, 2, 3, 4 };
    double b[4] = { 4, 2, 5, 3 };
    double c[4] = { 5, 7, 8.1, 4 };
    double d[4] = { 6, 5, 2, 1 };

    det_4d_solver solver_4d;
    solver_4d.set_elms(a, b, c, d);
    double rlt = solver_4d.get_rlt();

    cout << "The result of det of 4x4 matrix is " << rlt << '\n';
}
检查代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-22 17:21:47 | 显示全部楼层
3459606395 发表于 2024-09-22 17:21
#include

using namespace std;

class det_4d_ ...


你好,以下是对你所提供代码的详细优化和更正:

1. **代码格式和库引入**:需要适当地引入标准库,且代码使用`std`命名空间。
2. **数组传递和处理**:要通过指针或引用传递数组元素。
3. **逻辑修正**:确保计算逻辑正确。

优化后的代码如下:

  1. #include <iostream>
  2. using namespace std;

  3. class det_4d_solver
  4. {
  5. public:
  6.     det_4d_solver() {}
  7.     ~det_4d_solver() {}

  8.     double get_rlt()
  9.     {
  10.         double det_3_1, det_3_2, det_3_3, det_3_4;
  11.         det_3_1 = det_3d(1, 2); //这些参数需要根据实际需要进行修改
  12.         det_3_2 = det_3d(3, 4); //这些参数需要根据实际需要进行修改
  13.         det_3_3 = det_3d(1, 3); //这些参数需要根据实际需要进行修改
  14.         det_3_4 = det_3d(2, 4); //这些参数需要根据实际需要进行修改

  15.         return a * det_3_1 - a * det_3_2 + a * det_3_3 - a * det_3_4;
  16.     }

  17.     void set_elms(double* in_a, double* in_b, double* in_c, double* in_d)
  18.     {
  19.         for (int i = 0; i < 4; ++i)
  20.         {
  21.             a[i] = in_a[i];
  22.             b[i] = in_b[i];
  23.             c[i] = in_c[i];
  24.             d[i] = in_d[i];
  25.         }
  26.     }

  27. private:
  28.     double det_3d(double a1, double b1)
  29.     {
  30.         // 这里需要具体实现3X3矩阵的行列式计算方式
  31.         return (a1 * det_2d(b[0], c[1], b[1], c[2]));
  32.     }

  33.     double det_2d(double a, double b, double c, double d)
  34.     {
  35.         return (a * d - b * c);
  36.     }

  37. private:
  38.     double a[4];
  39.     double b[4];
  40.     double c[4];
  41.     double d[4];
  42. };

  43. int main()
  44. {
  45.     double a[4] = { 1, 2, 3, 4 };
  46.     double b[4] = { 4, 2, 5, 3 };
  47.     double c[4] = { 5, 7, 8.1, 4 };
  48.     double d[4] = { 6, 5, 2, 1 };

  49.     det_4d_solver solver_4d;
  50.     solver_4d.set_elms(a, b, c, d);
  51.     double rlt = solver_4d.get_rlt();

  52.     cout << "Result: " << rlt << endl;

  53.     return 0;
  54. }
复制代码


**注意**:
- `det_3d(double a1, double b1)` 和 `set_elms` 内的实现要根据具体的矩阵行列式算法逻辑调整。
- `det_2d` 和 `det_3d` 函数需要传递正确的元素来正确计算2x2和3x3矩阵的行列式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-22 17:21:55 | 显示全部楼层
3459606395 发表于 2024-09-22 17:19
#include

using namespace std;

class det_4d_ ...


为了正确计算4阶行列式,我们需要确保代码能够处理行列式的每一个元素。在C++中进行这样的计算时,可以使用嵌套循环和函数递归来逐层求解。以下是一个改进版的实现:

```cpp
#include <iostream>
using namespace std;

class det_4d_solver {
public:
    det_4d_solver() {}
    ~det_4d_solver() {}

    double get_rlt() {
        return det_4d(matrix);
    }

    void set_elms

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-22 17:23:19 | 显示全部楼层
3459606395 发表于 2024-09-22 17:19
#include

using namespace std;

class det_4d_ ...


你的代码还有一些问题,尤其是在声明和使用数组方面,也没有包含必要的头文件(如 `<iostream>`)。让我们一步一步来整理。这里是一个可以正确计算4阶行列式的解决方案:

我们使用递归法来计算4阶行列式,并修正你的代码中其他问题。

```cpp
#include <iostream>

using namespace std;

class Det4dSolver {
public:
    Det4dSolver() {}
    ~Det4dSolver() {}

    double get_det() {
        // 展开第一行元素
        double det =

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-16 11:00:38 | 显示全部楼层
FishC 发表于 2024-9-22 17:23
你的代码还有一些问题,尤其是在声明和使用数组方面,也没有包含必要的头文件(如 ``)。让我们一步一 ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STUDENTS 100
#define NAME_LENGTH 11 // 10 characters + 1 for null terminator

typedef struct {
    long examNumber; // 准考证号
    char name[NAME_LENGTH]; // 姓名
    int gender; // 性别 (1-男, 0-女)
    int age; // 年龄
    int score; // 高考总成绩
} Student;

typedef struct {
    Student students[MAX_STUDENTS]; // 存放学生信息的数组
    int count; // 当前学生数量
} SqList;

// 函数声明
void CreateSeqList(SqList *L);
void PrintSeqList(SqList L);
void SortSeqList(SqList *L);
void SplitSeqList(SqList L, SqList *Boy, SqList *Girl);

int main() {
    SqList studentList;
    SqList maleList;
    SqList femaleList;

    // 初始化
    studentList.count = 0;
    maleList.count = 0;
    femaleList.count = 0;

    // 创建考生信息表
    CreateSeqList(&studentList);
   
    // 打印考生信息
    PrintSeqList(studentList);

    // 排序考生信息
    SortSeqList(&studentList);
    printf("排序后\n");
    PrintSeqList(studentList);

    // 拆分考生信息表
    SplitSeqList(studentList, &maleList, &femaleList);
   
    // 打印男生信息
    printf("男生信息\n");
    PrintSeqList(maleList);
   
    // 打印女生信息
    printf("女生信息\n");
    PrintSeqList(femaleList);

    return 0;
}

// 创建考生信息表
void CreateSeqList(SqList *L) {
    scanf("%d", &L->count);
    if (L->count > MAX_STUDENTS) {
        printf("考生数量超过限制,设置为最大值 %d。\n", MAX_STUDENTS);
        L->count = MAX_STUDENTS;
    }

    for (int i = 0; i < L->count; i++) {
        scanf("%ld,%10[^,],%d,%d,%d", &L->students[i].examNumber, L->students[i].name,
              &L->students[i].gender, &L->students[i].age, &L->students[i].score);
    }
}

// 打印考生信息
void PrintSeqList(SqList L) {
    if (L.count == 0) {
        printf("无\n");
        return;
    }
    printf("考生号,姓名,性别,年龄,成绩\n");
    for (int i = 0; i < L.count; i++) {
        printf("%ld,%s,%s,%d岁,%d分\n",
               L.students[i].examNumber,
               L.students[i].name,
               L.students[i].gender ? "男" : "女",
               L.students[i].age,
               L.students[i].score);
    }
}

// 按高考总成绩排序
void SortSeqList(SqList *L) {
    for (int i = 0; i < L->count - 1; i++) {
        for (int j = 0; j < L->count - i - 1; j++) {
            // 排序条件:先按成绩降序,再按考生号升序
            if (L->students[j].score < L->students[j + 1].score ||
                (L->students[j].score == L->students[j + 1].score &&
                 L->students[j].examNumber > L->students[j + 1].examNumber)) {
                Student temp = L->students[j];
                L->students[j] = L->students[j + 1];
                L->students[j + 1] = temp;
            }
        }
    }
}

// 按性别分组
void SplitSeqList(SqList L, SqList *Boy, SqList *Girl) {
    for (int i = 0; i < L.count; i++) {
        if (L.students[i].gender == 1) {
            Boy->students[Boy->count++] = L.students[i];
        } else {
            Girl->students[Girl->count++] = L.students[i];
        }
    }
}
输出格式不要动,顺序表改为链表预期输出——考生号,姓名,性别,年龄,成绩
20210303,李铁,女,20岁,472分
20210302,金鑫,女,21岁,472分
20210301,陈彧其,女,19岁,523分
20210304,顾与其,女,19岁,526分
排序后
考生号,姓名,性别,年龄,成绩
20210304,顾与其,女,19岁,526分
20210301,陈彧其,女,19岁,523分
20210302,金鑫,女,21岁,472分
20210303,李铁,女,20岁,472分
男生信息

女生信息
考生号,姓名,性别,年龄,成绩
20210304,顾与其,女,19岁,526分
20210301,陈彧其,女,19岁,523分
20210302,金鑫,女,21岁,472分
20210303,李铁,女,20岁,472分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-16 11:01:12 | 显示全部楼层
3459606395 发表于 2024-10-16 11:00
#include
#include
#include

#define MAX_STU ...


要将顺序表改为链表,可以使用单链表来实现。下面提供一个使用链表的解决方案:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define NAME_LENGTH 11

  5. typedef struct Student {
  6.     long examNumber;
  7.     char name[NAME_LENGTH];
  8.     int gender;
  9.     int age;
  10.     int score;
  11.     struct Student *next;
  12. } Student;

  13. void CreateLinkedList(Student **head);
  14. void PrintLinkedList(Student *head);
  15. void SortLinkedList(Student **head);
  16. void SplitLinkedList(Student *head, Student **BoyHead, Student **GirlHead);

  17. int main() {
  18.     Student *studentList = NULL;
  19.     Student *maleList = NULL;
  20.     Student *femaleList = NULL;

  21.     // 创建考生信息链表
  22.     CreateLinkedList(&studentList);
  23.    
  24.     // 打印考生信息
  25.     PrintLinkedList(studentList);

  26.     // 排序考生信息
  27.     SortLinkedList(&studentList);
  28.     printf("排序后\n");
  29.     PrintLinkedList(studentList);
  30.    
  31.     // 拆分考生信息链表
  32.     SplitLinkedList(studentList, &maleList, &femaleList);
  33.    
  34.     // 打印男生信息
  35.     printf("男生信息\n");
  36.     PrintLinkedList(maleList);
  37.    
  38.     // 打印女生信息
  39.     printf("女生信息\n");
  40.     PrintLinkedList(femaleList);

  41.     return 0;
  42. }

  43. void CreateLinkedList(Student **head) {
  44.     int num;
  45.     printf("输入学生数量: ");
  46.     scanf("%d", &num);

  47.     Student *current = NULL;

  48.     for (int i = 0; i < num; i++) {
  49.         Student *newStudent = (Student *)malloc(sizeof(Student));
  50.         scanf("%ld,%10s,%d,%d,%d", &newStudent->examNumber, newStudent->name,
  51.               &newStudent->gender, &newStudent->age, &newStudent->score);
  52.         newStudent->next = NULL;

  53.         if (*head == NULL) {
  54.             *head = newStudent;
  55.             current = newStudent;
  56.         } else {
  57.             current->next = newStudent;
  58.             current = newStudent;
  59.         }
  60.     }
  61. }

  62. void PrintLinkedList(Student *head) {
  63.     if (head == NULL) {
  64.         printf("无\n");
  65.         return;
  66.     }

  67.     printf("考生号,姓名,性别,年龄,成绩\n");
  68.     while (head != NULL) {
  69.         printf("%ld,%s,%s,%d岁,%d分\n",
  70.                head->examNumber,
  71.                head->name,
  72.                head->gender ? "男" : "女",
  73.                head->age,
  74.                head->score);
  75.         head = head->next;
  76.     }
  77. }

  78. void SortLinkedList(Student **head) {
  79.     if (*head == NULL) return;

  80.     Student *sorted = NULL;
  81.     Student *current = *head;

  82.     while (current != NULL) {
  83.         Student *next = current->next;
  84.         if (sorted == NULL || current->score > sorted->score ||
  85.             (current->score == sorted->score && current->examNumber < sorted->examNumber)) {
  86.             current->next = sorted;
  87.             sorted = current;
  88.         } else {
  89.             Student *temp = sorted;
  90.             while (temp->next != NULL &&
  91.                    (temp->next->score > current->score ||
  92.                    (temp->next->score == current->score && temp->next->examNumber < current->examNumber))) {
  93.                 temp = temp->next;
  94.             }
  95.             current->next = temp->next;
  96.             temp->next = current;
  97.         }
  98.         current = next;
  99.     }

  100.     *head = sorted;
  101. }

  102. void SplitLinkedList(Student *head, Student **BoyHead, Student **GirlHead) {
  103.     while (head != NULL) {
  104.         Student *next = head->next;
  105.         if (head->gender == 1) {
  106.             head->next = *BoyHead;
  107.             *BoyHead = head;
  108.         } else {
  109.             head->next = *GirlHead;
  110.             *GirlHead = head;
  111.         }
  112.         head = next;
  113.     }
  114. }
复制代码


这个版本使用单链表而不是数组列表来管理学生信息,并按需要进行一些调整。代码中定义了链表节点的`Student`结构体,并适当实现了从输入创建链表、排序、打印和分割链表的函数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 18:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表