標籤:api gpo class byte 基礎 return c語言 scan 打字機
=============================================================================
涉及到的知識點有:程式的三種結構、條件分支語句、迴圈語句、求自然數的和、
求100到999之間所有的水仙花數、在螢幕輸出一個等腰三角形、迴圈語句案例-視窗移動
=============================================================================
複習:
(注意常量也是有類型的哦!)
例如:
#define MAX 100說明定義的MAX是一個有符號的int
const long a = 100u;說明定義的a是一個無符號的long
"a"字串常量相當於‘a‘ ‘\0‘
‘a‘字元常量,字元常量只能是一個ASCII字元
int4個BYTE、2個WORD 、1個DWORD
c語言中不能直接書寫二進位,用8進位和16進位來替代(和預設的十進位)。
int a = 100;
int b = sizeof(a);
sizeof 關鍵字作用是:得到某一資料類型在記憶體中佔用的大小(記憶體大小沒有負的),單位是:位元組
sizeof 不是函數,所以不需要包含任何標頭檔
其實呢,sizeof傳回值的類型是size_t,size_t類型在32位作業系統下是一個無符號的整數。
在32位系統下,sizeof傳回值是unsigned int,用 %u;在64位系統下,unsigned long,用%lu。
例如:
在32位系統下:
int a = 100;
printf("%u\n", sizeof(a));
在64位系統下:
int a = 100;
printf("%lu\n", sizeof(a));
-----------------------------------------------------------------------------
int a;等同於signed int a;
unsigned int a;
long 在32位系統下是4個BYTE,在64位系統下是多少?windows是4個位元組,linux是8個位元組。
200f 等同於 200.0
-----------------------------------------------------------------------------
int a = ‘a‘;//a = 97,是可以存放的
char a = 500;//是不可以存放的,溢出了,最大放127
‘2‘ 和 2 的區別在哪裡?
‘2‘是字元2dASCII
2是整數2
"100" 和 100 區別在哪裡?
‘1‘ ‘0‘ ‘0‘ ‘\0‘
100是一個int型整數常量
-----------------------------------------------------------------------------
int a = a;//錯誤的寫法!
char a = 97;
printf("%d\n", a);//輸出結果是97
printf("%c\n", a);//輸出結果是字元a
abc
bcd(這裡其實是斷行符號+換行)
abc
bcd(只有換行,沒有斷行符號)
bcd(abc是被bcd重疊了,這叫斷行符號)
斷行符號鍵的由來:
鍵盤:
--------------------------------------------------列印頭
------------------------
- -
- 斷行符號鍵 -
- -
------------------------
在打字機上按斷行符號鍵,列印頭就會複位
=============================================================================
程式的三種結構:
1,順序結構
2,分支結構
3,迴圈結構
=============================================================================
條件分支語句:
1、關係運算子:在c語言中0代表false,非0代表真。
關係運算子有:<(小於)、>(大於)、<=(小於等於)、>=(大於等於)、==(等於)、!=(不等於)
-----------------------------------------------------------------|-----------------------------
前四種優先順序相同 大於 後兩種優先順序相同
0 假
1 真
34 真
-34 真,非0就是真
條件運算子:(條件) ? 值1:值2
當條件成立時,運算式的值為1;當條件不成立時,運算式的值為2。
很多時候用問號來替代簡單的if語句。
例如:求絕對值的例子
int i = -8;
int x = (i < 0) ? -i: i;
-----------------------------------------------------------------------------
2、邏輯運算子:&&(邏輯與/and)、||(邏輯或/or)、!(邏輯非/not)
-----------------------------------------|---------------------
雙目運算子(兩邊必須要有運算式叫雙目) 單目運算子
-----------------------------------------------------------------------------
3、1)單分支語句
if是條件分支語句:如果條件為真,則執行代碼塊中的代碼。
if (條件)
{
代碼塊;
}
-----------------------------------------------------------------------------
2)雙分支語句
if else是雙分支語句:
if (條件)
{
代碼塊1;
}
else
{
代碼塊2;
}
-----------------------------------------------------------------------------
3)多重分支語句(多重if):else總是跟上面最近那個if配對(特別注意)
if (條件1)
{
代碼塊1;
}
else if (條件2)
{
代碼塊2;
}
else if (條件3)
{
代碼塊3;
}
......
else
{
代碼塊3;
}
例子如下:四則運算
#include <stdio.h>
int main()
{
int a;
int b;
char c;
printf("please input a:");
scanf("%d", &a);
printf("please input b:");
scanf("%d", &b);
printf("please input c:");
getchar();//把調用scanf時候使用者輸入的斷行符號鍵吃掉
c = getchar();
//printf("a = %d, b = %d, c = %c\n", a, b, c);//列印結果測試下
if (c == ‘+‘)
{
printf("%d\n", a + b);
}
else if (c == ‘-‘)
{
printf("%d\n", a - b);
}
else if (c == ‘*‘)
{
printf("%d\n", a * b);
}
else if (c == ‘/‘)
{
if (b != 0)
printf("%f\n", (double)a / b);
else
printf("error\n");
}
else
{
printf("input error\n");
}
return 0;
}
-----------------------------------------------------------------------------
4)多重分支語句(多重選取:switch與break,default)
switch (量)
{
case 值1:
語句1;
break;
case 值2:
語句2;
break;
......
......
......
case 值n:
語句n;
break;
default:
語句; //當所有case都不滿足時,執行default下面的語句。
}
例子如下:四則運算
#include <stdio.h>
int main()
{
int a;
int b;
char c;
printf("please input a:");
scanf("%d", &a);
printf("please input b:");
scanf("%d", &b);
printf("please input c:");
getchar();//把調用scanf時候使用者輸入的斷行符號鍵吃掉
c = getchar();
//printf("a = %d, b = %d, c = %c\n", a, b, c);//列印結果測試下
switch (c)
{
case ‘+‘:
printf("%d\n", a + b);
break;
case ‘-‘:
printf("%d\n", a - b);
break;
case ‘*‘:
printf("%d\n", a * b);
break;
case ‘/‘:
if (b != 0)
printf("%f\n", (double)a / b);
else
printf("error\n");
break;
default:
printf("input error\n");
}
return 0;
}
注意:當條件特別複雜時用if;當條件簡單,但分支很多時用switch。
-----------------------------------------------------------------------------
if、switch與?(問號) 都是有條件分支語句;
無條件分支語句:goto
goto end;//無條件跳轉到標號end去執行代碼
...
...
end://標號
但是不提倡大量使用goto,除非使用goto能大大簡化代碼量。
=============================================================================
迴圈語句:
while (條件)
{
代碼塊;
}
-----------------------------------------------------------------------------
continue語句
當迴圈遇到continue語句時,不再執行continue下面代碼,而是直接返回到迴圈起始語句處繼續執行迴圈。
(即當迴圈遇到continue時,就直接返回到開始重新判斷條件的地方去了)
-----------------------------------------------------------------------------
break語句
當迴圈遇到break語句時,立刻終止迴圈,迴圈結束。
-----------------------------------------------------------------------------
do while
do
{
語句;
}while (條件);
-----------------------------------------------------------------------------
while 是先判斷條件,再決定是否迴圈
do while 先迴圈,然後再判斷條件
while可能一次都不迴圈,但是do while至少能迴圈一次。
注意:
while (a != 10); //該句話相當於while (a != 10)
{
;
}
相當於死迴圈,什麼都沒有幹。
=============================================================================
小練習:求自然數的和。
使用者可以任意輸入一個正整數,求從1到這個整數之間所有自然數的和。
例如:輸入5
1 + 2 + 3 + 4 + 5 = 15
VS2017下的代碼如下:
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int sum = 0;//用來儲存計算自然數之和的變數
int a = 10;
scanf("%d", &a);
while (a > 0)
{
sum += a;
a--;
}
printf("%d\n", sum);
return 0;
}
-----------------------------------------------------------------------------
課堂作業:求整數的位元
任意輸入一個整數,假設使用者輸入了123,程式運行輸出 百
如果使用者輸入了2896,程式輸出 千
如果使用者輸入了10000,輸出 萬
VS2017下的代碼如下:
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int a = 0;
scanf("%d", &a);
int sum = 0;//sum是一個計數器
while (a > 0)//c語言中 % 是取餘運算, / 是取整運算
{
sum++;
a /= 10;
}
switch (sum)
{
case 1:
printf("個\n");
break;
case 2:
printf("十\n");
break;
case 3:
printf("百\n");
break;
}
return 0;
}
-----------------------------------------------------------------------------
小練習:求100到999之間所有的水仙花數。
水仙花數是什嗎?
一個數的百位的立方 + 十位的立方 + 個位的立方 = 這個數本身
例如:371就是一個水仙花數
3 * 3 * 3 + 7 * 7 * 7 + 1 * 1 * 1 = 371
VS2017下的代碼如下:
#include <stdio.h>
int main()
{
int a;
for (a = 100; a < 1000; a++)
{
int a1;//百位
int a2;//十位
int a3;//個位
a1 = a / 100 % 10;//a/100=5;5%10=5注意:/ 和 % 的優先順序一樣,則結合性從左至右
a2 = a / 10 % 10;//a/10=53;53%10=3
a3 = a / 1 % 10;//a/1=537;537%10=7
if ((a1 * a1 * a1 + a2 * a2 * a2 + a3 * a3 * a3) == a)
printf("%d\n", a);
}
return 0;
}
-----------------------------------------------------------------------------
九九乘法表
VS2017下的代碼如下:
#include <stdio.h>
int main()
{
int a;
int b;
for (a = 1; a < 10; a++)//外迴圈,控制行,即外迴圈決定有多少行
{
for (b = 1; b <= a; b++)//內迴圈,控制列,即內迴圈決定每一行有幾個列,外迴圈每迴圈一次,內迴圈迴圈4次
{
printf("%d\t", a * b);
}
printf("\n");
}
return 0;
}
-----------------------------------------------------------------------------
作業:在螢幕輸出一個等腰三角形
-------*-------
------***------
-----*****-----
----*******----
---*********---
--***********--
-*************-
***************
不能用printf一行一行列印輸出等腰三角形
printf(" *\n");
printf(" ***\n");
printf(" *****\n");
分析:
每一行的*和行號的關係是:行號 * 2 - 1
每一行的*和減號的關係是:行號 - 1;行號 - 2;行號 - 3;......;行號 - 行號
VS2017下的代碼如下:
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int a;
int b;
int num = 0;
scanf("%d", &num);
for (a = 1; a <= num; a++)//外迴圈,控制行,即外迴圈決定有多少行
{
for (b = 0; b < num - a; b++)
{
printf("-");
}
for (b = 0; b < a * 2 - 1; b++)//內迴圈,控制列,即內迴圈決定每一行有幾個,外迴圈每迴圈一次,內迴圈迴圈num次
{
printf("*");
}
for (b = 0; b < num - a; b++)
{
printf("-");
}
printf("\n");
}
return 0;
}
=============================================================================
迴圈語句案例-視窗移動
VS2017下的代碼如下:
#include <stdio.h>
#include <Windows.h>//使用視窗移動,需要利用API函數,則需要包含一個標頭檔
int main()
{
int x = 100;
int y = 100;
int status = 0; //0代表從左往右跑,1代表從右往左跑。
int status1 = 0; //0代表從上往下跑,1代表從下往上跑。
int status2 = 1; //0代表x軸不動,1代表y軸不動
while (1)
{
SetWindowPos((HWND)0x00830968, NULL, x, y, 300, 200, 0);//這個函數可改變一個視窗的位置和大小
if (status == 0 && status2 == 1)
x += 10;
if (x >= 1000)
{
status1 = 0;
status2 = 0;
}
if (status1 == 0 && status2 == 0)
y += 10;
if (y >= 800)
{
status = 1;
status2 = 1;
}
if (status == 1 && status2 == 1)
x -= 10;
if (x <= 100)
{
status1 = 1;
status2 = 0;
}
if (status1 == 1 && status2 == 0)
y -= 10;
if (y <= 100)
{
status = 0;
status2 = 1;
}
//if (status == 0 && status2 == 1)
//x += 10;
Sleep(20);//Sleep函數的功能是程式休眠,參數單位是毫秒,1000ms代表1秒
}
/*
該函數的參數解釋如下:
第一個參數:是視窗的控制代碼。控制代碼:是windows的一個概念,即所有的視窗都有一個唯一的編號,這個編號叫控制代碼。(注意控制代碼是16進位的)
如何得到某一個視窗的控制代碼呢?在vs2017的/工具選項/Spy++(間諜的意思)/尋找視窗/尋找程式工具/拖動到對應的視窗
第二個參數:預設寫NULL。
第三個參數:是視窗位置的x座標。
第四個參數:是視窗位置的y座標。
第五個參數:是視窗寬度。
第六個參數:是視窗高度。
第七個參數:預設寫0。
(0,0)左上方
------------------------------x軸
|
|
|
|y軸
*/
return 0;
}
=============================================================================
c語言基礎學習04