【C++】2.C++ 基本語法

1、基本語法html

1.用VC++控制檯應用程序輸出第一個Hello World!ios

(1).建立一個C++控制檯應用程序ConsoleTestc++

(2).在源文件ConsoleTest.cpp中輸入如下代碼:編程

#include "stdafx.h"  //預編譯頭
#include <iostream>
using namespace std;
int main()
{    
   cout << "Hello World!\n";
   getchar();
   return 0;
}
數組

cout函數用於向屏幕中輸出數據,cout<<表達式1<<表達式2...<<表達式n;ide

若是不引入「using namespace std;」,輸出語句就要寫成std::cout << "Hello World!";函數

getchar();或者system("pause");能夠避免控制檯程序執行完後一閃而過看不到內容測試

\n是轉義字符,以「\」開始,與後面鏈接的字符一塊兒表示轉義後的字符,這裏\n表示換行加密


二、格式化輸出spa

printf函數爲格式輸出函數:printf(格式控制,輸出列表)

格式控制:是用雙引號括起來的字符串,包含兩種字符,一種是格式字符,以"%"字符開頭,將輸出的數據轉化爲指定的格式輸出;另外一種是普通字符,原樣輸出字符,包括雙引號內的逗號、空格和換行符。

輸出列表:列出要輸出的一些數據,能夠是變量或表達式。

例1:輸出普通字符

int main()
{    
   printf("╔═════════════════╗\n");
   printf("║                                  ║\n");
   printf("║        您好!                    ║\n");
   printf("║        歡迎光臨寒舍              ║\n");
   printf("║        體驗C++的獨特魅力         ║\n");  
   printf("║                                  ║\n");
   printf("╚═════════════════╝\n");
   getchar();
   return 0;

}


例2:輸出不一樣類型的數據

int main()
{    
   int Number = 1;
   float Price = 98.00;
   printf("╔═════════════════╗\n");
   printf("║                                  ║\n");
   printf("║        VC++編程                  ║\n");
   printf("║        價格:    %0.2f    元     ║\n",Price);   //輸出實型數據
   printf("║        數量:    %d       個      ║\n",Number); //輸出整型數據
   printf("║                                  ║\n");
   printf("║VC++編程,價格:%0.2f元,數量:%d個  ║\n", Price,Number); //一行輸出多個參數
   printf("║                                  ║\n");
   printf("╚═════════════════╝\n")
;
getchar();
   return 0;

}

%0.2f將實數輸出時保留小數點後兩位,不然會默認6位小數


例3:輸出字符表情

int main()
{    
   printf("╔═════════════════╗\n");
   printf("║                                  ║\n");
   printf("║            ╭︿︿︿╮            ║\n");
   printf("║            {/ $  $ /}            ║\n");
   printf("║             ( (oo) )             ║\n");
   printf("║             ︶ ︶ ︶             ║\n");
   printf("║                                  ║\n");
   printf("╚═════════════════╝\n");
   getchar()
;
   return 0;

}

例4:獲取用戶輸入的用戶名

int main()
{    
   char Username[10];
   char Password[10];
   cout << "請輸入用戶名:\n";
   cin >> Username;
   cout << "請輸入密碼:\n";
   cin >> Password;
   cout << "╔═════════════════╗\n";
   cout << "║              登陸框              ║\n";
   cout << "╠════════╦════════╣\n";
   cout << "║   用戶名:     ║      " << Username << setw(13 - strlen(Username)) << "║\n";
   cout << "╠════════╬════════╣\n";
   cout << "║   密  碼:     ║      " << Password << setw(13 - strlen(Password)) << "║\n";
   cout << "╚════════╩════════╝\n";
   getchar();
   getchar();
   return 0;

}

cin函數用來獲取用戶輸入的數據,cin>>變量1>>變量2>>...>>變量n;
char Username[10]; 數組,10是數組的大小
strlen(Username)  計算字符串的長度
爲了使邊框的側邊可以所有對齊,須要判斷用戶輸入的「用戶名」和「密碼」的長度,而後根據其長度補充指定數量的空格,這裏用到setw函數,該函數用於插入指定數量的空格,須要引入#include <iomanip>頭文件。


