網頁

2019年2月20日 星期三

【C++語言】setjmp.h

在setjmp.h裡面,可以處裡很多goto無法做到的事情,也就是神奇的跳躍方法。
setjmp.h裡面有定義一個型別,叫做jmp_buf`,他是個陣列存放著跳躍時的必要資訊。
這裡面還有兩個函式,首先是
int setjmp(jmp_buf env);
如果這個函式是正常的自己回傳的,那麼回傳值為零;若這個函式是從別的地方跳來這裡,則回傳非零數值。
再來是第二個函式
_Noreturn void longjmp(jmp_buf env, int val);
這個函式很明顯不會回傳,因為都跳到遙遠的地方了。這個函式會跳到env儲存的那個setjmp函式的位置。假如val是非零整數,那麼那一個抵達的setjmp會回傳val;若val等於零,則setjmp回傳1。
我們看一下下方的程式
#include <setjmp.h>
#include <stdio.h>
jmp_buf buf;


int g(int x)
{
  longjmp(buf, 3);
  return 1;
}

int f(int x)
{
  return g(x);
}


int main(void)
{
  int ret = setjmp(buf);
  printf("%d\n", ret);
  if (!ret) {
    f(1);
  }
}

2019年2月15日 星期五

【C++語言】printf的回傳值

雖然我們常常用到printf這個C語言就有的函式,不過printf還有一個較少聽聞的事情,和printf的整個宣告有關。
int printf ( const char * format, ... );
它的回傳值是一個整數型別,就是它印出的字串長度。

依照http://www.cplusplus.com的說法

2019年2月13日 星期三

Google黑科技!「地圖」臺灣推出立體建築物 連樹木、裝置藝術都有!


Google的AI技術是眾所皆知的厲害,繼去年底推出的「Google 助理」後,現在又推出了傳說中的立體地圖。

近日「Google 地圖」在臺灣地區推出了3D立體功能,比以往在「Google 地球」推出的名勝景點立體化更強!

我們可以看到Google將所有的建築物都立體化,幾乎每一個角度都有!


可以從圖片中看到各個大大小小的建築物,都已經立體化。可是還有些地方會出現小破圖,就必須等Google修正了。


畫面轉到「捷運劍潭站」,連捷運站上方的裝飾藝術都清楚可見。

2019年2月12日 星期二

【C++語言】整數型別極限limits.h

大家應該都會想要盡力防止程式發生溢位,因為會造成不可預期的後果。我們可以利用<limits.h>來得到一種型別的最大值與最小值。
在這裡簡單列出整數「最少」要超過的範圍(最小儲存的數字範圍),實際的值要看平台。(其實現在一般常見電腦和此表完全不同,但依照此表可在世界通行無阻)
CHAR_BIT = 8
CHAR_MAX = UCHAR_MAX or SCHAR_MAX
CHAR_MIN = 0 or SCHAR_MIN
註:char型別有可能為有號或無號整數,所以別用char來算數,算數時一定要指定有號或無號。(signed char或unsigned char)
INT_MAX = +32767
INT_MIN = -32767
LONG_MAX = +2147483647
LONG_MIN = -2147483647
LLONG_MAX = +9223372036854775807
LLONG_MIN = -9223372036854775807
SCHAR_MAX = +127
SCHAR_MIN = -127
SHRT_MAX +32767
SHRT_MIN -32767
UCHAR_MAX = 255
USHRT_MAX = 65535
UINT_MAX 65535
ULONG_MAX = 4294967295
ULLONG_MAX = 18446744073709551615
浮點數的部分則定義在<float.h>。

2019年2月11日 星期一

「程式設計工作室」臉書專頁創辦啦!

即日起,我們將不定時在程式設計工作室臉書粉絲專頁,分享「程式」相關的資訊!

2019年2月10日 星期日

【C++語言】assert的簡單用途

製作程式中,常常會有需要Debug的情況,在C/C++中就有一個好工具可以幫助我們偵錯,這個就是<assert.h>(或是<cassert>),我們簡單介紹他的用法。
#include <cassert>
assert(判斷式);
裡面的判斷式若為true,則什麼事情也不會發生,但如果是false,就會終止程式,並且印出錯誤訊息。

2019年2月9日 星期六

【C++語言】一個未定義行為

我前幾天和同學說到一個有未定義行為的程式如下:
#include <cstdio>
int main()
{
  int i = 1;
  printf("%d, %d, %d\n", i++, i++, i++);
}
這個程式會發生什麼事情,大家應該可以預測,就是印出
1, 2, 3
但,事實是如此嗎?在我的Arch Linux上的gcc 8.2.1,編譯出一個程式,顯示出:
3, 2, 1
也許clang可能會成功達成我們的期望,的確clang顯示出:
1, 2, 3

那你認為clang才是正確的嗎?其實這裡每一個編譯器都有符合標準,事實上,同一個陳述裡面不應該有超過一個改變同一個變數的部分,這樣會產生未定義行為,也就是說,這個程式不該出現在世界上。其實,如果你開啟警告,這些編譯器通常也會給你警告訊息。

2019年2月8日 星期五

川普十大金句 中英對照翻譯!

唐納·約翰·川普(英語:Donald John Trump,1946年6月14日-)是現任的美國總統(第45任)。在從政前,他曾是一名商人和電視名人。 (維基百科)

1.

2.

3.

2019年2月7日 星期四

【C++程式設計】尋找中:圖形化介面函式庫

最近幾天為了要製作使用GUI的小遊戲,特別尋找各種C++GUI函式庫,我就來列出幾個看起來不錯的函式庫吧。
我對於挑選函式庫有個重要的原則,就是要「跨平臺」,因為我使用GNU/Linux作業系統,但常常要做一些小程式給使用Windows的朋友,沒有跨平臺就需要在那裡#if WIN32之類的條件編譯。
目前我暫時決定使用這個函式庫SFML,主要是因為我一用,覺得和其他函式庫比較起來算是簡單許多
SFMLhttps://www.sfml-dev.org/index.php
Qt: https://www.qt.io/
Qt函式庫有分兩種版本,一個是免費,另外一個是要付費的。Qt還有提供多種開發工具,而且網路上的資源很豐富。
SDL: https://www.libsdl.org/
SDL感覺有一些難學,在網路上教學沒有Qt那麼多。

其他函式庫也有許多特色,我會陸續撰寫介紹。


2019年2月6日 星期三

ASUS ZenFone 5z 升級 Android 9 Pie 正式版 新功能介紹+使用心得


Android 9 Pie 圖示。可從 [設定] > [系統] > [關於手機] > [Android 版本] 開啟。

一、前言

個人認為這次的 Android 9 Pie 更新主要是以視覺美觀為主,許多方方正正的地方都加上了圓角,顯得整體很柔和;另外也加上了不少的巧思,讓使用者操作的更便利。

使用機型:ZenFone 5Z (ZS620KL)
系統版本:Android 8 Oreo, Android 9 Pie

二、更新

突然收到系統更新通知,不敢相信終於要更新上去Pie了!
通知欄訊息
更新速度頗快的。關機後,螢幕上顯示 ZenFone 的標誌,下方有幾個點點在跳動,不到一分鐘便更新完成了。

三、主要更新內容

1.導覽列
變得像 iPhone X 系列的下方橫桿。
往上滑可切換應用程式,再往上滑可查看所有應用程式。
[設定] > [顯示] > [導覽列] > [導覽列類型] > [在主螢幕按鈕上向上滑動]

2019年2月5日 星期二

【C++語言】印出等腰三角形

繼上次〈印出直角三角形〉以後,我們也可以稍加改變程式,使其印出等腰三角形。
#include <cassert>
#include <cstdio>

void print_tri(int);
int main(int argc, char *argv[])
{
  if (argc <= 1) {
    std::puts("Enter a number!");
    return -1;
  }
  int h;
  sscanf(argv[1], "%d", &h);
  print_tri(h);
  return 0;
}
void print_tri(int h)
{
  for (int i = 1; i <= h; ++i) {
    for (int j = i; j < h; ++j) {
      std::putchar(' ');
    }
    for (int j = 1 + ((i - 1) << 1); j > 0; --j) {
      std::putchar('*');
    }
    std::putchar('\n');
  }
}

2019年2月4日 星期一

【LINE Points 解答】點數小學堂 新年豬福篇 |

活動注意事項

全部答對就可獲得2點
活動時間:2019年2月4日(一)10:00~2月8日(五)10:00

問題

Q1 請問獲得LINE Points「好運豬福送給你」額外獎勵點數2點的資格為?
3 完成任一『新年特輯』活動 + 任一指定新年活動,共兩個任務

Q2 請問LINE Points 任務牆的入口是在LINE「錢包」頁面的哪個位置?
2 中排右二

Q3 請問LINE Points可以在LINE Points 使用牆兌換成以下何種點數?
4 以上皆是

2019年2月3日 星期日

【C++語言】印出直角三角形

本程式主要是印出由「*」組成的直角三角形,輸入項數,即可印出該數的排數。

#include <stdio.h>
int main () {
  int a=1,b=1,n,x=1,y=0;
  printf("Enter number (bidder than 0): ");
  scanf("%d",&n);
  if(n>0)
  {
    printf("\nRight triangle: \n");
    while(x<=n)
    {
       y=0;
       while(y<x)
       {
         y++;
         printf("*");
       }
     printf("\n");
     x++;
     }
     printf("\n");
  }
  else
  {
    printf("\nError number\n");
  }
  return 0;
}

2019年2月2日 星期六

【C++語言】最小公倍數

繼上次最大公因數的程式以後,我們可以很簡單地改良成最小公倍數的程式
int gcd(int, int); // 請參考上次最大公因數程式
int lcm(int n1, int n2)
{
  return n1 * n2 / gcd(n1, n2);
}

2019年2月1日 星期五

【C++語言】次方計算

輸入底數與指數,即可算出答案
如:「2 3」,計算出「8」

本次使用了許多「如果」及「迴圈」,應注意邏輯觀念,以便於程式設計

#include <stdio.h>
int main () {
  int a,n,x=0,answer,answer1;
  printf("Enter base and exponent: ");  //請輸入底數與指數
  if (n>0) {
    answer=a;
    while(x<n-1) {
      answer1=answer*a;
      answer=answer1;
      x++;
    }
    printf("Answer: %d",answer);
  }
  else if (n==0) {
    if (a==0) {
      printf("Error");
    }
    else {
      answer=1;
      printf("Answer: %d",answer);  //顯示答案為1
    }
  } 
  return 0;
}