C語言練習題:指標(C language exercise: Pointer)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.

Pointer concepts:
2. Introduction to C Pointers

練習一:基本語法
設計一個C語言程式來呈現指標的語法,例如宣告、取址、取值等。

Exercise 1: Basic Syntax
Design a C program to demonstrate the basic syntax of pointer. Such as declaration, address and value. 

練習一參考解法:
Exercise 1 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
Pointer Basic Syntax
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n = 50;

    // declaration
    int *ip;

    // assignment
    ip = &n;

    printf("The value of &n:%X\n", &n);
    printf("The value of n:%i\n", n);

    printf("The value of &ip:%X\n", &ip);
    printf("The value of ip:%X\n", ip);
    printf("The value of *ip:%i\n", *ip);
    return 0;
}


練習二:動態記憶體配置
撰寫用 malloc()free() 來配置記憶體的程式。

Exercise 2: Dynamic Memory Allocation
Write a C program to allocate memory.

練習二參考解法:
Exercise 2 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
Dynamic memory allocation
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    int *pI;

    printf("How many integers? ");
    scanf("%d", &n);

    // using malloc to allocate memory
    pI = (int *) malloc(n*sizeof(int));

    if(pI == NULL) // if fail to allocate
    {
        printf("Couldn't allocate memory\n");
        return 0;   // exit
    }

    // Releasing the memory allocated by malloc
    free(pI);

    return 0;
}


練習三:兩數相乘
使用指標的方式,將兩個數字相乘。

Exercise 3: Multiplying two numbers
Multiplying two numbers with pointers.

練習三參考解法:
Exercise 3 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
Multiplying two numbers with pointers
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n1, n2;
    int *pn1, *pn2, product;

    printf("Enter num1:");
    scanf("%d", &n1);

    printf("Enter num2:");
    scanf("%d", &n2);

    pn1 = &n1;
    pn2 = &n2;

    product = *pn1 * *pn2;

    printf("The product of %d and %d is %d\n", *pn1, *pn2, product);
    return 0;
}

練習四:指標與陣列
使用指標的語法來取得整數陣列的元素。

Exercise 4: Pointer and array
Using a pointer to access the elements of an integer array.

