C语言作业:结构体编程练习 在屏幕上模拟显示一个数字式时钟 源代码能给我的话+50,感谢

C语言作业:结构体编程练习 在屏幕上模拟显示一个数字式时钟 源代码能给我的话+50,感谢,第1张

#include <stdioh>

struct clock {

int hour;

int minute;

int second;

};

typedef struct clock CLOCK;

/

函数功能:时、分、秒时间的更新

函数参数:无

函数返回值:无

/

void Update(CLOCK myclock) {

myclock->second++;

if (myclock->second == 60) { /若second值为60,表示已过1分钟,则 minute值加1/

myclock->second = 0;

myclock->minute++;

}

if (myclock->minute == 60){ /若minute值为60,表示已过1小时,则 hour值加1/

myclock->minute = 0;

myclock->hour++;

}

if (myclock->hour == 24) { /若hour值为24,则hour的值从0开始计时/

myclock->hour = 0;

}

}

/

函数功能:时、分、秒时间的显示

函数参数:无

函数返回值:无

/

void Display(CLOCK myclock) { /用回车符'\r'控制时、分、秒显示的位置/

printf("%2d:%2d:%2d\r", myclock->hour, myclock->minute, myclock->second);

}

/

函数功能:模拟延迟1秒的时间

函数参数:无

函数返回值:无

/

void Delay(void) {

long t;

for (t = 0; t < 290000000; t++) {

/循环体为空语句的循环,起延时作用/

}

}

int main(){

CLOCK myclock;

long i;

myclockhour = myclockminute = myclocksecond = 0; /hour,minute,second赋初值0/

for (i = 0; i < 100000; i++) { /利用循环结构,控制时钟运行的时间/

Update(&myclock); /时钟更新/

Display(&myclock); /时间显示/

Delay(); /模拟延时1秒/

}

return 0;

}

显示当前时间的时钟

为游戏对象创建层级关系

编写脚本并与对象关联

使用命名空间

使用方法更新游戏物体

按时间进行旋转

在此教程中我们编写一个简单的C#脚本来制作时钟指针动画。

要求大家已经对Unity的编辑器有了基本的了解,其实,只需用过Unity几分钟就可以开始该案例了。

很快我们就能完成以下成果。

制作时钟

不用任何Unity资源包,我们从0开始创建Unity工程。缺省的场景中有一个位于 (0, 1, -10), 朝着z轴的负方向的摄像机,为了使摄像机中显示的透视图与场景一致,选择摄像机,并在菜单中选择执行 GameObject / Align View将摄像机与当前场景对齐。

啥是 游戏物体

子物体又是哈东东?

我们就简单用立方体来制作时钟的指针,为每个指针使用 GameObject/ Create Other / Cube 创建立方体。对于时针,设置其位置为 (0, 1, 0) ,三个轴上的缩放分别为 (05, 2, 05) ,对分针位置为 (0, 15, 0) ,缩放 (025, 3, 025) ,秒针的则分别是: (0, 2, 0)

(01,4, 01)。

创建的时钟,以及其中游戏物体间的层级关系。

制作时钟指针动画

要让时钟动起来,就得写点脚本了。在工程视图中右键,选择 Create/ C# Script 新建一个C#脚本,将其命名为 ClockAnimator。 双击打开之,将其中内容清空,从空文件开始。

首先,我们要引用Unity的命名空间,接着就是定义 ClockAnimator 类。将其定义为一个公开的类,继承自[MonoBehaviour]

using UnityEngine;

public class ClockAnimator : [MonoBehaviour]

}

神马是命名空间?

类又是啥?

关于[MonoBehaviour]类?

这样我们就创建了一个可以作为组件的最小的类。保存之,接着从 Project 窗口中把它直接拖放到 Hierarchy (层级)视图的 Clock 游戏物体上,建立其与该游戏对象的关联。当然,也可以使用 Clock 游戏物体的 Add Component 按钮。

将ClockAnimator与Clock关联

要让指针动起来,我们得使用指针组件的 Transform 对象。首先,在刚才的脚本中为每个指针添加一个 Transform 变量,并保存它。这样,这些公开变量就成为可在编辑器中被赋值的组件属性,编辑器会获得这些游戏物体的 Transform 组件,并将它们赋予这些变量,选择 Clock ,将指针对应的游戏物体赋给这些属性。

变量是什么?

using UnityEngine;

public class ClockAnimator : [MonoBehaviour]{

}

为空的ClockAnimator属性和填写属性后的ClockAnimator

