鱼C论坛

 找回密码
 立即注册
查看: 3086|回复: 20

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

[复制链接]
发表于 2022-9-24 15:30:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 涛4091 于 2023-2-23 11:02 编辑
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxSize 50

//定义顺序表结构体
struct SqList{ //创建类 
        int data[MaxSize];
        int length;
//        int data[MaxSize] = {5,4,7,8,9,1,2,3,4,5,6};
//        int length = 11;
        
};
//定义方法
int ListDelete(SqList &L){
        int min = L.data[0];
        int flag;
        if(L.length==0){
                cout<<"顺序表中无元素可删除"<<endl;
                return 0;
        }
        
        for(int i=1;i<L.length;i++){
                if(L.data[i] < min){
                        min = L.data[i];
                        flag = i;
                }
        }
        L.data[flag] = L.data[L.length - 1];
        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[i]<<" ";
        }
        cout<<endl; 
        min_ele = ListDelete(list1); //往前的语句顺序表list1没有被调整,执行了函数后被整容; 
        cout<<"修改之后的顺序表为:"<<endl;
        for(int i=0;i<list1.length;i++){
                cout<<list1.data[i]<<" ";
        }
        cout<<endl;
        cout<<"最小的元素为:"<<min_ele<<endl;
        
        return 0;
}
屏幕截图 2022-09-24 152902.png
如图
最佳答案
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[len];
    for(int i=0;i<len;i++)
        data[i]=0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-24 15:31:07 | 显示全部楼层
哪位兄弟来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 15:43:52 | 显示全部楼层

回帖奖励 +10 鱼币

本帖最后由 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 句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 17:13:26 | 显示全部楼层

回帖奖励 +10 鱼币

struct SqList list1; //不需要加关键字struct
list1.data = {1,3,4,3,5,6,7,4,9}; // 写成 list1.data[]{...};试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


楼主的这种做法,相当于"平面展开",应当可以被随意访问.好处是便于随意改,坏处是完全忽视了"结构"的初衷.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[len];
    for(int i=0;i<len;i++)
        data[i]=0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 17:24:20 | 显示全部楼层

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

结构a,相当于你的结构,上面代码可以直接运行,你试试,若好用,请设为解决.谢谢.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[len];
    for(int i=0;i<len;i++)
        data[i]=i;
}
void a::check_directly()
{
    cout<<"directly display:"<<endl;
    for(int i=0;i<len;i++)
    {
        cout<<data[i]<<" ";
    }
    cout<<endl;

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


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

使用道具 举报

发表于 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[i]<<endl;
    
    cout<<"[i] = "<<list1.return_data(3);

    return 0;
}

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

}
void a::check_backward()
{
    cout<<"backward display:"<<endl;
    for(int i=len-1;i>-1;i--)
    {
        cout<<data[i]<<" ";
    }
    cout<<endl;
}
int* a:: return_data()
{
    return data;
}
int a:: return_data(int i)
{
    return data[i];
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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++制度,才可以确保所有代码不会在想不到的地方被不经意地改动,即:
使用数据,就是使用,不能改动;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 18:10:45 | 显示全部楼层
sshot-5.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 19:43:54 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-24 21:51:45 | 显示全部楼层

回帖奖励 +10 鱼币

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

using namespace std;

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

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

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

对于一次赋值,可能实在没有办法...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 22:27:13 | 显示全部楼层
#include<iostream>
#include<cmath>

using namespace std;

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

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

        cout << s.data[2] << endl;
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-27 08:23:51 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-27 09:30:01 | 显示全部楼层

回帖奖励 +10 鱼币

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-28 06:39:52 | 显示全部楼层

回帖奖励 +10 鱼币

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-28 08:17:54 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-28 10:35:35 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-28 10:36:19 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 13:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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