練習四參考解法:
Exercise 4 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/*
Pointer and array
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

#define N 5
int main()
{
    int a[N] = { 2, 3, 5, 7, 11};
    int *pI = a;

    for(int i = 0; i < N; i++)
        printf("a[%d] = %d\t", i, *(pI + i));
    return 0;
}

練習五:指標運算
在練習四時,使用到指標與整數相加的運算。而本題請使用遞增與遞減來達成與練習四一樣的功能。

Exercise 5: Pointer Arithmetic
In exercise 4, the operation: "a pointer plus a integer" is used. Could we use pointer increment and decrement to do exercise 4?

這篇連結文章可以幫助瞭解指標運算
Here is a tutorial: "How pointer arithmetic works?"

練習五參考解法:
Exercise 5 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
Pointer Arithmetic: increment and decrement
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

#define N 5
int main()
{
    int a[N] = { 2, 3, 5, 7, 11};
    int *pI = a;

    printf("Pointer increment:");
    // pointer increment
    for(int i = 0; i < N; i++)
        printf("a[%d] = %d\t", i, *(pI++));


    printf("\n\nPointer decrement:");
    // pointer decrement
    for(int i = N - 1; i >= 0; i--)
        printf("a[%d] = %d\t", i, *(--pI));

    return 0;
}

練習六:字串長度
使用指標語法來求出所輸入字串的長度。

Exercise 6: The length of a string
Using pointer to calculate the length of a user input string.

練習六參考解法:
Exercise 6 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
Length of a string
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char str[100];
    int len = 0;

    printf("Enter a string:");

    // Input a string with whitespaces
    scanf("%[^\n]s", str);

    char *pC = str;

    while(*pC != '\0')
    {
        len++;
        pC++;
    }

    printf("The length of the given string[%s] is:%d", str, len);

    return 0;
}


練習七:交換兩數
使用 call by reference 的方式,設計一個可以交換兩數的函式。

Exercise 7: Swap two numbers
Using call by reference to design a function that swaps two numbers.

練習七參考解法:
Exercise 7 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
Swap two numbers
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

void swapV(double *x, double *y);

int main()
{
    double n1, n2;

    printf("Enter number 1:");
    scanf("%lf", &n1);

    printf("Enter number 2:");
    scanf("%lf", &n2);

    printf("Before swap n1:%lf, n2:%lf", n1, n2);
    swapV(&n1, &n2);
    printf("\nAfter swap n1:%f, n2:%f", n1, n2);

    return 0;
}

void swapV(double *x, double *y)
{
    double t = *x;
    *x = *y;
    *y = t;
}

練習八:字串合併
使用指標語法來合併兩字串。

Exercise 8: String concatenation
Using pointer to concatenate two strings.

練習八參考解法:
Exercise 8 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
String concatenation
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

#define LEN 256
int main()
{
    char str1[LEN];
    char str2[LEN];
    char str3[LEN*2];

    printf("Enter str1:");
    scanf("%[^\n]%*c", str1);

    printf("Enter str2:");
    scanf("%[^\n]%*c", str2);

    char *pC = str1;
    char *pStr = str3;

    while(*pC)
    {
        *pStr = *pC;
        pC++;
        pStr++;
    }

    pC = str2;
    while(*pC)
    {
        *pStr = *pC;
        pC++;
        pStr++;
    }

    // end with '\0'
    *pStr = '\0';
    printf("Str1:%s, Str2:%s, Str3:%s", str1, str2, str3);

    return 0;
}

練習九:空指標
常見的觀念可參考「空指標與NULL」。
請撰寫一程式來練習空指標的語法。

Exercise 9: null pointer 
Please refer to this tutorial: NULL pointer in C.
Design a C program to practice the null pointer syntax.

練習九參考解法:
Exercise 9 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
NULL pointer
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *iP = NULL;

    if(iP == NULL)
    {
        printf("The value of iP is %u", iP);

        // Couldn't access to *iP
        // The following code will crush
        printf("The value of *iP is %d", *iP);
    }
    else
    {
        printf("The value of iP is %u", iP);
        printf("The value of *iP is %d", *iP);
    }

    return 0;
}

練習十:函式指標
可參考此篇文章:[C語言] function pointer介紹來了解 function pointer。
請設計一程式來練習 function pointer,例如兩數字的加、減、乘、除等運算。

Exercise 10: Function Pointer
Please refer to this tutorial: Function pointers in C.
Design a C program to practice function pointer. For example, addition, subtraction, multiplication and division of two numbers. 

練習十參考解法:
Exercise 10 solution:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
Function pointers
Author: Holan
*/

#include <stdio.h>
#include <stdlib.h>

double add(double n1, double n2);
double sub(double n1, double n2);
double mul(double n1, double n2);
double divi(double n1, double n2);

int main()
{
    double a = 3.44, b = 9.999;

    double (*op)(double, double) = add;

    printf("The addition of %f and %f is %f\n", a, b, op(a, b));

    op = sub;
    printf("The subtraction of %f and %f is %f\n", a, b, op(a, b));

    op = mul;
    printf("The multiplication of %f and %f is %f\n", a, b, op(a, b));

    op = divi;
    printf("The division of %f and %f is %f\n", a, b, op(a, b));

    return 0;
}

double add(double a, double b) { return a + b;}
double sub(double a, double b) { return a - b;}
double mul(double a, double b) { return a * b;}
double divi(double a, double b) { return a / b;}

給中小學生的 Python 單元二:蟒蛇計算機

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

哈囉,我們在上一個單元:給中小學生的 Python 單元一:Python 安裝完成 Windows 下撰寫 Python 程式碼的環境建立。此單元要來認識 Python 的 IDLE (可參考 Python IDLE 基本操作)。 

IDLE 視窗可以當計算機來用,我們可以稱它為蟒蛇計算機。例如在 IDLE 下輸入底下運算:
2 + 3 * 5 - 7 / 11
會得到底下結果