下面在脚本中添加一个update方法。这是一个特殊的方法,它会在每一帧播放时调用,我们在这个方法中实现时钟指针的旋转。

using UnityEngine;

public class ClockAnimator : [MonoBehaviour]{

}

}

方法是啥?

[ Update ] 方法是否应当公开?

保存脚本,编辑器会提示组件中已经有了update方法,并在脚本组件的左侧出现一个复选框,这样我们就能禁用该脚本组件了,当然此时,还是要保持它处于可用状态。

ClockAnimator更新的显示了复选框

每个小时,时针要转动360/12度;分钟指针则是每分钟转动360/60度;而秒针是每秒旋转360/60度。为了程序中使用方便,我们把这些值定义为私有的浮点常量。

using UnityEngine;

public class ClockAnimator : [MonoBehaviour] {

}

常量有什么特殊性?

为了让时钟转动起来,每次update时,我们先得到当前系统的时间。System命名空间中的[DateTime] 结构体 可以用来存储时间,而该结构体中的静态属性Now可以返回当前时间,这样,每次update时,我们就先得到该值并将其存储到一个临时变量中。

using UnityEngine;

using System;

public class ClockAnimator : [MonoBehaviour]{

}

什么是结构体?

属性又是什么?

要让指针转动,就需要更新指针的旋转,而这可以通过设置指针的localRotation实现。使用四元数:[Quaternion]可以定义任意角度的旋转。

因为摄像机朝向是z轴,Unity使用的是左手坐标系统,因此指针应该是绕着Z轴负方向进行旋转。

using UnityEngine;

using System;

public class ClockAnimator : [MonoBehaviour] {

}

时间显示为12:44

四元数quaternion是什么?

旋转又是啥?

改进时钟的实现

很好!在游戏的运行模式中,时钟已经可以显示当前的时间了,但是使用离散的时间值让它看起来更像是一个电子钟。下面增加一个选项,实现模拟时间显示。在脚本中添加一个公开的布尔变量 analog ,用它来决定update方法中的显示方式,这样我们就能在编辑器中直接控制时钟的显示方式了,即使是在游戏运行时。

using UnityEngine;

using System;

public class ClockAnimator : [MonoBehaviour] {

}

添加了analog模式的ClockAnimator

对于模拟现实显示的选项,我们使用和之前稍稍不同的方式。这次不用[DateTime]Now,我们用[DateTime]NowTimeOfDay,这是一个时间段[TimeSpan]。返回的是自每天午夜开始到现在已经经过的小时,分钟和秒数。由于这个值是双精度数,使用时我们需要将它们转换为float类型。

类型转换的意思是

using UnityEngine;

using System;

public class ClockAnimator : [MonoBehaviour] {

}

按照模拟方式显示的时钟

现在时钟也可以按模拟方式显示了。

unitypackage PDF

原文链接:

>

如果Qt中的定时器函数执行时间太长,可能会导致界面卡顿或响应不及时。这可能是因为定时器回调函数中执行了耗时 *** 作或者因为定时器的间隔设置过短,导致频繁调用定时器回调函数。为了解决这个问题,可以采取以下措施:

1 将耗时 *** 作迁移到后台线程中执行,避免阻塞主线程。

2 调整定时器间隔,避免频繁调用定时器回调函数。如果定时器回调函数确实需要频繁执行,可以考虑适当提高定时器回调函数的优先级。

3 对定时器回调函数进行优化,在保证功能正确的前提下,尽可能减少执行时间。

4 对界面进行分析,找出可能导致卡顿的原因,进行优化。

综上所述,避免定时器回调函数执行时间过长是提高Qt应用程序运行效率、提升用户体验的重要措施之一。

程序代码如下:

#include<iostream>

#include<windowsh>

using namespace std;

class Clock{

public:

Clock(short h=0,short m=0,short s=0):h(h),m(m),s(s){

}

void displayTime();

private:

short h;

short m;

short s;

};void Clock::displayTime(){

while(true){

cout<<h<<':'<<m<<':'<<s<<" ";

Sleep(1000);

cout<<'\r';

if(!(s=++s%60))

if(!(m=++m%60))

h=++h%24;

}

} int main()

{

Clock A(23,59,55);

AdisplayTime();

return 0;

}

扩展资料:

定义一个日期类,包括年、月、日三个成员变量,显示日期的方法如下:

publicclassDemo{

publicstaticvoidmain(String[]args){

Datedate1=newDate(1994,5,22);

date1showInfo();

Datedate2=newDate();

date2year=1995;

date2month=6;

date2day=29;

date2showInfo();

}

}

