涛4091 发表于 2022-9-24 15:30:29

c语言结构体赋值_已解决

本帖最后由 涛4091 于 2023-2-23 11:02 编辑

#include<cstdio>
#include<iostream>
using namespace std;
#define MaxSize 50

//定义顺序表结构体
struct SqList{ //创建类
        int data;
        int length;
//        int data = {5,4,7,8,9,1,2,3,4,5,6};
//        int length = 11;
       
};
//定义方法
int ListDelete(SqList &L){
        int min = L.data;
        int flag;
        if(L.length==0){
                cout<<"顺序表中无元素可删除"<<endl;
                return 0;
        }
       
        for(int i=1;i<L.length;i++){
                if(L.data < min){
                        min = L.data;
                        flag = i;
                }
        }
        L.data = L.data;
        return min;
}
int main(){
        //类的实例化
//        SqList list1={{5,6,7,7,1,9,5,7,8},9};
        struct SqList list1;
        list1.data = {1,3,4,3,5,6,7,4,9};
        list1.length = 9;
        int min_ele;
       
        cout<<"初始的顺序表:"<<endl;
        for(int i=0;i<list1.length;i++){
                cout<<list1.data<<" ";
        }
        cout<<endl;
        min_ele = ListDelete(list1); //往前的语句顺序表list1没有被调整,执行了函数后被整容;
        cout<<"修改之后的顺序表为:"<<endl;
        for(int i=0;i<list1.length;i++){
                cout<<list1.data<<" ";
        }
        cout<<endl;
        cout<<"最小的元素为:"<<min_ele<<endl;
       
        return 0;
}

如图

涛4091 发表于 2022-9-24 15:31:07

哪位兄弟来看看{:10_266:}

jackz007 发表于 2022-9-24 15:43:52

本帖最后由 jackz007 于 2022-9-24 15:53 编辑

      结构型变量的初始化应该在定义的时候,一般不支持在定义后再进行整体赋值。就好像一般的数组那样。
      struct SqList list1;
      list1.data = {1,3,4,3,5,6,7,4,9};
      list1.length = 9;
      改这样试试
      struct SqList list1 = {{1 , 3 , 4 , 3 , 5 , 6 , 7 , 4 , 9} , 9} ;
      就是 3 句合成 1 句

howzyao 发表于 2022-9-24 17:13:26

struct SqList list1; //不需要加关键字struct
list1.data = {1,3,4,3,5,6,7,4,9}; // 写成 list1.data[]{...};试试

howzyao 发表于 2022-9-24 17:15:50

jackz007 发表于 2022-9-24 15:43
结构型变量的初始化应该在定义的时候,一般不支持在定义后再进行整体赋值。就好像一般的数组那样。 ...

结构型变量的初始化应该在定义的时候,一般不支持在定义后再进行整体赋值。就好像一般的数组那样。

楼主的这种做法,相当于"平面展开",应当可以被随意访问.好处是便于随意改,坏处是完全忽视了"结构"的初衷.

howzyao 发表于 2022-9-24 17:20:57

#include <iostream>

using namespace std;
struct a
{
    int *data;
    int len;
    a():data(0),len(0){};
   ~a(){ delete [] data; };
    void set_len(int);
};

int main()
{
    cout << "Hello world!" << endl;
    a list1;
    list1.set_len(6); //这样,使用 对像 的 类方法 进行 设置

    return 0;
}

void a:: set_len(int l)
{
    len=l;
    data= new int;
    for(int i=0;i<len;i++)
      data=0;
}

howzyao 发表于 2022-9-24 17:24:20


你的写法问题在语法上,更重要的是对"结构"的认识存在一个差异,这应当不利于对C++的深入掌握.
看你贴子的意思,是想初始化几个成员变量是吗?

结构a,相当于你的结构,上面代码可以直接运行,你试试,若好用,请设为解决.谢谢.

howzyao 发表于 2022-9-24 17:47:47

#include <iostream>

using namespace std;
struct a
{
    int *data;
    int len;
    a():data(0),len(0){};
   ~a(){ delete [] data; };
    void set_len(int);
    void check_directly();
    void check_backward();
};

int main()
{
    cout << "Hello world!" << endl;
    a list1;
    list1.set_len(6); //这样,使用 对像 的 类方法 进行 设置
    list1.check_directly();
    list1.check_backward();

    return 0;
}

