2024年1月13日 星期六

Chapter 04:referencing


目標:

  1. 學會進階的輸入輸出
  2. 學會暫存器的清除
筆者小講堂:

我在Chapter 04中有了最後幾點-更上一層,我覺得這會使內容太多,且不易吸收。我是曾打算把Chapter 04拆成兩節,但我這份筆記是為了方便入門,因此拆分成兩份就過於零碎。這份就做為延伸補充,對於入門者是值得參考的喔。

一、字串得輸入/輸出

  • 輸出:

在前面已經用printf("%s",name);來輸出姓名字串,在這裡介紹一個專門輸出字串的函數,就是puts().
語法:puts(字串陣列名稱);    或    puts(字串陣列名稱);

  • 輸入: 

在前面已經用scanf了,但scanf有一個問題,就是字串中不能有空白鍵,因此,我們可以改用專門輸入字串的函數gets()或fgets()。

語法:gets(字串陣列名稱);    或    fgets(字串陣列名稱);


不知道各位好不好奇,既然有方式可以取代printf/scanf來輸出/入字串,那非字串形不行?答案是不行。

 二、字元得輸入/輸出

  • 輸出:

在前面已經用printf("%c",word);來輸出姓名字串,在這裡介紹一個專門輸出字串的函數,就是putchar()。
語法:putchar(字串陣列名稱);

  • 輸入: 

在前面已經用scanf了,但scanf有一個問題,就是字串中不能有空白鍵,因此,我們可以改用專門輸入字串的函數getchar()。

語法:getchar(字串陣列名稱);

特別的,第一、二點若前面有用到scanf()時,scanf()要加\n,因為gets、getchar會直接擷取輸入的內容,因此會產生錯誤。

三、字串

因為C無法直接處理字串,因此要用陣列來處理,其結束時結尾會有'\0'。後面會在做介紹,因為這裡有用到字串,因此先大概說明一下。

四、補零

整數前面補0:前面學過如何讓每個位數保持固定的顯示寬度,這裡要學的是如何在前面補零。

語法:%0Nd,其中N為正整數。e.g.%02d 就是位數不足兩位時,前面補零。

要注意的是,不可以和+-號連用,否則無效

五、溢位問題

資料型態中,都會有一個固定的記憶體大小,若超出了會怎樣?其實,電腦會以取餘數的方式處理。舉例來說,有一個資料型態的十進位數值範圍為-1~1,若輸入為2,則會輸出-1。這點務必記得! 

六、遞增遞減

遞增運算、遞減運算。在C中遞增以“++”表示,遞減以“--”表示。一對++(或一對--)表+1(或-1)。其中,又可以分為前置型和後置型。
(1)前置型:
語法:++變數名稱; 或 --變數名稱
範例:
int a=20,b;

b=++a;

printf("a=%d b=%d",a,b);

輸出:a=11,b=11
意義:先把變數a加一,再把b等於a。
(2)後置型
語法:變數名稱++; 或 變數名稱--;
範例:
int a=10,b;
b=a--;
printf("a=%d b=%d",a,b);
輸出:a=9,b=10。

意義:先讓b等於a,再把a減一。

 七、執行控制(Windows 專有)
把程式打包後,視窗(以目前學到的,基本上是命令提示字元)會迅速消失。可以加上system("pause");讓視窗暫停,就不會閃退了。但有一點要注意的,windows系統可以成功編譯並執行,但非windows系統是無法成功執行喔!同樣的system("clear")、system("cls")是同樣的道理。
 八、暫存器的處理

在使用輸入字元時,若前一行有按下Enter鍵之類的,會無法輸入字串,這是因為WIndows在按下Enter鍵後會回傳CL(Enter)鍵和LF(換行),導致被誤植入字元變數中。因此只要再輸入字元的程式前一行加上fflush(stdin);即可。

  • 未加入:
#include<stdio.h>

int main(){
    int n;
    char word;
    printf("Please enter the number ");
    scanf("%d",&n);
    printf("The number is %d",n);
    printf("Please enter one word ");
    scanf("%c",&word);
    printf("The ASCII code is %d ",word);
    system("pause");
    return 0;
}

無法輸入字串

  • 已加入: 
#include<stdio.h>

int main(){
    int n;
    char word;
    printf("Please enter the number ");
    scanf("%d",&n);
    printf("The number is %d",n);
    fflush(stdin);
    printf("Please enter one word ");
    scanf("%c",&word);
    printf("The ASCII code is %d ",word);
    system("pause");
    return 0;
}

這樣就可以輸入字元了

九、綜合練習

1.若執行程式時,命令提示字元閃退,可能要加上什麼?
2.請讓使用者輸入一個句子(有空格喔),輸出使用者輸入的句子。
3.請讓使用者輸入一個數字,按下enter鍵後輸入一個字串。輸出某數的立方,和字串。
輸入:
10
ABC
輸出:
1000
ABC
答:
#include<stdio.h>

int main()
{
    int n;
    char sentence[10000];/*可輸入9999個字母(含空格)。注意,中文字可能會亂碼*/
    scanf("%d\n",&n);/*記得加\n*/
    gets(sentence);
    printf("%d\n%s",n*n*n,sentence);
    return 0;
}
4.試說明前置型和後置型遞增遞減符號的差異。
5.請讓使用者輸入字元,並且以十進位輸出ASCII碼。
#include<stdio.h>

int main()
{
    char words;
    words=getchar();
    printf("%d",words);
    return 0;
}

回目錄

沒有留言:

張貼留言