三、格式化輸入

scanf函數爲格式輸入函數:scanf(格式控制,輸出列表)

【注】printf和scanf都是在C語言中進行輸入輸出的函數,C++保留了C語言的這一用法

int main( )
{
   int a; float b; char c;
   scanf("%d %c %f",&a,&c,&b);  //注意在變量名前要加地址運算符&
   printf("a=%d,b=%f,c=%c\n",a,b,c);
   return 0;
}

運行狀況以下:
12 A 67.98↙(本行爲輸入,輸入的3個數據間以空格相間)
a=12,b=67.980003,c=A(本行爲輸出)
輸入的整數12送給整型變量a,字符'A'送給字符變量c,67.98送給單精度變量b

c++中scanf函數的運用:http://blog.sina.com.cn/s/blog_68f278900100jht2.html


2、運算符的使用

一、簡單的字符加密

#include "stdafx.h"  //預編譯頭
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    int result = 1;
    int i;
    int count = 0;
    char Text[128] = { '\0' };              //定義一個明文字符數組,->字符數組類型
    char cryptograph[128] = { '\0' };       //定義一個密文字符數組
    while (1)
    {
        if (result == 1)                    //若是是加密明文                 
        {
            printf("請輸入要加密的明文:\n");   //輸出字符串
            scanf("%s",&Text);                  //獲取輸入的明文,->scanf在if裏
            count = strlen(Text);
            for (i = 0; i<count; i++)           //遍歷明文
            {
                cryptograph[i] = Text[i] + i + 5;   //設置加密字符
            }
            cryptograph[i] = '\0';           //設置字符串結束標記,->i是在外面定義的
            //輸出密文信息
            printf("加密後的密文是:%s\n", cryptograph);
        }
        else if (result == 2)                //若是是解密字符串
        {
            count = strlen(Text);
            for (i = 0; i<count; i++)        //遍歷密文字符串
            {
                Text[i] = cryptograph[i] - i - 5;    //設置解密字符
            }
            Text[i] = '\0';                  //設置字符串結束標記
            //輸出明文信息
            printf("解密後的明文是:%s\n", Text);
        }
        else if (result == 3)                //若是是退出系統
        {
            break;                          //break語句跳出循環
        }
        else                                //考慮輸入的命令是一、二、3之外的字符的狀況
        {
            printf("請輸入正確命令符:\n");  //輸出字符串
        }

        //輸出字符串
        printf("輸入1加密新的明文,輸入2對剛加密的密文進行解密,輸入3退出系統:\n");
        printf("請輸入命令符:\n");         //輸出字符串
        scanf("%d", &result);               //獲取輸入的命令字符
    }
    return 0;
}

\0表示空字符,做爲字符串結束符使用

這裏加密的方式是將字符串中的每一個字符加上它在字符串中的位置和一個偏移值5,以字符串mrsoft爲例,第一個字符m在字符串中的位置爲0,那麼它對應的密文爲m+0+5,即r。在本例中,字符的加密是經過「+」運算符實現的。在C++語言中,算術運算符功能以下:

+(加法運算符)、-(減法運算符)、*(乘法運算符)、/(除法運算符)、%(求模運算符)

 

二、實現兩個變量的互換

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

     int iVar = 18;                           //定義一個變量iVar,初始值爲18
     int jVar = 10;                           //定義一個變量jVar,初始值爲10
     cout << "╔═════════════════╗" <<endl;
     cout << "║         轉換前iVar = " << iVar << "          ║" <<endl;
   //輸出變量iVar
     cout << "║         轉換前jVar = " << jVar << "          ║" << endl;  //輸出變量jVar
     cout << "╠═════════════════╣" <<endl;
     iVar = iVar ^ jVar;
                   //iVar與jVar進行按位異或運算,結果賦值給iVar
     
jVar = iVar ^ jVar;                   //iVar與jVar進行按位異或運算,結果賦值給jVar
    
 iVar = jVar ^ iVar;                   //jVar與iVar進行按位異或運算,結果賦值給iVar
    
 cout << "║         轉換後iVar = " << iVar << "          ║" <<endl;   //輸出iVar
    
 cout << "║         轉換後jVar = " << jVar << "          ║" << endl;  //輸出jVar
     