void a:: set_len(int l)
{
    len=l;
    data= new int;
    for(int i=0;i<len;i++)
      data=i;
}
void a::check_directly()
{
    cout<<"directly display:"<<endl;
    for(int i=0;i<len;i++)
    {
      cout<<data<<" ";
    }
    cout<<endl;

}
void a::check_backward()
{
    cout<<"backward display:"<<endl;
    for(int i=len-1;i>-1;i--)
    {
      cout<<data<<" ";
    }
    cout<<endl;
}



加了正反两个遍历. 对类和结构 应当 采取 "内部"的做法,而不是在main中随意的访问类成员,随意的访问成员,是内部的事.
在main中,则是外部,此时,应当把注意力放到如何让 对像 做到响应用户的动作 或向应 其它 对像的 动作
比如:现在main中,data中的数字,给其它人用,或有某种用途,则可以设置反回整个 数组 或返回 数级中的某一个值,按使用意图,写方法:
int* return_data(); //返回整个data给main
int return_data(int);//反其中的一个下标给main
代码示例:见下楼

howzyao 发表于 2022-9-24 17:49:23

#include <iostream>

using namespace std;
struct a
{
    int *data;
    int len;
    a():data(0),len(0){};
   ~a(){ delete [] data; };
    void set_len(int);
    void check_directly();
    void check_backward();
    int* return_data(); //返回整个data给main
    int return_data(int);//反其中的一个下标给main
};

int main()
{
    cout << "Hello world!" << endl;
    a list1;
    list1.set_len(6); //这样,使用 对像 的 类方法 进行 设置
    list1.check_directly();
    list1.check_backward();
   
    int *p;
    p = list1.return_data();
   
    for(int i=0;i<list1.len;i++) //这里依赖直接访问成员变量len也是不对的思路
      cout<<"*p = "<<p<<endl;
   
    cout<<" = "<<list1.return_data(3);

    return 0;
}

void a:: set_len(int l)
{
    len=l;
    data= new int;
    for(int i=0;i<len;i++)
      data=i;
}
void a::check_directly()
{
    cout<<"directly display:"<<endl;
    for(int i=0;i<len;i++)
    {
      cout<<data<<" ";
    }
    cout<<endl;

}
void a::check_backward()
{
    cout<<"backward display:"<<endl;
    for(int i=len-1;i>-1;i--)
    {
      cout<<data<<" ";
    }
    cout<<endl;
}
int* a:: return_data()
{
    return data;
}
int a:: return_data(int i)
{
    return data;
}

howzyao 发表于 2022-9-24 18:06:30

特别指出, 楼上代码中,有一个常常被大家忽视的重要问题:
必须统一有const的使用:
声明:
const int* return_data(); //返回整个data给main

main中使用部的数据时,应加个const
const int *p;
    p = list1.return_data();

定义,同声明即可:
const int* a:: return_data()
{
    return data;
}

通过以上的C++制度,才可以确保所有代码不会在想不到的地方被不经意地改动,即:
使用数据,就是使用,不能改动;

howzyao 发表于 2022-9-24 18:10:45

gandixiwang 发表于 2022-9-24 19:43:54

{:10_254:}

zhangjinxuan 发表于 2022-9-24 21:51:45

和这个一个道理:
#include <bits/stdc++.h>

using namespace std;

int main() {
        int a;
        a = {1, 2, 3, 4, 5};
        return 0;
}

小甲鱼老师说过,初始化字符数组不能像这样初始化:
char fishc;
fishc = {"fishc"};

是一样的道理,字符数组可以用strcmp,int或者其他的只能一个一个赋值了

对于一次赋值,可能实在没有办法...

Yanyz 发表于 2022-9-24 22:27:13

#include<iostream>
#include<cmath>

using namespace std;

typedef structStr {
        int a;
        int* data;
}Str;

int main() {
        Str s;
        s.a = 12;
        int as[] = { 1,2,3,4 };
        s.data = as;

        cout << s.data << endl;
        return 0;
}

1613551 发表于 2022-9-27 08:23:51

{:10_254:}

hellogood 发表于 2022-9-27 09:30:01

谢谢

1molHF 发表于 2022-9-28 06:39:52

谢谢

kerln888 发表于 2022-9-28 08:17:54

{:10_256:}{:10_256:}{:10_256:}{:10_256:}

hornwong 发表于 2022-9-28 10:35:35

{:5_108:}

hornwong 发表于 2022-9-28 10:36:19

{:5_108:}
页: [1] 2
查看完整版本: c语言结构体赋值_已解决