c語言基礎學習04

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.