個人介紹:初學C語言的小白,熱愛編程的菜鳥,
人生,就要活得漂亮,走得鏗鏘,自己不奮斗,終歸是擺設,無論你是誰,寧可做拼搏的失敗者,也不要做安于現狀的平凡人,造船的目的不是停在港灣,而是沖擊風浪;做人的目的不是窩在家里,而是打造夢想,
文章目錄
- 編程實戰練習
- 1.計算n的階乘 (階乘計算)
- 2.計算1!+ 2!+ 3!+ …. + 10!(階乘計算求和)
- 3.在一個有序陣列中查找具體的某個數字n,(有序陣列查找數字)
- 4.撰寫代碼,演示多個字符從兩端移動,向中間匯聚,
- 5.撰寫代碼實作,模擬用戶登錄情景,并且只能登陸三次,
- 猜數字游戲
- goto陳述句
- 自動關機小游戲
編程實戰練習
1.計算n的階乘 (階乘計算)
#include<stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 0;
scanf("%d", &n);
//i = 1;//方法一:while陳述句結構
//ret = 1;
//while (i <= n)
//{
// ret *= i;
// i++;
//}
//方法二:for陳述句結構
//for (i = 1, ret = 1; i <= n; i++)
//{
// ret *= i;
//}
//方法三:do while陳述句結構
i = 1;
ret = 1;
do
{
ret *= i;
i++;
} while (i <= n);
printf("%d\n", ret);
return 0;
}

2.計算1!+ 2!+ 3!+ …. + 10!(階乘計算求和)
普通的方式:
int main()
{
int i = 0;
int n = 0;
int sum = 0;
//printf("請輸入一個數來計算其階乘:>>\n");
//scanf("%d", &n);
for (n = 1; n <= 3; n++)
{
int s = 1;
for (i = 1; i <= n; i++)
{
s = s * i;
}
sum = sum + s;
}
printf("前n項階乘之和為:%d\n", sum);
return 0;
}

這種方式雖然實作了階乘求和,但是效率并不高,每次求階乘都需要從1開始乘,
實際上n! = (n - 1!) * n; 例如3! = 2! * 3,按照這種思想我們優化以下原來的代碼,變成:
int main()
{
int i = 0;
int n = 0;
int s = 1;
int sum = 0;
//printf("請輸入一個數來計算其階乘:>>\n");
//scanf("%d", &n);
for (i = 1; i <= 3; i++)
{
s = s * i;
sum = sum + s;
}
printf("sum = %d\n", sum);
return 0;
}

3.在一個有序陣列中查找具體的某個數字n,(有序陣列查找數字)
普通的方式,遍歷陣列中所有的元素
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
if (arr[i] == k)
{
printf("找到了,下標為%d\n", i);
break;
}
}
if (i == sz)
printf("找不到\n");
return 0;
}

上面這種方式雖然可以查找某個數字,但是效率很低(效率為n),
實際上我們已經知道這是一個有序的陣列,那么我們就可以根據陣列的排序關系去做查找,
下面是利用二分查找法\折半查找法來查找,效率為log2n
#include<stdio.h>
//二分查找法查找特定數字
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left <= right)//left小于=right代表中間還有元素可查找
{
int mid = (left + right) / 2;//找到中間元素
if (arr[mid] > k)//中間元素與被查找變數的比較
right = mid - 1;
else if (arr[mid] < k)
left = mid + 1;
else
{
printf("找到了,下標是:%d\n", mid);
break;//找到后要退出回圈體
}
}
if (left > right)//需要進行判斷,因為來到這一步的也有可能是通過break來的,不一定是執行完回圈才到這里的
printf("找不到了\n");
return 0;
}

4.撰寫代碼,演示多個字符從兩端移動,向中間匯聚,
首先我們要明白題目的含義,知道是什么意思,
比如說:類似于這種效果

這里有兩串字符,所以我們可以定義兩個字符陣列去存盤他們
我們可以將 上方這個陣列的元素移動到下面陣列中,然后列印下方陣列


代碼展示:
#include<stdio.h>
#include<string.h>
//welcome to c_code!!!!!!
//#######################
//w#####################!
//we###################!!
//wel#################!!!
//.......
//welcome to c_code!!!!!!
int main()
{
char arr1[] = "welcome to c_code!!!!!!";
char arr2[] = "#######################";
int left = 0;
/*int right = sizeof(arr1) / sizeof(arr1[0]) - 1;*///這種是錯誤的,arr1最后一個字符是字串結束標志\0
/*int right = sizeof(arr1) / sizeof(arr1[0]) - 2;*///-2是正確的,但是我們不推薦這種方式,容易出錯
int right = strlen(arr1) - 1;//strlen計算字串長度是不會將\0計算進去
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
left++;
right--;
}
return 0;
}
結果展示:

我們發現這個結果以下就列印出來了,感受不到其中的變化,所以希望每列印一次,就能停頓一小段時間
利用Sleep()函式 頭檔案Windows.h
Sleep(1000) 休息 1000ms = 1s


運行程式,就能查看其中的變化
除了讓程式每次列印停頓一定的時間外,我們還能對齊進行另一步改造,比如清空螢屏
system()函式 頭檔案為 stdlib.h
system(“cls”) 執行系統命令的一個函式 cls-- - 清空螢屏
5.撰寫代碼實作,模擬用戶登錄情景,并且只能登陸三次,
(只允許輸入三次密碼,如果密碼正確則提示登陸成功,如果三次均輸入錯誤,則退出程式)
易錯點:使用 == 直接比較字串是否相等
解決方式 :利用庫函式strcmp比較字串是否相等 如果兩個字串相等
strcmp(arr1,arr2) 回傳值為0,只需要判斷strcmp回傳值是否為0就可以判斷字串是否相等
#include<stdio.h>
#include<string.h>
int main()
{
char password[20];
int i = 0;
for (i = 0; i < 3; i++)
{
printf("Please input your password:>>\n");
scanf("%s", password);
/*if (password == "123456")*///不能直接用==來比較兩個字串是否相等
if (strcmp(password, "123456") == 0)
{
printf("password is right,good luck to you!");
break;
}
}
if (i == 3)
printf("you idiot,put the wrong password three times,don't have another chance!");
return 0;
}
結果展示:


為了提升用戶互動體驗,我們可以在密碼輸入錯誤的時候給個提示:


strcmp字串比較決議
char string1[] = “abcdef”;
char string2[] = “abccqqqqqq”
strcmp(string1, string2)
使用strcmp在比較string1和string2的時候,從左到右依次比較每個字符,string1與string2前三個字符"abc"相同,string1的第四個字符為d string2第四個字符為c,d的ASCII碼大于c的ASCII碼,所以strcmp會判斷string1 > string2 回傳一個大于0的值,
猜數字游戲
要求:
1)電腦會生成一個亂數
2)猜數字
猜數字游戲思路:
1、進入游戲后先列印選單欄
提示是否進行猜數字游戲 (1為是,0為否)
2、首先要至少玩一次游戲,使用do while陳述句 只要不退出游戲就一直進行
3、使用switch陳述句對輸入內容進行判斷
1 玩游戲 呼叫game函式進行猜數字游戲
0 列印 退出游戲
其它 列印 選擇錯誤
選單欄實作 menu函式
猜數字實作 先要生成一個亂數 比如1 - 200
1.先生成一個亂數 rand()
2.rand()是偽隨機,在使用之前要呼叫srand
3.為了讓srand生成一個隨機值,使用電腦時時刻刻都在變動的時間-- - 時間戳
srand((unsigned int)time(NULL)) //強制型別轉換
4.為了產生1 - 200之間的亂數 我們讓rand去模上200 + 1
5.猜數字具體操作
(1)先提示輸入數字
(2)判斷輸入數字和亂數之間的大小關系并給予提示
(3)猜對了之后退出本回合猜數字游戲
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***************************\n");
printf("**** 1.play 0.exit ****\n");
printf("***************************\n");
}
//RAND_MAX
void game()//猜數字函式
{
int guess = 0;
int ret = 0;
//拿時間戳來設定亂數的起點 time_t time( time_t *timer ); time_t long型別
//需要一個變化的數字,電腦上的時間是變化的
//1.生成亂數
ret = rand() % 100 + 1;//設定生成1-100之間的亂數
//printf("%d\n",ret);
//2.猜數字
//printf("猜數字\n");
while (1)
{
printf("請猜數字:>>\n");
scanf("%d", &guess);
if (guess > ret)
printf("猜大了\n");
else if (guess < ret)
printf("猜小了\n");
else
{
printf("你真棒!猜對了!\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do//游戲至少進行一次,可以進行多次,選擇do...while陳述句
{
menu();
printf("請選擇:>>\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}
結果展示:

goto陳述句
goto陳述句作用:跳轉到特點陳述句位置
goto陳述句應用
自動關機小游戲
提示:
系統設定:shutdown - s - t 60 設定電腦在60s后自動關機
system(“shutdown -s -t 60”) //system( )函式頭檔案為 stdlib.h
#include<stdio.h>
//設定電腦2分鐘后自動關機,如果輸入“我是豬”就取消關機
int main()
{
char input[20];
//shutdown -s -t 120 設定在120s后關機
system("shutdown -s -t 120");
again:
printf("電腦將在兩分鐘后自動關機,如果輸入“我是豬”將取消關機\n請輸入:>>\n");
scanf("%s", input);
if (strcmp(input, "我是豬") == 0)
{
printf("成功取消關機\n");
system("shutdown -a");
}
else
{
printf("輸入錯誤,請重新輸入\n");
goto again;
}
return 0;
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277427.html
標籤:其他
下一篇:線段樹模板
