1. 程式人生 > 其它 >C語言基礎3(開關迴圈goto)

C語言基礎3(開關迴圈goto)

技術標籤:c/c++相關c語言

複習:

1、資料型別:
    signed char         1   %hhd    -128~127
    signed short        2   %hd     -32768~32767
    signed int          4   %d      正負20億
    signed long         4   %ld
    signed long long    8   %lld    9天開頭的19位數
    unsigned char       1   %hhu    0~255
    unsigned short      2   %hu     0~65535
    unsigned int        4   %u      0~40億
    unsigned long       4   %lu     
    unsigned long long  8   %llu    1開頭的20位數
    float               4   %f
    double              8   %lf
    long double         12  %LF
2、變數取名規則
    1、由數字 字母 下劃線組成
    2、不能以數字開頭
    3、不能與關鍵字重名
    4、見名知義
3、變數的輸入輸出
    printf 提示資訊+佔位符+變數名
    scanf 佔位符+變數地址
    %nd %0nd %-nd %n.mf
3、運算子
    / % 除數不能0,否則會產生浮點數例外,核心已轉儲錯誤
    == 變數儘量放在右邊
    ++/-- 一行程式碼中不要過多使用
    && || 具有短路特性
    A?B:C 不能出現流程控制語句
4、型別轉換
    自動型別轉換:不同型別的資料會先轉換成相同型別的資料才能進行運算。
    轉換規則(以不丟失資料為基礎,適當犧牲一些空間):
    1、位元組少向位元組多轉
    2、相同位元組數有符向無符轉
    3、整型向浮點型轉

    強制型別轉換:
        (目標型別)資料 , 可能會造成資料丟失,慎重使用。

一、開關語句

switch

switch(n)//運算結果必須是整型
{
    case val: // val必須是整常量 ,如果val等於n,則開啟執行開關
        ... 
        break; // 關閉執行開關
    注意:如果每個cast後都有break,就形成了分支結構。
    default:// 如果所有的case都沒有匹配成功則開啟執行開關
}
case a ... b: 判斷一個範圍,此為GNU編譯器獨有的語法,不建議使用。

練習1:輸入一個月份,判斷季節。
123 春天
456 夏天
789 秋天
10 11 12 冬天
other 輸入的月份有誤

#include
<stdio.h>
int main() { unsigned int month = 0; printf("請輸入一個月份:"); scanf("%u",&month); switch(month) { case 1 ... 3: printf("春天"); break; case 4 ... 6: printf("夏天"); break; case 7 ... 9: printf("秋天"); break; case 10 ... 12: printf
("冬天"); break; default: printf("輸入的月份有誤!\n"); break; } }

練習2:輸入一個月份,判斷該月有多少天,忽略閏年問題。

#include <stdio.h>
#include <stdint.h>

int main(int argc,const char* argv[])
{
	uint8_t month = 0;
	printf("請輸入一個月份:");
	scanf("%hhu",&month);

	if(month < 1 || month > 12)
	{
		printf("輸入的月份有誤!\n");
		return 0;
	}

	switch(month)
	{
		case 2: printf("28天\n"); break;
		case 4: case 6:case 9:case 11: 
			printf("30天\n"); break;
		default: printf("31天\n"); break;
	}
}

for迴圈語句:
迴圈就是讓一段程式碼反覆執行,達到你想要的結果。
for一種比較靈活且危險(與其它迴圈相比)的一種迴圈。
一般使用一個變數來引導它的執行,這個變數就叫作迴圈變數。
for([1];[2];[3])
{
    [4];
}

1、給迴圈變數賦初值,C99標準才可以定義迴圈變數。
    此處定義的迴圈變數,只能for迴圈內使用。
2、判斷迴圈變數的是否到達邊界。
4、被反覆執行的程式碼,也叫迴圈體。
3、改變迴圈變數,防止變成死迴圈,一般對迴圈變數自加或自減。

大括號問題:
    1、建議上下對齊
    2、迴圈體如果只有一行程式碼,大括號可以省略
        但不利於擴充套件,一般商業程式碼要求大括號不能省略。

for迴圈的多種寫法:
for(;;)
{
    // 死迴圈
}

