| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1363 人关注过本帖
标题:C语言初学,光反射问题
只看楼主 加入收藏
cbkay
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-12-2
收藏
 问题点数:0 回复次数:6 
C语言初学,光反射问题
假设一个房间5*6,在(3,1)向右上45度射出一光线,求指定的第k个坐标。
如果遇到角落,即不会再反射。
如第四个坐标为(5,5),第五个为(1,1)角落,之后就无论输入k是多少,都是(1,1)

想了好久没有出好的方法,希望前辈指点
搜索更多相关主题的帖子: C语言 
2016-12-02 23:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
程序代码:
#include<stdio.h>
typedef struct Node  //这块是结构体的,不懂可以去看看这部分的东东,程序的思想内容一时不好解释,但开窍后理解上来就很简单了
{
    int x;
    int y;
    int tx;
    int ty;
}Node;
static Node S;    //其实static可以不加,加了防止被其它文件引用造成混乱,对于单个文件而言可以不加
void fun()
{
    if (S.tx==1)    
        S.x--;
    else
        S.x++;
    if (S.ty==1)
        S.y++;
    else
        S.y--;
}
void move(int *k)
{
    int t=0;
    if (S.x==1||S.x==5)    
    {
        S.tx*=-1;
        *k=*k-1;
        t++;
    }
    if (S.y==1||S.y==6)
    {
        S.ty*=-1;
        *k=*k-1;
        t++;
    }
    if (t==2)   //如果遇到角落,则不再反射
        *k=1;
}
int main()
{
    int k,count;
    S.x=3;        
    S.y=1;
    S.tx=1;
    S.ty=1;

    printf("请输入次数\n");
    scanf("%d",&k);
    count=k;

    printf("光线的走向为\n");

    while (k-1)
    {
        fun();
        move(&k);
        printf("[%d][%d]\n",S.x,S.y);
    }

    printf("第%d次落点为\n",count);
    printf("[%d][%d]\n",S.x,S.y);
    return 0;
}//应该是这样子了~


[此贴子已经被作者于2016-12-3 14:19编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-03 00:37
cbkay
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-12-2
收藏
得分:0 
回复 2楼 九转星河
谢谢~不过我还不太理解这个计算的方法,以及Static以及typedef struct的意义。
房间0点位置是在左上角,射入点是左边墙壁,射入角度始终是向右上45度

[此贴子已经被作者于2016-12-3 11:35编辑过]

2016-12-03 11:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
诶,忘记标题说是初学了,等你学到结构体的时候再来看看把,我写得应该都是很容易理解的,不过感觉我写得有点不够完善的地方,已经改正,再看看~

更正内容:
1-改正了房间的边界范围

2-当遇到角落时就不反射

补充一下,这样就和题目匹配了~

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-12-3 14:23编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-03 14:09
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 4楼 九转星河
原来是光沿着左上45度走的。难怪看不懂打印的数据。

[此贴子已经被作者于2016-12-3 14:46编辑过]

2016-12-03 14:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 linlulu001
拿这个再去验证一下~其实我是按数组坐标走向来写的,和传统的xoy直角坐标系有点出入。我已经加上落点位置了(其实上贴我写少了起始坐标[3][1],下面已经补充起始坐标)。
程序代码:
#include<stdio.h>
typedef struct Node  //这块是结构体的,不懂可以去看看这部分的东东,程序的思想内容一时不好解释,但开窍后理解上来就很简单了
{
    int x;
    int y;
    int tx;
    int ty;
}Node;
static Node S;    //其实static可以不加,加了防止被其它文件引用造成混乱,对于单个文件而言可以不加
void fun()
{
    if (S.tx==1)    
        S.x--;
    else
        S.x++;
    if (S.ty==1)
        S.y++;
    else
        S.y--;
}
void move(int *k,int count)
{
    int t=0;
    if (S.x==1||S.x==5)    
    {
        S.tx*=-1;
        *k=*k-1;
        t++;
    }
    if (S.y==1||S.y==6)
    {
        S.ty*=-1;
        *k=*k-1;
        t++;
    }
    if (t)
        printf("第%d次落点[%d][%d]\n",count-*k+1,S.x,S.y);
    else
        printf(" 光线走向[%d][%d]\n",S.x,S.y);
    if (t==2)   //如果遇到角落,则不再反射
    {
        printf("光线遇到角落不再反射\n");
        *k=1;
    }
}
int main()
{
    int k,count;
    S.x=3;        
    S.y=1;
    S.tx=1;
    S.ty=1;

    printf("请输入次数\n");
    scanf("%d",&k);
    count=k;

    printf("光线的走向为\n");
    printf("第%d次落点[%d][%d]\n",count-k+1,S.x,S.y);

    while (k-1)
    {
        fun();
        move(&k,count);
    }

    return 0;
}//应该是这样子了~
/*
  x/y坐标图
  -----------------
  |x/y 1 2 3 4 5 6|
  |  1            |
  |  2            |
  |  3            |
  |  4            |
  |  5            |
  -----------------*/



QQ截图20161203150831.png (9.23 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-03 15:10
cbkay
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-12-2
收藏
得分:0 
回复 6楼 九转星河
研究清楚了,谢谢!!
2016-12-04 23:00
快速回复:C语言初学,光反射问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020021 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved