鱼C论坛

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

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

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

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

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

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

  5. //定义顺序表结构体
  6. struct SqList{ //创建类
  7.         int data[MaxSize];
  8.         int length;
  9. //        int data[MaxSize] = {5,4,7,8,9,1,2,3,4,5,6};
  10. //        int length = 11;
  11.        
  12. };
  13. //定义方法
  14. int ListDelete(SqList &L){
  15.         int min = L.data[0];
  16.         int flag;
  17.         if(L.length==0){
  18.                 cout<<"顺序表中无元素可删除"<<endl;
  19.                 return 0;
  20.         }
  21.        
  22.         for(int i=1;i<L.length;i++){
  23.                 if(L.data[i] < min){
  24.                         min = L.data[i];
  25.                         flag = i;
  26.                 }
  27.         }
  28.         L.data[flag] = L.data[L.length - 1];
  29.         return min;
  30. }
  31. int main(){
  32.         //类的实例化
  33. //        SqList list1={{5,6,7,7,1,9,5,7,8},9};  
  34.         struct SqList list1;
  35.         list1.data = {1,3,4,3,5,6,7,4,9};
  36.         list1.length = 9;
  37.         int min_ele;
  38.        
  39.         cout<<"初始的顺序表:"<<endl;
  40.         for(int i=0;i<list1.length;i++){
  41.                 cout<<list1.data[i]<<" ";
  42.         }
  43.         cout<<endl;
  44.         min_ele = ListDelete(list1); //往前的语句顺序表list1没有被调整,执行了函数后被整容;
  45.         cout<<"修改之后的顺序表为:"<<endl;
  46.         for(int i=0;i<list1.length;i++){
  47.                 cout<<list1.data[i]<<" ";
  48.         }
  49.         cout<<endl;
  50.         cout<<"最小的元素为:"<<min_ele<<endl;
  51.        
  52.         return 0;
  53. }
复制代码

屏幕截图 2022-09-24 152902.png
如图
最佳答案
2022-9-24 17:20:57
  1. #include <iostream>

  2. using namespace std;
  3. struct a
  4. {
  5.     int *data;
  6.     int len;
  7.     a():data(0),len(0){};
  8.    ~a(){ delete [] data; };
  9.     void set_len(int);
  10. };

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

  16.     return 0;
  17. }

  18. void a:: set_len(int l)
  19. {
  20.     len=l;
  21.     data= new int[len];
  22.     for(int i=0;i<len;i++)
  23.         data[i]=0;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

回帖奖励 +10 鱼币

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

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

        改这样试试
  1.         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 | 显示全部楼层    本楼为最佳答案   
  1. #include <iostream>

  2. using namespace std;
  3. struct a
  4. {
  5.     int *data;
  6.     int len;
  7.     a():data(0),len(0){};
  8.    ~a(){ delete [] data; };
  9.     void set_len(int);
  10. };

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

  16.     return 0;
  17. }

  18. void a:: set_len(int l)
  19. {
  20.     len=l;
  21.     data= new int[len];
  22.     for(int i=0;i<len;i++)
  23.         data[i]=0;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

发表于 2022-9-24 17:47:47 | 显示全部楼层
  1. #include <iostream>

  2. using namespace std;
  3. struct a
  4. {
  5.     int *data;
  6.     int len;
  7.     a():data(0),len(0){};
  8.    ~a(){ delete [] data; };
  9.     void set_len(int);
  10.     void check_directly();
  11.     void check_backward();
  12. };

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

  20.     return 0;
  21. }

  22. void a:: set_len(int l)
  23. {
  24.     len=l;
  25.     data= new int[len];
  26.     for(int i=0;i<len;i++)
  27.         data[i]=i;
  28. }
  29. void a::check_directly()
  30. {
  31.     cout<<"directly display:"<<endl;
  32.     for(int i=0;i<len;i++)
  33.     {
  34.         cout<<data[i]<<" ";
  35.     }
  36.     cout<<endl;

  37. }
  38. void a::check_backward()
  39. {
  40.     cout<<"backward display:"<<endl;
  41.     for(int i=len-1;i>-1;i--)
  42.     {
  43.         cout<<data[i]<<" ";
  44.     }
  45.     cout<<endl;
  46. }
复制代码



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

使用道具 举报

发表于 2022-9-24 17:49:23 | 显示全部楼层
  1. #include <iostream>

  2. using namespace std;
  3. struct a
  4. {
  5.     int *data;
  6.     int len;
  7.     a():data(0),len(0){};
  8.    ~a(){ delete [] data; };
  9.     void set_len(int);
  10.     void check_directly();
  11.     void check_backward();
  12.     int* return_data(); //返回整个data给main
  13.     int return_data(int);//反其中的一个下标给main
  14. };

  15. int main()
  16. {
  17.     cout << "Hello world!" << endl;
  18.     a list1;
  19.     list1.set_len(6); //这样,使用 对像 的 类方法 进行 设置
  20.     list1.check_directly();
  21.     list1.check_backward();
  22.    
  23.     int *p;
  24.     p = list1.return_data();
  25.    
  26.     for(int i=0;i<list1.len;i++) //这里依赖直接访问成员变量len也是不对的思路
  27.         cout<<"*p = "<<p[i]<<endl;
  28.    
  29.     cout<<"[i] = "<<list1.return_data(3);

  30.     return 0;
  31. }

  32. void a:: set_len(int l)
  33. {
  34.     len=l;
  35.     data= new int[len];
  36.     for(int i=0;i<len;i++)
  37.         data[i]=i;
  38. }
  39. void a::check_directly()
  40. {
  41.     cout<<"directly display:"<<endl;
  42.     for(int i=0;i<len;i++)
  43.     {
  44.         cout<<data[i]<<" ";
  45.     }
  46.     cout<<endl;

  47. }
  48. void a::check_backward()
  49. {
  50.     cout<<"backward display:"<<endl;
  51.     for(int i=len-1;i>-1;i--)
  52.     {
  53.         cout<<data[i]<<" ";
  54.     }
  55.     cout<<endl;
  56. }
  57. int* a:: return_data()
  58. {
  59.     return data;
  60. }
  61. int a:: return_data(int i)
  62. {
  63.     return data[i];
  64. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 鱼币

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

  2. using namespace std;

  3. int main() {
  4.         int a[6];
  5.         a = {1, 2, 3, 4, 5};
  6.         return 0;
  7. }
复制代码


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


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

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

使用道具 举报

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

  3. using namespace std;

  4. typedef struct  Str {
  5.         int a;
  6.         int* data;
  7. }Str;

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

  13.         cout << s.data[2] << endl;
  14.         return 0;
  15. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-4-25 19:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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