c++學習筆記=>;萬丈高樓平地起=>;ex3:運算式練習

距離上一篇 c++學習筆記=>萬丈高樓平地起=>ex2:參數輸入、printf() 、 scanf() 已經一年多,利用春節這幾天空間再把一些以前的教學資料整理一下。這一篇要練習的是程式語言的基本元素,運算式與運算子的應用。

常見的C++運算子列表如下:

運算子名稱 運算子符號 符號分類
加 Addition + 數學運算
減 Substration 數學運算
乘 Multiplication * 數學運算
除 Division / 數學運算
餘數 Modulus % 數學運算
等於 Equality == 大小關係
大於等於 Greater than or equal to >= 大小關係
大於 Greater than > 大小關係
小於等於 Less than or equal to <= 大小關係
小於 Less than < 大小關係
不等於 Not equal != 大小關係
位元且運算 Bitwise AND & 位元運算
位元互斥或運算 Bitwise exclusive OR ^ 位元運算
位元或運算 Bitwise inclusive OR | 位元運算
位元左移 Left shift << 位元運算
位元右移 Right shift >> 位元運算
一位補數 One’s Complement ~ 位元運算
加指定 Addition Assignment += 變數指定
減指定 Subtraction Assignment -= 變數指定
乘指定 Multiplication Assignment *= 變數指定
除指定 Division Assignment /= 變數指定
餘數指定 Modulus Assignment %= 變數指定
位元且指定 Bitwise AND Assignment &= 變數指定
位元互斥或指定 Bitwise exclusive OR Assignment ^= 變數指定
位元或指定 Bitwise inclusive OR Assignment |= 變數指定
位元左移指定 Left shift Assignment <<= 變數指定
位元右移指定 Right shift Assignment >>= 變數指定
遞減 Postfix decrement  
遞加 Postfix increment ++  
正 Unary positive + 正負標記
負 Unary negative 正負標記
非 Logical Negation ! 邏輯運算
且 Logical AND && 邏輯運算
或 Logical OR || 邏輯運算
取址 Address-of & 記憶體位置運算
指向 Indirection * 記憶體位置運算
物件成員存取 Member access . or –> 物件操作
物件成員指標存取 Pointer-to-member .* or –>* 物件操作
條件運算 Conditional ?  
範圍解析 Scope resolution :: 宣告物件成員
     

為了讓學生有練習的環境,改用免費的Microsoft Visual C++ 2010 Express 作為教學軟體,一樣我們新增一個"win32主控台應用程式"專案,名稱設定為ex3

打開ex3.cpp在程式進入點中輸入以下程式碼:

// ex3.cpp : 定義主控台應用程式的進入點。
//

#include "stdafx.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	//運算式練習
	int x = 10 ;
	int y = 2 ;
	int z = 0 ;
	bool w = true ;
	string myname = argv[1] ;
	cout << myname << "的c++練習範例:簡單運算子練習!\n" ;
	cout << "宣告變數 int x = 10;" <<  "\n";
                cout << "宣告變數 int y = 2;" <<  "\n";
                cout << "宣告變數 int z = 0;" <<  "\n";
                cout << "宣告變數 bool w = true ;" <<  "\n";
	cout << "加 x+y=" << (x + y) << "\n";
	cout << "減 x-y=" << (x- y) << "\n";
	cout << "乘 x*y=" << (x * y) << "\n";
	cout << "除 x/y=" << (x / y) << "\n";
	cout << "餘數 x%y=" << (x % y) << "\n";
                cout << "非! x=" << (! x) << "\n" ;
	cout << "非! z=" << (! z) << "\n" ;
	cout << "等於 x==y ="<< (x==y) << "\n" ;
	cout << "不等於 x!=y ="<< (x!=y) << "\n" ;
	cout << "等於 (x==w) ="<< (x==w) << "\n" ;
	cout << "位元運且運算 (2&16)=" << (2&16)<<"\n";
                cout << "位元互斥或運算 (2^16)=" << (2^16)<<"\n";
	cout << "位元運或運算 (2|16)=" << (2|16)<<"\n";
	x+=3;
                cout << "加指定 (x+=3) ="<< x << "\n" ;
	x-=3;
                cout << "減指定 (x-=3) ="<< x << "\n" ;
                x*=3;
                cout << "乘指定 (x*=3) ="<< x << "\n" ;
                x/=3;
                cout << "除指定 (x/=3) ="<< x << "\n" ;

	return 0;
}

再來打開stdafx.h,在這個標頭檔加入以下的程式碼

// stdafx.h : 可在此標頭檔中包含標準的系統 Include 檔,
// 或是經常使用卻很少變更的
// 專案專用 Include 檔案
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <fstream>
#include <iostream> 
#include <string>


// TODO: 在此參考您的程式所需要的其他標頭

執行建置方案,為了方便看到執行的結果,在…\Visual Studio 2010\Projects\ex3\Debug 方案目錄中加入一個批次檔do.bat內容如下:

ECHO OFF

::代表在目錄中找到.exe類型的檔案然後傳入字串參數"楊煥謀" 
for %%e in (*.exe) do %%e "楊煥謀" 
pause