cout << "╚═════════════════╝"<<endl;
     getchar();
     return 0;
}

endl的做用是換行。

一個字節分爲8位,每一位能夠表示一個二進制數0或1,爲了可以對一個字節中的某一位或幾位進行操做,C++提供了6種位運算符:
& 按位與運算 僅當兩個二進制位都是1時,結果爲1,不然結果爲0
| 按位或運算 只要有一個二進制位爲1,則結果爲1,當兩個二進制位都是0時,結果爲0
^ 按位異或   兩個相應的二進制位均相同,則結果爲0,不然結果爲1
~ 按位取反   即將0轉換爲1,將1轉換爲0
<< 左移運算符
>> 右移運算符

本例是經過3次異或運算實現的,原理如圖:

wKiom1N-sBjCVZn5AADVS3Kcbco521.jpg

規律:

異或運算有交換律規則,即A^B^C=B^C^A;

同一個數相異或,結果爲0,即A^A=0;

0異或任何數,值爲任何數,即0^A=A;

根據這些規則,上圖不難推出。


三、簡單的位運算

當a = 2, b = 4, c = 6, d = 8時,編程求 a&c,b|d,a^d,~a的值  

#include "stdafx.h"  //預編譯頭

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned result;
    int a = 2, b = 4, c = 6, d = 8;
    printf("╔═════════════════╗\n");
    printf("║     a=%d,b=%d,c=%d,d=%d              ║\n", a, b, c, d); //輸出四個變量的值
    printf("╠═════════════════╣\n");
    printf("║     輸出運算結果:               ║\n");
    result = a & c;
    printf("║     a & c = %u                    ║\n", result);   //a&c的結果賦給result
    result = b | d;
    printf("║     b | d = %u                   ║\n", result);    //b|d的結果賦給result
    result = a ^ d;                                                //a^d的結果賦給result
    printf("║     a ^ d = %u                   ║\n", result);
    result = ~a;                                                   //~a的結果賦給result
    printf("║     ~ a = %u             ║\n", result);
    printf("╚═════════════════╝\n");
    getchar();
    return 0;
}

wKiom1OD7d2BT9ztAACzQAL2N8I992.jpg

若是printf("║     ~ a = %d             ║\n", ~a);則輸出-3

注意位運算符和邏和輯運算符的區別:
邏輯與"&&"和按位與"&";邏輯或"||"和按位或"|"


四、判斷性別

提到判斷時,除了if語句,還能夠用三目元運算符「? : 」,使用形式爲:

表達式1? 表達式2:表達式3

先求表達式1的值,若是爲真,則表達式2的值爲整個三目元表達式的值;若是爲假,則表達式3的值爲整個三目元表達式的值.  

條件運算符優先於賦值運算符,比關係運算符和算術運算符都低。
條件運算符的結合方向爲「自右至左」。
在條件運算符中,表達式1的類型能夠與表達式2和表達式3的類型不一樣。

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

    char name[20];
    int sex;
    printf("請輸入姓名:\n");
    scanf("%s", &name);    
    printf("請輸入1或0,1表示男,0表示女:\n");
    scanf("%d", &sex);
    printf("═══════════════════\n");
    printf("      姓名:     %s                   \n", name);
    printf("═══════════════════\n");
    char* strSex = (sex == 1) ? "男" : "女"; 
    //char strSex = (sex == 1) ? 'M' : 'F';
    printf("      性別:     %s                   \n", strSex);
    printf("═══════════════════\n");
    getchar();
    getchar();
    return 0;
}

有關char* strSex = (sex == 1) ? "男" : "女";的講解:
雙引號""表明是字符串,內存中有一個\0的佔位符,字符串就必需要char*
若是改成char chSex = (sex == 1) ? '男' : '女';並修改:
printf("      性別:     %c                   \n", strSex);

會出現問題的是:

wKioL1N-w26gb2t1AACAUmvsOy8660.jpg

由於char不能顯示中文,因此將其改成char chSex = (sex == 1) ? 'M' : 'F';才行(而且單引號內最多4個字符)。要解決中文顯示的問題,能夠把程序改爲Unicode,用wchar能夠顯示中文,unicode:中文和英文默認統一是16位。


五、用宏定義實現值互換

定義一個帶參數的宏swap(a,b),以實現兩個整數之間的交換,並利用它將一維數組a和b的值進行交換。

宏定義的語法以下:
#define 宏名(參數表) 字符串

注意事項:

(1)對帶參數的宏的理解是將語句中的宏名後面括號內的形參字符串代替#define命令行中的對應參數。
(2)在宏定義時,宏名和帶參數的括號之間不能夠加空格,不然將空格之後的字符都做爲替代字符串的一部分。注意宏定義是用宏名替換字符串,但不進行正確性檢查。
(3)#define命令出如今程序中函數的外面,宏名的有效範圍爲定義命令以後到源文件結束。可使用#undef命令終止宏定義的做用域。

(4)在進行宏定義時,能夠引用已定義的宏名,能夠層層替換。在程序中用雙引號包起來的字符串內的字符,不進行替換。
(5)宏定義只做字符替換,不分配內存空間。宏定義不用在行末加分號。在帶參宏定義中,形式參數不分配內存單元,所以沒必要做類型定義。

#include "stdafx.h"  //預編譯頭
#define swap(a,b) {int c;c=a;a=b;b=c;}          //定義一個帶參的宏swap
int _tmain(int argc, _TCHAR* argv[])
{

    int i, j, a[10], b[10];                    //定義數組及變量爲基本整型
    printf("請向數組a中輸入10個數:\n");
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);                    //輸入一組數據存到數組a中
    printf("請向數組b中輸入10個數:\n");
    for (j = 0; j < 10; j++)
        scanf("%d", &b[j]);                    //輸入一組數據存到數組b中
    printf("顯示數組a:\n");
    for (i = 0; i < 10; i++)
        printf("%d,", a[i]);                   //輸出數組a中的內容
    printf("\n顯示數組b:\n");
    for (j = 0; j < 10; j++)
        printf("%d,", b[j]);                   //輸出數組b中的內容
    for (i = 0; i < 10; i++)
        swap(a[i], b[i]);                      //實現數組a與數組b對應值互換
    printf("\n輸出轉換後的數組a:\n");
    for (i = 0; i < 10; i++)
        printf("%d,", a[i]);                   //輸出互換後數組a中的內容
    printf("\n輸出轉換後的數組b:\n");
    for (j = 0; j < 10; j++)
        printf("%d,", b[j]);                   //輸出互換後數組b中的內容
    printf("\n");
    getchar();
    getchar();
    return 0;
}

wKioL1OCs8WBnEGZAAEQ0hvBzF0066.jpg


六、整數加減法練習

練習者本身選擇是進行加法仍是減法運算,以後輸入進行多少之內的加法或減法運算,具體數值會由計算機隨機產生,輸入答案,計算機會根據輸入的數據判斷結果是否正確。

#include "stdafx.h"  //預編譯頭
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int _tmain(int argc, _TCHAR* argv[])
{
    int a, b, c, sign, max;      //定義基本整型變量
    char sign1;                  //定義字符型變量,保存加法/減法的符號
    printf("請輸入運算符(1或者其餘數字,1表示:-,其餘表示數字:+):\n");
    scanf("%d", &sign);          //輸入函數,輸入數據賦給sign(表示加法/減法符號的數字)
    printf("請輸入加減時的最大範圍(<10000):\n");
    scanf("%d", &max);           //輸入函數,輸入數據賦給max
    srand((unsigned long)time(0));  //系統時鐘設定種子
    a = rand() % max;   //產生小於max的隨機數,若是輸入max值爲10,則a產生0~9的10個隨機整數
    b = rand() % max;   //產生小於max的隨即數並賦給b
    while ((a < b) && (sign == 1))    //選擇減法操做時若是a小於b則從新產生隨即數
    {
        a = rand() % max;
        b = rand() % max;
    }
    sign1 = (sign == 1 ? '-' : '+');    //將選擇的符號賦給sign1
    printf("\n%d%c%d=", a, sign1, b);
    scanf("%d", &c);              //輸入運算結果
    if ((sign == 1) && (a - b == c) || (sign != 1) && (a + b == c))  //判斷運算結果是否正確
        printf("OK!\n");          //等於正確答案輸出ok
    else
        printf("答錯了!\n");      //不等於正確答案輸出錯誤
    getch();                      // 至關於getchar()
    getchar();
    return 0;
}


3、條件語句

一、李白喝酒問題

李白閒來街上走,提着酒壺去買酒。遇店加一倍,見花喝一斗。店不相鄰開,花不成雙長。三遇店和花,喝光壺中酒。借問此壺中,原有多少酒?

分析:「遇店加一倍,見花喝一斗」,說明遇到酒店就打一倍的酒,遇到花就喝掉酒壺中的一斗酒;店不相鄰開,花不成雙長」,說明店和花是交替碰見的;「三遇店和花,喝光壺中酒」,說明一共遇到3次店和3次花,並在最後碰見花時,喝光了酒壺中的酒。

這道題以倒序的方法比較容易思考:
第3次遇到花時,酒壺中酒的數量爲0+1=1;
第3次遇到店時,酒壺中酒的數量爲1/2=0.5;
第2次遇到花時,酒壺中酒的數量爲0.5+1=1.5;
第2次遇到店時,酒壺中酒的數量爲1.5/2=0.75;
第1次遇到花時,酒壺中酒的數量爲0.75+1=1.75;
第1次遇到店時,酒壺中酒的數量爲1.75/2=0.875;

#include "stdafx.h"  //預編譯頭
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    double dSum = 0;           //定義一個雙精度變量,記錄累加和的結果
    for (int i = 0; i<6; i++)  //根據遇到店和花的總次數循環:「三遇店和花」,即總循環次數爲6
    {
        if (i % 2 == 0)        //若是i%2等於0時爲遇到花
        {
            dSum += 1;         //將酒的數量加1鬥
        }
        else                   //不然爲遇到店
        {
            dSum /= 2;         //將酒的數量減半
        }
    }
    cout << "╔═════════════════╗" << endl;
    cout << "║                                  ║" << endl;
    cout << "║       酒壺中有: " << dSum << "鬥          ║" << endl;  //輸出結果
    cout << "║                                  ║" << endl;
    cout << "╚═════════════════╝" << endl;
    getchar();
    return 0;
}

wKioL1OESryiR5dQAACDZIzOfsw022.jpg

if語句格式有三種形式:

(1)if(表達式)
         語句;

(2)if(表達式)
         語句1;
     else
         語句2;

(3)if(表達式1)
         語句1;
     else if(表達式2)
         語句2;
     else if(表達式3)
         語句3;
     ...
     else if(表達式m)
         語句m;  
     else
         語句n;

       依次判斷表達式的值,當出現某個值爲真時,則執行其對應的語句,而後跳到整個if語句以外繼續執行程序。若是全部的表達式均爲假,則執行語句n,而後繼續執行後續程序。

       3種形式的if語句中,在if後面都有「表達式」,通常爲邏輯表達式或關係表達式。在執行if語句時先對錶達式求解,若表達式的值爲0,則按「假」處理;若表達式的值爲非0,則按「真」處理,執行指定的語句。

       else子句不能做爲語句單獨使用,它必須是if語句的一部分,與if配對使用。

       if與else後面能夠包含一個或多個內嵌的操做語句,當爲多個操做語句時要用「{}」將幾個語句括起來成爲一個複合語句。

       if語句能夠嵌套使用即在if語句中又包含一個或多個if語句,在使用時應注意else老是與它上面的最近的未配對的if配對。


二、桃園三結義

桃園,一個地名,三結義,表示劉關張三兄弟按照年紀大小結爲異姓兄弟,在這裏出現了一個屬性問題,那就是對於3個數進行的大小排序。

#include "stdafx.h"  //預編譯頭

int _tmain(int argc, _TCHAR* argv[])
{
    int a, b, c, t;                        //定義4個基本整型變量a,b,c,t
    printf("請輸入3我的的年齡:\n");        //雙引號內普通字符原樣輸出並換行
    scanf("%d%d%d", &a, &b, &c);     //輸入任意3個數
    if (a < b)                            //若是a小於b,藉助中間變量t實現a,b值互換
    {
        t = a;
        a = b;
        b = t;
    }
    if (a < c)                            //若是a小於c,藉助中間變量t實現a,c值互換
    {
        t = a;
        a = c;
        c = t;
    }
    if (b < c)                            //若是b小於c,藉助中間變量t實現b,c值互換
    {
        t = b;
        b = c;
        c = t;
    }
    printf("年齡排序以下:\n");
    printf("%d,%d,%d\n", a, b, c);        //輸出函數將a,b,c的值順序輸出
    getchar();
    getchar();
    return 0;
}

wKiom1OEU6fg799OAABodew_1Ks725.jpg

       用scanf函數設置輸入數據時,能夠設置不一樣的分隔符。例如本例中的"%d%d%d",在輸入時須要經過空格或回車鍵入每個輸入數據,最後以Enter鍵來表示輸入結束。除了這種方式之外,也能夠經過符號來分隔,如"%d,%d,%d",在參數中加入逗號",",那麼在進行輸入數據時,也須要經過逗號來鍵入每個輸入數據,如輸入「25,43,14」,而後再按Enter鍵結束輸入便可。


三、何年是潤年

若是某年能被4整除,但不能被100整除;或者該年能被400整除,則該年爲潤年。

#include "stdafx.h"  //預編譯頭
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int year;                //定義基本整型變量year
    printf("請輸入年份:\n");
    scanf("%d", &year);      //從鍵盤輸入表示年份的整數
    printf("╔═════════════════╗\n");
    printf("║                                  ║\n");
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)  //判斷閏年條件
        printf("║           %d年是閏年           ║\n", year); //知足條件的輸出是閏年
    else
        printf("║           %d年不是閏年         ║\n", year); //不然輸出不是閏年
    printf("║                                  ║\n");
    printf("╚═════════════════╝\n");
    getchar();
    getchar();
    return 0;
}

wKioL1OFb_uC8Bv-AABazOTjINE008.jpg
邏輯與"&&"(至關於其餘語言中的AND),a&&b,若a,b爲真,則a&&b爲真。
邏輯或"||"(至關於其餘語言中的OR),a||b,若a、b之一爲真,則a||b爲真。
邏輯非"!"(至關於其餘語言中的NOT),!a,若a爲真,則!a爲假。

三者的優先次序是:!>&&>||


四、小球稱重

假設你有9個球和一個天平,其中一個略微重一些,要求稱最少的次數找出這個較重的球。
分析:把球編爲①②③④⑤⑥⑦⑧⑨號,而後在稱量時會發生如下3種狀況中的一種。

第一次稱量時,把①②③放在天平左側,④⑤⑥放在天平右側,若是左端下沉,說明重球在①②③中;若是右端下沉,說明重球在④⑤⑥中;若是左右兩邊相等則重球在⑦⑧⑨中。
第二次稱量時,取出重的一組球,把一個放在天平左側,一個放在天平右側,哪端下沉,則天平上的那個球重,若是兩邊相等則沒有稱的那個球重。

經過以上的稱量方式,就能夠在兩次稱量中找出較重的小球。

#include "stdafx.h"  //預編譯頭
#include <iostream>
using namespace std;

int Weight(int iArray[], int iNum)       //用於稱重的函數,iNum傳入球的個數
{
    int iRet;                            //定義整型變量,用於記錄結果
    int iVar = iNum / 3;                 //用於記錄3等分後,每組球的個數
    int jVar, mVar, nVar, kVar;          //定義整型變量,用於記錄每組球的重量
    jVar = mVar = nVar = 0;              //初始化變量的值爲0
    for (int i = 0; i<iVar; i++)         //循環累加每組球的重量
    {
        jVar += iArray[i];               //第1組球的重量
        mVar += iArray[i + iVar];        //第2組球的重量
        nVar += iArray[i + iVar * 2];    //第3組球的重量
    }
    //聲明指向整型的指針變量pArray,動態產生一個無名數組,該數組包含iVar個整型變量,該數組的起始地址保存在指針變量pArray中。
    int* pArray = new int[iVar];        //開闢一塊空間,記錄較重的一組球
    if (jVar > mVar)                    //若是第1組球的重量大於第2組球的重量
    {
        kVar = 0;                       //設置計算因子爲0
    }
    else if (jVar < mVar)               //若是第1組球的重量小於第2組球的重量
    {
        kVar = 1;                       //設置計算因子爲1
    }
    else if (jVar == mVar)              //若是第1組球的重量等於第2組球的重量
    {
        kVar = 2;                       //設置計算因子爲2
    }
    if (iVar == 1)                      //若是每組的球數爲1
    {
        iRet = iVar*kVar+1;             //經過計算因子計算重球的號碼
    }
    else                                //每組的球數大於1
    {
        for (int j = 0; j<iVar; j++)    //根據球數進行循環
        {
            pArray[j] = iArray[j + iVar*kVar];    //記錄最重的一組球
        }
        //遞歸調用Weight函數,以一樣分組的方法稱量小球
        iRet = Weight(pArray, iVar) + iVar*kVar;
    }
    delete[] pArray;                    //釋放空間
    return iRet;                        //返回較重的小球號碼
}

int _tmain(int argc, _TCHAR* argv[])
{
    int Ball[] = { 1, 1, 1, 1, 1, 1, 1, 2, 1 };     //定義數組,存儲小球重量
    int iWeightBall = Weight(Ball, 3);              //調用Weight函數稱量小球
    cout << "比較重的小球號碼:" << endl;           //輸出字符串
    cout << iWeightBall << endl;                    //輸出較重的小球值
    getchar();
    return 0;
}

注意:自定義的函數要放在主函數main前面,不然main函數中調用該函數時會找不到調用的函數名。


五、購物街中的商品價格競猜

#include "stdafx.h"  //預編譯頭

int _tmain(int argc, _TCHAR* argv[])
{
 float bccd = 98.0;
 printf("編程全能詞典的單價是多少?\n");
 float Price;
 while (1)
 {
  scanf("%f",&Price);
  if (Price > bccd)
  {
   printf("你猜的價格高了!\n");
   getchar();
  }
  else if (Price < bccd)
  {
   printf("你猜的價格低了!\n");
   getchar();
  }
  else
  {
   printf("回答正確,編程全能詞典的單價是%0.2f元\n",Price);
   break;
  }
 }
    getchar();
    getchar();
    return 0;
}

wKiom1OF1Y7CmpY9AACqQOF5H4Q877.jpg


六、促銷商品的折扣計算

switch語句:測試一組有序類型(整型、字符型、枚舉型、布爾類型等)的數據,發現匹配的常量時,將執行與該常量關聯的數據。

switch( 表達式)
{
case 常量1:
     語句;
     break;
case 常量2:
     語句;
     break;
......
case 常量n:
     語句;
     break;
default:
     語句;
}

    其中,表達式必須是有序類型,不能是實數或字符串類型。表達式逐一與case語句部分的常量匹配,若是發現有常量與表達式相匹配,則執行當前case部分的語句,直到遇到break語句爲止,或者到達switch語句的末尾(沒有遇到break語句)。當表達式沒有發現與之匹配的常量時,將執行default部分的代碼。default語句是可選的,若是代碼中沒有提供default語句,而且沒有常量與表達式匹配,那麼switch語句將不執行任何動做。

#include "stdafx.h"  //預編譯頭