2 + 3 * 5 - 7 / 11中的 * 是數學裡的乘法 / 是數學裡的除法。而 Python 也是先乘除後加減的。所以這個數學運算會是 3 * 5 先算,接著算 7 / 11

2 + 3 * 5 - 7 / 11
= 2 + 15 7 / 11
= 2 + 15 - 0.63636363636
= 17 - 0.63636363636
= 16.363636363636363

Python 數學運算符號

請試著在 IDLE 輸入下面的數學運算:
  1. 9/7
  2. 3 + 3
  3. 3 - 2
  4. 3 * 7
  5. 1 + 2 * 3 - 4
  6. 1 * 2 + 3 / 4
看看運算結果是什麼?

什麼是變數
底下用非很精準的解釋,畢竟變數和容器還是不一樣的觀念
變數可看成容器,而容器有很多種,例如罐子、紙箱、寶特瓶、水桶、背包、鉛筆盒等。

但若是有30個人都帶著一模一樣的罐子容器時,那要怎麼辨別這個罐子是誰的啊?!
所以就給這些罐子一個獨一無二的名稱!開始來命名囉!

「豬頭罐子」、「空罐子」、「軟罐子」、「硬罐子」、「無敵罐子」、「我的罐子」、「你的罐子」、「不說話罐子」、「機器人罐子」、「腳罐子」、「黑罐子」、「紅罐子

可以亂命名嗎?!好像不給個規則會產生一些怪怪的名稱。在程式語言裡,變數是有命名規則的,大多的程式語言通常會有底下兩個規則:
  • 第一個字必須是英文字母(大小寫字母皆可)或是底線字元「_」,不可以是數字或其他符號
  • 第一個字之後的其他字必須是英文字母(大小寫字母皆可)、底線字元「_」或是數字,不可以使用其他符號

而 Python 提供的容器(Data Types)有底下幾種:
  • 文字容器(Text Type):字串(string)。
  • 數字容器(Numeric Types):整數(int)、浮點數(float)、複數(complex)。
  • 序列容器(Sequence Types):串列(list)、元組(tuple)、range(小編不知道要如何翻成中文)。
  • 映射容器(Mapping Type):字典(dict)。
  • 集合容器(Set Types):可變集合(set)、不可變集合(frozenset)。
  • 布林容器(Boolean Type):布林(bool)。
  • 二元容器(Binary Types):位元組(bytes)、位元組陣列(bytearray)、memoryview(小編不知道要如何翻成中文)。。
Python 變數的使用方式如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 宣告一個變數 n ,並將 n 設成整數 3
n = 3

# 宣告一個變數 f ,並將 f 設成浮點數 3.3
f = 3.3

# 宣告一個變數 c ,並將 c 設成複數 1 + 2j
c = 1 + 2j

print(n)  # 印出變數 n 的值
print(f)  # 印出變數 f 的值
print(c)  # 印出變數 c 的值

注意上面的程式碼裡有個等號 = ,等號的意思在此不是等於的意思,而是將東西放到容器裡。容器裡的東西當然可以移至另一個容器裡,試試底下的Python程式碼來了解,可以自由修改程式碼:
1
2
3
4
5
6
7
8
9
myMoney = 100
print(myMoney)

yourMoney = myMoney
print(yourMoney)

myMoney = 300
print(myMoney)
print(yourMoney)

這兒有線上變數練習題:Python - Variable Exercises。順便練習英文的閱讀能力。

Python 動手做「Micro:bit」Unit 2:按按看

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.

本篇文章會使用Mu Code Editor來開發micro:bit的應用程式,Mu Code Editor是一個給Python初學者的撰寫Python程式碼的軟體工具,此軟體的操作方式可參考Mu Code Editor官方的教學文章:https://codewith.mu/en/tutorials/

此文的上一篇為 Python 動手做「Micro:bit」Unit 1:點亮 LED

按鈕(Buttons)的原理與應用(Behind the MakeCode Hardware - Buttons on micro:bit)