只要執行do.bat可以看到程式的執行結果

image

流程練習

建立一個新專案ex3

#include "stdafx.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    char score ;
    cout << "請輸入你的分數?" ;
        cin >> score ;
        if (score==’7′) {

//如果輸入7則輸出
cout << "答錯了!";
        }
        else {
    cout << score;
        }
    return 0;
}

c++學習筆記=>萬丈高樓平地起=>ex2:參數輸入、printf() 、 scanf()

一個程式基本的兩個部分就是輸入與輸入;以下我們討論參數傳遞問題;寫一個傳入參數字串的程式進行說明

我們按照ex1重新建立一個新的主控台專案存為ex2,打開ex2.cpp這個檔案

image

一樣我們在程式進入點int _tmain(int argc, _TCHAR* argv[])這個函式輸入以下程式碼,儲存檔案。

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    printf("%s 向大家問好!n",argv[1]);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])這一行告訴我們:_tmain這個函式的參數列有兩個參數;一個是int(整數型態)argc,_TCHAR*(自動切換unicode與非unicode字元指標)型態的  argv[] ,其中argv後面加入一個[]表示為陣列,這個陣列的大小未定,主要是傳入執行檔的參數個數決定,argc是參數的個數。通常argv[0]代表執行程式本身,argv[1]代表的是第1個以null結束的字串參數,所以我們要輸出傳入ex2.exe的字串參數可以寫成 printf("%s 向大家問好!n",argv[1]);。

printf是一個可以格式化輸出資料的函數,在vsc++2005可以按F1功能鍵查詢他的相關說明,在說明檔寫所printf的函式如下:

int printf( const char *format [, argument]… );

它的參數列第一個參數資料型態為字元指標,在c++基本的資料型態有char(字元)這種資料型態,並沒有string(字串)這種資料型態,如果要使用string必須引用string.h這個標頭檔,但是如果不使用這個標頭檔,是不是就不能表示字串呢?。

按住Ctrl+F7進行編譯,將ex1範例中所建立的批次檔do.bat複製1份至ex2專案目錄中debug這個目錄,將do.bat這個檔案用筆記本程式打開編輯改成

ECHO OFF

::代表在目錄中找到.exe類型的檔案然後傳入字串參數"楊煥謀"
for %%t in (*.exe) do %%t "楊煥謀"
pause

執行do.bat看執行結果。

image

結果我們傳入的參數字串變成亂碼,為何會如此?原因是因為vs2005c++專案屬性字元集預設為使用unicode字元集。image

而我們在『命令提示字元』視窗中輸入的並非unicode字元集而是多位元組字集(中文系統的關係),所以ex2.exe所接受的字串參數無法正確顯示,我們只要將專案的一般屬性中字元集屬性改成未設定或使用多位元組字集,重新編譯專案,即可解決此問題。

 image

再次執行do.bat,即可得到正確的結果:

image

我們再將ex2改版成可以提示使用者輸入自己姓名,然後輸出一句某某向大家問好的句子。

// ex2.cpp : 定義主控台應用程式的進入點。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    char s[80];
    printf("請輸入姓名:n");
    scanf("%s",s);
    printf("%s 向大家問好!n",s);
    return 0;
}

 

image

c++學習筆記=>萬丈高樓平地起=>ex1:Hello,World!

1.依慣例我們的第一個程式,就是利用c++寫一個輸出”Hello, World!”的簡單程式。

2.打開Microsoft Visual Studio 2005,點選功能表上檔案/新增專案,建立1個c++語言 win32主控台的專案

image

image

ex224

ex229

3.Microsoft Visual Studio 2005的精靈會依我們的選擇建立一個win32主控臺程式的基本架構。從方案總管的視窗我們可以看到下圖的檔案架構,在這個圖示中可以看到,Microsoft Visual Studio 2005的精靈自動建立三種類型的檔案分類:原始程式檔(.cpp)、標頭檔(.h)、資源檔。以下就這三種類型作簡單說明。

image

4.標頭檔(.h):各種程式語言的發展都一樣,都是從簡單到複雜,簡單的時期尚可能一切程式碼自己來,到了複雜階段就要眾人的分工,如何將眾人各自分工的成果方便提供他人應用且便於修改維護,c與c++就採取標頭檔這種方式,像ex1範例專案中stdafx.h這個檔案就是這個專案程式主要的標頭檔,簡單的說標頭檔像是圖書館的目錄索引一樣,我們需要某些參考書籍,可以透過這個索引可以找到我們要的書籍資料,而不需要將圖書館所有的書都搬出來。標頭檔可以告訴編譯器去找到程式中所要用的程式碼,這樣程式撰寫不需要重複寫入相同的程式碼,標頭檔通常和原始程式檔配合,每個原始程式檔通常會有一個相對應的標頭檔,標頭檔內通常含有函式、變數其他識別符號的前置宣告或定義。更詳細的說明可以參考維基百科上的解釋。

5.原始程式檔(.cpp):主要的程式內容所在。ex1這個專案有兩個原始程式檔;stdafx.cpp與ex1.cpp

