作业信息

这个作业属于哪个课程 <班级的链接>(如2022-2023-1-计算机基础与程序设计
这个作业要求在哪里 <作业要求的链接>(如2022-2023-1计算机基础与程序设计第十三周作业)
这个作业的目标 <写上具体方面>
作业正文 ... 本博客链接

教材学习内容总结

原第十一章我感觉还有些难点准备回顾一下
11.1指针与一维数组的关系
重点我认为在指针表示数组的地址这一块
即包括间接寻址


11.2指针与二维数组的关系
首先看二位数组地址的一般表示

行指针


简单回顾后就是下一章,即十二章结构体与共用体的相关知识

第十二章 结构体与数据基础结构

主要内容如下

12.1从基本数据类型到抽象数据类型
为解决任何一种程序设计语言都无法将实际应用中涉及的所有复杂数据对象都作为其基本数据类型,
允许用户自定义数据类型(User-Defined Data Type)
构造数据类型(也称复合数据类型)出现。
C语言中的典型代表就是,结构体。
12.2结构体的定义
12.2.1为什么要定义结构体类型
12.2.2结构体变量的定义
定义结构体的第一步:声明一个结构体模板。
格式



12.2.3用typedef定义数据类型

12.2.4结构体变量的初始化
定义一个结构体变量stu1并对其初始化

12.2.5嵌套的结构体

12.2.6结构体变量的应用

12.2.7结构体所占内存的字节数

12.3结构体数组的定义和初始化

12.3.1结构体数组的定义

12.3.2结构体数组的初始化

12.4结构体指针的定义和初始化

12.4.1指向结构体变量的指针



12.4.2指向结构体数组的指针

12.5向函数传递结构体



12.6共用体

12.7枚举类型

12.8动态数据结构——单向链表

附一个学习链表查找的博客吧
【c语言】链表(完整版)
版权声明:本文为CSDN博主「MING.MING」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43173301/article/details/104993118
12.8.1
12.8.2链表的定义
12.8.3单向链表的建立
12.8.4单向链表的删除操作
12.8.5单向链表的插入操作
12.9本章扩充内容
12.9.1栈和队列
12.9.2树和图
12.9.3数据的逻辑结构和存储结构

教材学习中的问题和解决过程

在结构体本身的使用上我有点卡壳。我向来是开始学习都比较愚钝的。在运用上上手很慢。比如那个指针的——>的含义,在后面讲链表时的使用让我听得迷迷糊糊,只有多看多想了。

代码调试中的问题和解决

  1. 黑白子交换。有三个白子和三个黑子如下图布置:(-表示一个空格)
    ○ ○ ○ - ● ● ●
    游戏的目的是用多少的步数将上图中白子和黑子的位置进行交换:
    ● ● ● - ○ ○ ○
    游戏的规则是:一次只能移动一个棋子;棋子可以向空格中移动,也可以跳过一个对方的格子进入空格,但不能向后跳,也不能跳过两个子。请用计算机实现上述游戏。

程序运行示例如下:
No. 0:-----------
|||| |@|@|@|
-----------
No. 1:-----------
|
|| ||@|@|@|
-----------
No. 2:-----------
|||@|| |@|@|
-----------
No. 3:-----------
|
||@||@| |@|
-----------
No. 4:-----------
|||@| |@||@|
-----------
No. 5:-----------
|
| |@||@||@|
-----------
No. 6:-----------
| ||@||@||@|
-----------
No. 7:-----------
|@|
| ||@||@|
-----------
No. 8:-----------
|@||@|| ||@|
-----------
No. 9:-----------
|@|
|@||@|| |
-----------
No.10:-----------
|@||@||@| ||
-----------
No.11:-----------
|@|
|@| |@|||
-----------
No.12:-----------
|@| |@||@|||
-----------
No.13:-----------
|@|@| |
|@|||
-----------
No.14:-----------
|@|@|@|| |||
-----------
No.15:-----------
|@|@|@| |
|||
-----------
第一遍我甚至只打出了
No. 0:-----------
|||*| |@|@|@|
-----------
就没有了,结果发现逻辑错误,循环没有进行下去
接下来是我自己打的代码

#include <stdio.h>
#include <stdlib.h>
#define N 8
void Game(char i[]);
void print(char i[]);
int main()
{
    char i[N];
    int j,m;
    gets(i);
    scanf("%d",&j);
    for(m=0;m<=j;m++)
    {
        printf("No. %d:-----------\n",m);
        print(i);
        Game(i);
    }

    return 0;

}

void Game(char i[])
{
    int k;
    char temp;
    for(k=0;k<N;k++)
    {
        if(i[k+1]==' ' && i[k]=='*')
        {
            temp=i[k];
            i[k]=i[k+1];
            i[k+1]=temp;
            break;
        }
        if(i[k+1]=='@' && i[k]=='*' && i[k+2]==' ')
        {
            temp=i[k];
            i[k]=i[k+2];
            i[k+2]=temp;
            break;
        }

        if(i[k-1]==' ' && i[k]=='@')
        {
            temp=i[k];
            i[k]=i[k-1];
            i[k-1]=temp;
            break;
        }
        if(i[k-1]=='*' && i[k]=='@' && i[k-2]==' ')
        {
            temp=i[k];
            i[k]=i[k-2];
            i[k-2]=temp;
            break;
        }
    }

}
void print(char i[])
{
    int a;
    for(a=0;a<N;a++)
    {
        printf("|%c",i[a]);
    }
    printf("\n    -----------\n");
}

结果嘛

|*|*|*| |@|@|@|
    -----------
No. 1:-----------
|*|*| |*|@|@| |
    -----------
No. 2:-----------
|*| |*|*|@|@| |
    -----------
No. 3:-----------
| |*|*|*|@|@| |
    -----------
No. 4:-----------
| |*|*|*|@|@| |
    -----------
No. 5:-----------
| |*|*|*|@|@| |
    -----------
No. 6:-----------
| |*|*|*|@|@| |
    -----------
No. 7:-----------
| |*|*|*|@|@| |
    -----------
No. 8:-----------
| |*|*|*|@|@| |
    -----------
No. 9:-----------
| |*|*|*|@|@| |
    -----------
No. 10:-----------
| |*|*|*|@|@| |
    -----------
No. 11:-----------
| |*|*|*|@|@| |
    -----------
No. 12:-----------
| |*|*|*|@|@| |
    -----------
No. 13:-----------
| |*|*|*|@|@| |
    -----------
No. 14:-----------
| |*|*|*|@|@| |
    -----------
No. 15:-----------
| |*|*|*|@|@| |
    -----------

如大家所见错了
我发现它移动棋子的顺序很奇怪,难以理解
既不是一方一次只能移一个,也不是从左往右一方三个棋子都尝试移动。

小朋友,我头上全都是问号

于是我搜了一个答案

点击查看代码
int number;
print(a)
int a[];
    {
      int i;
      printf("No.%2d:-----------\n",number++);
      printf("      ");
      for(i=0;i<=6;i++)
       printf("|%c",a[i]==1?'*':(a[i]==2?'@':' '));
    printf("|\n    -----------\n");
    }
main()
{
int t[7]={1,1,1,0,2,2,2};
    int i,flag;
    print(t);
    while(t[0]+t[1]+t[2]!=6||t[4]+t[5]+t[6]!=3)
    {
        flag=1;
 
        for(i=0;flag&&i<5;i++)
        if(t[i]==1&&t[i+1]==2&&t[i+2]==0)
        {change(&t[i],&t[i+2]);print(t);flag=0;}
        for(i=0;flag&&i<5;i++)
        if(t[i]==0&&t[i+1]==1&&t[i+2]==2)
        {change(&t[i],&t[i+2]);print(t);flag=0;}
        for(i=0;flag&&i<6;i++)
 
        if(t[i]==1&&t[i+1]==0&&(i==0||t[i-1]!=t[i+2]))
        {change(&t[i],&t[i+1]);print(t);flag=0;}
        for(i=0;flag&&i<6;i++)
 
        if(t[i]==0&&t[i+1]==2&&(i==5||t[i-1]!=t[i+2]))
        {change(&t[i],&t[i+1]);print(t);flag=0;}
    }
}
change(n,m)
  int *n,*m;
{
int term;
term=*n;*n=*m;*m=term;
}
版权:https://blog.csdn.net/Luminary_Tianhao/article/details/122202470

感觉奇奇怪怪,难道我非得用那么多指针吗?而且还没有头文件没看懂 还有使用结构体的 `https://blog.csdn.net/linolzhang/article/details/57155191`
点击查看代码
#include <iostream>  
#include <list>  
using namespace std;  
  
#define WHITEPIECE 1  
#define BLACKPIECE 2  
#define NULLVALUE  0  
#define MAPLEN     7  
  
typedef struct stStatus  
{  
   int m_data[MAPLEN];  
}Status;  
  
list<Status> g_listatus;//存储整个步骤  
  
void GameStep(Status& st, int NullPos);  
bool GameOver(Status& st);  
  
int main()  
{  
    Status ss = {1,1,1,0,2,2,2};  
    GameStep(ss,3);  
    return 0;  
}  
  
void GameStep(Status& st, int NullPos)  
{  
     g_listatus.push_back(st);  
  
     if(GameOver(st))  
     {  
         list<Status>::iterator it = g_listatus.begin();  
         for(;it != g_listatus.end();++it)  
         {  
             for(int i=0; i<MAPLEN; ++i)  
             {  
                 cout << it->m_data[i] << " ";  
             }  
             cout << endl;  
         }  
         return;  
     }  
  
     if((NullPos+1) < MAPLEN)//空格的右边第一个棋子判别  
     {  
         if(st.m_data[NullPos+1] == BLACKPIECE)  
         {  
             if((NullPos < 3)||(NullPos-1)>-1 && (st.m_data[NullPos-1] != BLACKPIECE))  
             {  
                  st.m_data[NullPos] = BLACKPIECE;  
                  st.m_data[NullPos+1] = NULLVALUE;  
                  GameStep(st, NullPos+1);  
             }  
         }  
     }  
  
     if((NullPos+2) < MAPLEN)//空格的右边第二个棋子判别  
     {  
         if(st.m_data[NullPos+2] == BLACKPIECE)  
         {  
             if((NullPos < 3)||(NullPos-1)>-1 && (st.m_data[NullPos+1] != BLACKPIECE) && (st.m_data[NullPos-1] != BLACKPIECE))  
             {  
                 st.m_data[NullPos] = BLACKPIECE;  
                 st.m_data[NullPos+2] = NULLVALUE;  
                 GameStep(st, NullPos+2);  
             }  
         }  
     }  
  
     if((NullPos-1) > -1)//空格的左边第一个棋子判别  
     {  
         if(st.m_data[NullPos-1] == WHITEPIECE)  
         {  
             if((NullPos > 3)||(NullPos+1) < MAPLEN && (st.m_data[NullPos+1] != WHITEPIECE))  
             {  
                 st.m_data[NullPos] = WHITEPIECE;  
                 st.m_data[NullPos-1] = NULLVALUE;  
                 GameStep(st, NullPos-1);  
             }  
         }  
     }  
  
     if((NullPos-2) > -1)//空格的左边第二个棋子判别  
     {  
         if(st.m_data[NullPos-2] == WHITEPIECE)  
         {  
             if((NullPos > 3)||(NullPos+1) < MAPLEN && (st.m_data[NullPos+1] != WHITEPIECE) && (st.m_data[NullPos-1] != WHITEPIECE))  
             {  
                 st.m_data[NullPos] = WHITEPIECE;  
                 st.m_data[NullPos-2] = NULLVALUE;  
                 GameStep(st, NullPos-2);  
             }  
         }  
     }  
  
     g_listatus.pop_back();  
     st = g_listatus.back();  
     return;  
}  
  
bool GameOver(Status& st)  
{  
    if(st.m_data[3] == NULLVALUE)  
    {  
       return (st.m_data[0] + st.m_data[1] + st.m_data[2] == 6) ? true : false;  
    }  
    return false;  
}

结果找了参考答案

int number;
print(a)
int a[];
    {	    	 		  		 	 
      int i;
      printf("No.%2d:-----------\n",number++);
      printf("      ");
      for(i=0;i<=6;i++)
       printf("|%c",a[i]==1?'*':(a[i]==2?'@':' '));
    printf("|\n    -----------\n");
    }
main()
{	    	 		  		 	 
int t[7]={1,1,1,0,2,2,2};
    int i,flag;
    print(t);
    while(t[0]+t[1]+t[2]!=6||t[4]+t[5]+t[6]!=3)
    {	    	 		  		 	 
        flag=1;

        for(i=0;flag&&i<5;i++)
        if(t[i]==1&&t[i+1]==2&&t[i+2]==0)
        {change(&t[i],&t[i+2]);print(t);flag=0;}
        for(i=0;flag&&i<5;i++)
        if(t[i]==0&&t[i+1]==1&&t[i+2]==2)
        {change(&t[i],&t[i+2]);print(t);flag=0;}
        for(i=0;flag&&i<6;i++)

        if(t[i]==1&&t[i+1]==0&&(i==0||t[i-1]!=t[i+2]))
        {change(&t[i],&t[i+1]);print(t);flag=0;}
        for(i=0;flag&&i<6;i++)

        if(t[i]==0&&t[i+1]==2&&(i==5||t[i-1]!=t[i+2]))
        {change(&t[i],&t[i+1]);print(t);flag=0;}
    }
}	    	 		  		 	 
change(n,m)
  int *n,*m;
{	    	 		  		 	 
int term;
term=*n;*n=*m;*m=term;
}	    	 		  		

突然发现int number好像是个函数(没传参而已)
中等的题就把我做成这样,可怕,任重道远。
本来还自我感觉良好的说。

代码托管

其他(感悟、思考等,可选)

编程里的逻辑思维确实很难,我感觉才智有点无用武之地了,看来还是得深思而慎取之啊!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第十二周 300/2900 3/26 25/245
第十三周 400/3300 2/28 26/271 鼓足干劲加油干!

参考资料

posted on 2022-11-27 22:24  20221417wzy  阅读(33)  评论(0编辑  收藏  举报