我們將要製作的功能如下:
1. 按下按鈕 A 時,顯示大寫的字母 A。
2. 按下按鈕 B 時,顯示大寫的字母 B。
3. 按下按鈕 A + B 時,顯示愛心(Heart)。

功能的結果如圖:
按下按鈕 A
按下按鈕 B
按下按鈕 A + B


https://makecode.microbit.org/ 上的Blockly設計程式如下:

那先來試試用 https://makecode.microbit.org/ 上所提供的Blockly程式轉換功能,請轉換成 Python:

將上圖的程式碼複製到Mu Code Editor

讀者可以試著將此程式燒錄到 Microbit 板子上,程式執行結果可能不如預期喔。參考 https://microbit.org/get-started/user-guide/python/#buttons 與 https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/buttons.html 後,請讀者試著執行下面程式碼:
1
2
3
4
5
6
7
8
9
from microbit import *

while True:
    if button_a.is_pressed() and button_b.is_pressed():
        display.show(Image.HEART)
    elif button_a.is_pressed():
        display.show("A")
    elif button_b.is_pressed():
        display.show("B")

此程式結果有沒有如預期呢?

給中小學生的 Python 單元一:Python 安裝

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

在Windows 10 上 安裝 Python
請至 https://www.python.org/downloads/ 下載最新的版本

下載好後,請執行 python-3.9.1-amd64.exe 來安裝 Python。

點選 【Install Now】


看到【Setup was successful】時,安裝就完成,按下【Close】來關閉安裝視窗。

Python 程式碼撰寫環境 IDLE 
此部分也可參考 Python IDLE 基本操作 一文。從 Windows 應用程式集開啟 IDLE
IDLE 畫面如下

我們可以輸入底下的程式碼:
print('這是什麼鬼東西')


此時按下 Enter 就會看到程式結果

接著我們來建立自己的程式碼檔案吧。點選 【File】 ==> New File】

此時會看到一個新視窗

在這個視窗內,請輸入底下的程式碼:
print('這又是什麼鬼東西')


準備存檔了,點選 【File】 ==> 【Save

檔案名稱可以為【你好.py】


點選【Run】==> 【Run Module】來執行程式。


執行結果會如下:



練習題:
1. 在 IDLE Shell 上顯示偶像的名字,例如 LeBron James
2. 在 IDLE Shell 上顯示一段歡迎訊息,例如 您好,歡迎光臨本部落格

2021 雲林縣仁和國小 mBot 冬令營課程紀錄

2021/01/29、2021/02/01、2021/02/02 三天上午,筆者受邀至雲林縣仁和國小進行 mBot 冬令營的活動,在此紀錄,也感謝仁和國小 余老師的邀請。

此次主要是進行mBot擴充包的組裝、擴充包的程式設計、認識人工智慧。擴充包含有六足機器人動感小貓聲光互動


2021冬令營課程大綱

2021/01/29 mBot 冬令營 Day 1:
  • mBot擴充包介紹
  • Beetle 甲蟲組裝
  • Beetle 程式設計
  • Beetle 循跡



2021/02/01 mBot 冬令營 Day 2:
  • Otto二足機器人程式設計
  • 動感小貓組裝
  • 聲控天蠍組裝
  • 螳螂組裝
  • 程式設計自由發揮




2021/02/02 mBot 冬令營 Day 3:
  • 語音辨識
  • 影像辨識
  • 文字轉語音
  • 表情面板介紹


心得紀錄:
第一天上午提供小朋友組裝手冊與組裝影片,讓小朋友自己做選擇,當天課程要結束前,小朋友都喜歡看組裝手冊而不想看組裝影片。第二天提供小朋友Otto二足機器人,兩人控制一隻Otto機器人的雙腳,讓小朋友慢慢摸索出怎麼控制二足機器人,當小朋友自己找出方法控制Otto時,他們都很開心。第三天介紹了mBlock提供的認知服務功能,以及mBot表情面板,而小朋友對文字轉語音非常有興趣。這一群小朋友都會先自己試著設計程式,當程式功能不如自己所預期時,才會來問我。而筆者好喜歡這樣子的小朋友喔!