打開stdafx.cpp這個檔案會發現只有以下的內容

// stdafx.cpp : 僅包含標準 Include 檔的原始程式檔
// ex1.pch 會成為先行編譯標頭檔
// stdafx.obj 會包含先行編譯型別資訊

#include "stdafx.h"

// TODO: 在 STDAFX.H 中參考您需要的任何其他標頭,
// 而不要在這個檔案中參考

每行的開頭如果有//這個標記,代表這一行的內容是程式註解,在編譯器編譯的過程會跳過,如果要多行註解可用/*與*/,將要註解的內容包括在內。

所以在stdafx.cpp 這檔中其實只有一行 #include "stdafx.h"  ,#include這個是編譯指令,告訴編譯器stdafx.cpp這個檔案有引用"stdafx.h" 這個檔案的內容。

stdafx.h這個檔案的內容如下,其中#include <stdio.h>    所引用的stdio.h是與標準輸出入相關的函式都在這標頭檔中定義:

// stdafx.h : 可在此標頭檔中包含標準的系統 Include 檔,
// 或是經常使用卻很少變更的
// 專案專用 Include 檔案
//

#pragma once

#ifndef _WIN32_WINNT        // 允許使用 Windows XP (含) 以後版本的特定功能。
#define _WIN32_WINNT 0x0501    // 將它變更為針對 Windows 其他版本的適當值。
#endif                       

#include <stdio.h>    //這標頭檔我們
#include <tchar.h>

// TODO: 在此參考您的程式所需要的其他標頭

stdafx.cpp 這檔案看起來好像沒甚麼用,如果沒有這個檔案會如何?試試看如果把這個檔案移出專案,進行編譯會有甚麼狀況?會出現以下的錯誤訊息。
image
這錯誤的起因是因為Microsoft Visual C++ 2005為了加速程式的編譯,Microsoft Visual C++ 2005的精靈會預設『使用先行編譯標頭檔』。在專案第一次進行編譯時會執行先行編譯標頭檔的程序(在專案屬性中可找到該設定)產生所謂的先行編譯標頭 (.PCH) 檔。這個程序的目的有助於加速編譯程式檔案,如果專案某些檔案在專案中不會異動(如一些系統提供的標頭檔stdio.h、tchar.h…等等),則不用每次編譯專案都重新編譯一次,直接引用先行編譯標頭 (.PCH) 檔。所以stdafx.cpp 這個檔案的目的主要是為了告訴編譯器產生先行編譯標頭 (.PCH) 檔。

ex1.cpp這個與專案同名的原始程式檔,是程式進入點所在(_tmain等同於main),也就是一個程式開始執行的位置;_tmain是一個函式,甚麼是函式?簡單的說就是為了達到某些功能;例如計算學生成績總平均,我們把可以達成這個功能的程式碼寫在一個獨立的區塊,然後用一個名字代表這個區塊,每次要使用計算學生成績總平均,只要在程式中寫入這個函式的名字,即可代替整個程式碼區塊。函式除了名稱之外,尚包括回傳值型態、參數列、與函式主體部分(大括號{}所包括的範圍)以下程式碼為例

image

C或C++的程式都是由一個特殊的函式開始執行,這個特殊的函式通常命名為main,在使用unicode字元集下改用wmain代替main,但這裡為什麼會用_tmain,原因是為了方便在unicode與非unicode中切換,vc中已經定義一個巨集(在tchar.h這個標頭檔中定義,所以如果不#include這個檔,將會產生錯誤),以_tmain取代main與wmain,在進行編譯時這個巨集會自動依照選擇的字集切換main或wmain。

// ex1.cpp : 定義主控台應用程式的進入點。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
        return 0;
}

這個檔案一樣也引用這標頭檔"stdafx.h"

我們在這大括號中return 0;這行前加入

printf(“Hello, World!”);記得要在句尾加入分號(;)表示一行程式的終止。

// printf這個函式可以將字串輸出至螢幕 ,可以在stdio.h這個標頭檔找到它的定義
// int printf(
//   const char *format [,
//      argument]…
//);

// ex1.cpp : 定義主控台應用程式的進入點。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{

printf(“Hello, World!”);

return 0;
}

image

 

執行Microsoft Visual C++ 2005 建置/編譯,我們的第一個程式就完成了!

在debug資料夾中我們會看到

image

其中ex1.exe就是我們要的,為了方便看到執行結果,我們用記事本程式寫一個文字檔存成window的批次檔(副檔名為.bat)

image

http://cid-dca6cbf726a34eb8.skydrive.live.com/embedrow.aspx/%e6%95%99%e5%ad%b8%e6%aa%94%e6%a1%88/c++%e7%af%84%e4%be%8b%e6%aa%94%e6%a1%88/do.bat

我們把它存在debug這個目錄與ex1.exe一起,在視窗下用滑鼠點兩下執行這個do.bat批次檔,即可看我們第1個向世界問好的程式的執行結果!

image

6.第三種檔案類型為資源檔,包括程式會用到的各種文字資料、圖片、圖示(ICON、或滑鼠游標)、註冊機碼、視窗對話盒等。這些在視窗程式設計會經常使用。