int _tmain(int argc, _TCHAR* argv[])
{
    printf("╔═════════════════╗\n");
    printf("║       滿 500可享受9折優惠        ║\n");
    printf("╠═════════════════╣\n");
    printf("║       滿1000可享受8折優惠        ║\n");
    printf("╠═════════════════╣\n");
    printf("║       滿2000可享受7折優惠        ║\n");
    printf("╠═════════════════╣\n");
    printf("║       滿3000可享受6折優惠        ║\n");
    printf("╠═════════════════╣\n");
    printf("║       滿5000可享受5折優惠        ║\n");
    printf("╚═════════════════╝\n");
    printf("請輸入你消費的金額:\n");
    float dMoney;
    scanf("%f", &dMoney);
    int iMoney = dMoney;
    switch (iMoney / 500)
    {
    case 0:
        printf("你的消費沒有折扣,金額是:%0.2f\n", dMoney);
        break;
    case 1:
        printf("你的消費享受9折優惠,金額是:%0.2f,優惠後的金額是:%0.2f\n", dMoney, dMoney*0.9);
        break;
    case 2: case 3:
        printf("你的消費享受8折優惠,金額是:%0.2f,優惠後的金額是:%0.2f\n", dMoney, dMoney*0.8);
        break;
    case 4: case 5:
        printf("你的消費享受7折優惠,金額是:%0.2f,優惠後的金額是:%0.2f\n", dMoney, dMoney*0.7);
        break;
    case 6: case 7: case 8: case 9:
        printf("你的消費享受6折優惠,金額是:%0.2f,優惠後的金額是:%0.2f\n", dMoney, dMoney*0.6);
        break;
    default:
        printf("你的消費享受5折優惠,金額是:%0.2f,優惠後的金額是:%0.2f\n", dMoney, dMoney*0.5);
        break;
    }
    getchar();
    getchar();
    return 0;
}

wKiom1OG0jezBOXFAAF_H70H2Tc737.jpg
    在switch語句中,若是多個case常量須要進行相同的處理,那麼能夠將多個case語句組織在一塊兒,中間不加break語句,使多個case語句均可以執行同一個語句塊。


七、利用switch語句輸出倒三角形

    枚舉類型可以將一組枚舉常量與一個枚舉類型名稱關聯。枚舉類型就像是一個常量的集中營,在這個集中營中,常量被冠名爲枚舉常量,若是參數以某一個枚舉類型定義參數類型,那麼在調用該函數時,就只有該集中營中的枚舉類型做爲參數經過,雖然其餘常量的值和枚舉常量的值能夠相同,可是因爲不屬於當前枚舉類型這個集中營,因此在做爲參數調用函數時不能經過。在C++中使用關鍵字enum定義一個枚舉類型:
enum RecordsetState{RS_OPEN,RS_WAIT,RS_CLOSE};  //定義枚舉類型

    在定義枚舉類型時,能夠爲各個枚舉常量提供一個整數值,若是沒有提供整數值,默認第一個常量值爲0,第二個常量值爲1,依此類推。例如上面的代碼中,RS_OPEN的值爲0,RS_WAIT的值爲1,RS_CLOSE的值爲2.

#include "stdafx.h"  //預編譯頭
#include <iostream>
using namespace std;
typedef enum NUMBER{ ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN };

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "╔═══════════════╗" << endl;
    NUMBER num = FIVE;          //定義枚舉變量,並賦初值
    switch (num)
    {
    case SEVEN:
        cout << "║        *************         ║" << endl;
    case SIX:
        cout << "║         ***********          ║" << endl;
    case FIVE:
        cout << "║          *********           ║" << endl;
    case FOUR:
        cout << "║           *******            ║" << endl;
    case THREE:
        cout << "║            *****             ║" << endl;
    case TWO:
        cout << "║             ***              ║" << endl;
    case ONE:
        cout << "║              *               ║" << endl;
    }
    cout << "╚═══════════════╝" << endl;
    getchar();
    return 0;
}

wKiom1OG1t-gCvQ9AAB7-4dWaX8075.jpg

爲枚舉常量賦默認值,下面的語句就是爲枚舉常量提供數值:enum RecordsetState {RS_OPEN=3,RS_WAIT,RS_CLOSE=6};上面的語句將枚舉常量RS_OPEN設置爲3,將枚舉常量RS_CLOSE設置爲6,沒有爲RS_WAIT提供默認值,RS_WAIT的數值爲前一個枚舉常量值加1,所以RS_WAIT的數值爲4

相關文章
相關標籤/搜索