//日期类:

publicclassDate{

intyear;

intmonth;

intday;

//构造方法

publicDate(intyear,intmonth,intday){

thisyear=year;

thismonth=month;

thisday=day;

}

publicDate(){

}

publicvoidshowInfo(){

Systemoutprintln(year+"年"+month+"月"+day+"日");

}

}

最详细的:

void SetIsotropic (HDC hdc, int cxClient, int cyClient)

{

SetMapMode (hdc, MM_ISOTROPIC) ;

SetWindowExtEx (hdc, 1000, 1000, NULL) ;

SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ;

SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;

}

void RotatePoint (POINT pt[], int iNum, int iAngle)

{

int i ;

POINT ptTemp ;

for (i = 0 ; i < iNum ; i++)

{

ptTempx = (int) (pt[i]x cos (TWOPI iAngle / 360) +

pt[i]y sin (TWOPI iAngle / 360)) ;

ptTempy = (int) (pt[i]y cos (TWOPI iAngle / 360) -

pt[i]x sin (TWOPI iAngle / 360)) ;

pt[i] = ptTemp ;

}

}

void DrawClock (HDC hdc)

{

int iAngle ;

POINT pt[3] ;

for (iAngle = 0 ; iAngle < 360 ; iAngle += 6)

{

pt[0]x = 0 ;

pt[0]y = 900 ;

RotatePoint (pt, 1, iAngle) ;

pt[2]x = pt[2]y = iAngle % 5 33 : 100 ;

pt[0]x -= pt[2]x / 2 ;

pt[0]y -= pt[2]y / 2 ;

pt[1]x = pt[0]x + pt[2]x ;

pt[1]y = pt[0]y + pt[2]y ;

SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;

Ellipse (hdc, pt[0]x, pt[0]y, pt[1]x, pt[1]y) ;

}

}

void DrawHands (HDC hdc, SYSTEMTIME pst, BOOL fChange)

{

static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,

0, -200, 50, 0, 0, 800, -50, 0, 0, -200,

0, 0, 0, 0, 0, 0, 0, 0, 0, 800 } ;

int i, iAngle[3] ;

POINT ptTemp[3][5] ;

iAngle[0] = (pst->wHour 30) % 360 + pst->wMinute / 2 ;

iAngle[1] = pst->wMinute 6 ;

iAngle[2] = pst->wSecond 6 ;

memcpy (ptTemp, pt, sizeof (pt)) ;

for (i = fChange 0 : 2 ; i < 3 ; i++)

{

RotatePoint (ptTemp[i], 5, iAngle[i]) ;

Polyline (hdc, ptTemp[i], 5) ;

}

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static int cxClient, cyClient ;

static SYSTEMTIME stPrevious ;

BOOL fChange ;

HDC hdc ;

PAINTSTRUCT ps ;

SYSTEMTIME st ;

switch (message)

{

case WM_CREATE :

SetTimer (hwnd, ID_TIMER, 1000, NULL) ;

GetLocalTime (&st) ;

stPrevious = st ;

return 0 ;

case WM_SIZE :

cxClient = LOWORD (lParam) ;

cyClient = HIWORD (lParam) ;

return 0 ;

case WM_TIMER :

GetLocalTime (&st) ;

fChange = stwHour != stPreviouswHour ||

stwMinute != stPreviouswMinute ;

hdc = GetDC (hwnd) ;

SetIsotropic (hdc, cxClient, cyClient) ;

SelectObject (hdc, GetStockObject (WHITE_PEN)) ;

DrawHands (hdc, &stPrevious, fChange) ;

SelectObject (hdc, GetStockObject (BLACK_PEN)) ;

DrawHands (hdc, &st, TRUE) ;

ReleaseDC (hwnd, hdc) ;

stPrevious = st ;

return 0 ;

case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

SetIsotropic (hdc, cxClient, cyClient) ;

DrawClock (hdc) ;

DrawHands (hdc, &stPrevious, TRUE) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_DESTROY :

KillTimer (hwnd, ID_TIMER) ;

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}

以上就是关于C语言作业:结构体编程练习 在屏幕上模拟显示一个数字式时钟 源代码能给我的话+50,感谢全部的内容,包括:C语言作业:结构体编程练习 在屏幕上模拟显示一个数字式时钟 源代码能给我的话+50,感谢、Unity C#入门教程——动画时钟实现、qt定时器函数执行时间长等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10211048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存