int i = 0;
for(;i<10; i++)
{

}

for(int i=0; i<10;)
{
    printf("----");
    i++;
}
while語句:
while(條件) // 當條件為真執行迴圈體,為假時結束
{
    // 迴圈體
}

while迴圈相當於for迴圈的精簡版本。
for迴圈負責解決明確知道迴圈次數的問題。
while負責解決只知道結束條件而不確定迴圈次數的問題。
do while語句:
do{
    迴圈體
}while(條件); 
先執行迴圈體,再判斷迴圈條件,該迴圈至少執行一次。
迴圈巢狀:
迴圈語句中包含迴圈語句。
外層迴圈執行一次,記憶體迴圈執行遍。

練習3:計算出所有的水仙花數。

#include <stdio.h>

int main(int argc,const char* argv[])
{
	for(int i=100; i<1000; i++)
	{
		int g = i%10;
		int s = i/10%10;
		int b = i/100;
		if(g*g*g+s*s*s+b*b*b == i)
		{
			printf("%d\n",i);
		}
	}
}

練習4:輸入一個正整數,判斷是否是素數。

#include <stdio.h>

int main(int argc,const char* argv[])
{
	int num = 0;
	printf("請輸入一個整數:");
	scanf("%d",&num);

	if(num < 2)
	{
		printf("輸入的資料有誤!\n");
		return 0;
	}

	int cnt = 0;
	for(int i=1; i<=num; i++)
	{
		if(0 == num%i)
		{
			cnt++;
		}
	}

	if(2 == cnt)
	{
		printf("是素數\n");
	}
	else
	{
		printf("不是素數\n");
	}
}

#include <stdio.h>

int main(int argc,const char* argv[])
{
	int num = 0;
	printf("請輸入一個整數:");
	scanf("%d",&num);

	if(num < 2)
	{
		printf("輸入的資料有誤!\n");
		return 0;
	}

	int i = 2;
	for(; i<num; i++)
	{
		if(0 == num%i)
		{
			printf("不是素數\n");
			return 0;
		}
	}
	printf("是素數!\n");

}

練習5:輸入一個整數,分解顯示。
-1234
-1 2 3 4

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(int argc,const char* argv[])
{
	int num = 0;
	printf("請輸入一個整數:");
	scanf("%d",&num);
	if(num < 0 )
	{
		printf("-");
		num = abs(num);
	}
	int copy = num , cnt = 0;

	while(copy)
	{
		copy /= 10;
		cnt++;
	}
	
	for(int i=cnt; i>0; i--)
	{
		printf("%.0lf ",num/pow(10,i-1));
		num = num % (int)pow(10,i-1);
	}
}

練習6:輸入一個正整數,判斷是否是迴文數。
1234
4321

#include <stdio.h>

int main(int argc,const char* argv[])
{
	int num = 0 , new = 0;
	printf("請輸入一個正整數:");
	scanf("%d",&num);
	if(num < 0)
	{
		printf("輸入的資料有誤\n");
		return 0;
	}

	int copy = num;
	while(copy)
	{
		new = (new*10)+(copy%10);
		copy /= 10;
	}
	
	printf("%d %d\n",num,new);
	if(num == new)
	{
		printf("是迴文數\n");
	}
	else
	{
		printf("不是迴文數\n");
	}
}

跳轉語句:
goto 可以在函式內任意跳轉。
它可能會破壞已經設計好的分支或迴圈語句,因此絕大多數公司禁止使用。
但它在驅動程式設計時特別適合處理異常。

標籤: // 位置
goto 標籤;

練習7:不使用迴圈計算前N項的斐波那切數列。
1 1 2 3 5 8 13 21 …

#include <stdio.h>

int main(int argc,const char* argv[])
{
	// 1 0 1 1 2 3
	int n = 0;
	printf("輸入n的值:");
	scanf("%d",&n);
	int f1 = 1 , f2 = 0 , t = 0;

loop:
	t = f1 + f2;
	f1 = f2;
	f2 = t;
	printf("%d ",t);
	if(--n) goto loop;
}

在這裡插入圖片描述


該系列持續更新
希望喜歡的小夥伴可以一鍵三連~~