一、【基本知識儲備】
進制
1、什么叫n進制
逢n進一
2、把r 進制轉成十進制
3、十進制轉成r進制
除r取余法 (逆序)
4、不同進制所代表的數值之間的關系
十進制的3981 轉化成 十六進制 是 F8D
十進制的3981和十六進制 的F8D本質上是同一個數字
附錄一些瑣碎的運算子
自增 自減 三目運算子 逗號運算式
自增或自減
分類:
前自增 ++i
后自增 i++
異同:
相同:
最終都使i的值加1
不同:
前自增整體運算式的值是i+1之后的值
后自增整體運算式的值是i+1之前的值
二、思維導圖

流程圖網址:流程圖網址
三、課程相關代碼及知識點
1、continue 的一個特例
#include <stdio.h>
int main(void)
{
int i;
char ch;
scanf("%d", &i);
printf("i = %d\n",i);
//.......
while((ch=getchar()) !='\n')// 獲取字串,如果輸入的不是換行符,則執行continue
continue;
int j;
scanf("%d", &j);
printf("j = %d\n",j);
return 0;
}
2、三目運算子
/*
2020年11月9日22:35:25
附錄一個小的知識點
三目運算子:
A ? B : C
等價于
if (A)
B;
else
C;
*/
#include <stdio.h>
int main(void)
{
int i;
i = (3>2 ? 5 : 1);
printf("%d\n", i);
return 0;
}
3、進制轉換
#include <stdio.h>
int main(void)
{
int i=0x32c;
printf("i = %d\n", i);//%d 表示以十進制輸出
printf("i = %o\n", i);//%o表示以八進制輸出
printf("i = %x\n", i);//%x或者%X表示以十六進制輸出
/*
printf 的用法
%d 表示以十進制輸出
%x或者%X表示以十六進制輸出
%o表示以八進制輸出
*/
return 0;
4、逗號運算式
/*
2020年11月9日22:39:50
逗號運算式
(A,B,C,D)
功能:
從左到右執行
最終運算式的值是最后一項的值
*/
#include <stdio.h>
int main(void)
{
int i;
int j = 2;
i = (j++, ++j, j+2, j-3);
/* 1號 2號 3號 4號
注意:此處結果是1不是3
理由如下:
在依次執行時:
四個值分別為3 4 6 1
1號和2號比較容易理解
3號和4號需要注意:
雖然3號整體為6,但3號對應的j依然是4,j的值沒有改變
所以在執行4號陳述句時,j-3 實際上是4 - 3 ,
故最后輸出為 1
*/
printf("i = %d\n", i);
return 0;
}
5、斐波拉契數列的計算方法
#include <stdio.h>
int main(void)
{
int i, n;
int f1, f2, f3;
f1 = 1;
f2 = 2;
printf("請輸入你想求的序列:");
scanf("%d", &n);
if (1 == n)
{
f3 = 1;
}
else if (2 == n)
{
f3 = 2;
}
else
{
for (i=3; i<=n; ++i)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
}
printf("%d\n", f3);
return 0;
}
6、前自增與后自增的區別
/*
2020年11月9日22:07:17
前自增和后自增
*/
#include<stdio.h>
int main(void)
{
int i;
int j;
int k;
int m;
i = j = 3;//等價于 i = 3 ; j = 3;
k = i++;
m = ++j;
printf("i = %d, j = %d, k = %d, m =%d\n ", i ,j, k, m );
return 0;
}
/*
在VC++6.0中的輸出結果是:
i = 4, j = 4, k = 3, m =4
總結:
前自增整體運算式的值是i+1 之后的值
后自增整體運算式的值是i+i 之前的值
但經過這次運算之后, i 和 j 都分別在自己的基礎上加了 1
__________________________________________________
為什么會出現自增:
代碼更精煉
自增的速度更快
學習自增要明白的幾個問題:
1、在編程時應該盡量屏蔽前自增和后自增的差別
2、自增運算式最好不要作為一個更大的運算式的一部分來使用
或者說:i++和++i單獨成一個陳述句,不要把它作為一個完整的復合句的一部分來使用
eg:
int m = i++ + ++i + i + i++;//這樣寫不但是不規范的代碼,而且是不可移植的代碼
printf("%d %d %d" ,i++ ,++i, i);//同上
__________________________________________________
*/
7、回圈陳述句_1
1到100的和
/*
2020年11月8日18:04
1+2+3+4+.....+100
*/
#include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i = 1; i<=10; ++i)
sum = sum + i;
printf("sum = %d\n", sum);
return 0;
}
7、回圈陳述句_2
求1-100 的所有奇數之和
/*
2020年11月8日20:50:39
求1到100之間的所有的奇數之和
*/
#include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i=1; i<100; i+=2)// i+=2;等價于 i = i + 2;
{
sum = sum + i;
}
printf("sum = %d\n", sum);
return 0;
}
7_3
/*
2020年11月8日22:31:19
1 + 1/2 + 1/3 + ....+ 1/100
*/
#include <stdio.h>
int main(void)
{
int i=1;
float sum = 0;
for (i = 1; i<=100 ; ++i)
{
sum = sum + (float)1/i;//正確
//sum = sum + (float)(1/i);錯誤,輸出為1.000000
//sum = sum + 1/(float)(i);正確
//更簡單的寫法:sum = sum + 1.0/i;
}
printf("sum = %f\n" , sum);//float 必須用%f輸出
return 0;
}
7_4
/*
2020年11月8日23:31:44
注意 本程式有問題(雖然運行結果正確)
1 + 1/2 + 1/3 + ....+ 1/100
浮點數的存盤:
整數是以補碼的形式轉化為二進制代碼存盤在計算機中的
實數是以IEEE754標準轉化為二進制代碼存盤在計算機中的
浮點數的存盤所帶來的問題
float 和double 都不能保證可以精確的存盤一個小數
舉例:
有一個浮點型變數x,如何判斷x的值是否為0
if (0 == x)
是
else
不是
注意,上述寫法存在問題,
因為在計算機存盤的時候,并不是存了一個數字0,而是以編碼的形式存了個近似解
更準確的寫法為:
if (|x-0.000001| <= 0.000001)
是
else
不是
為什么回圈中更新的變數不能定義成浮點型
因為浮點型是 非準確存盤
*/
#include <stdio.h>
int main(void)
{
float i=1;// 正確寫法 int i=1;
float sum = 0;
for (i = 1; i<=100 ; ++i)
{
sum = sum + 1.0/i;//推薦
//sum = sum + (float)1/i;//正確
//sum = sum + (float)(1/i);錯誤,輸出為1.000000
//sum = sum + 1/(float)(i);正確
}
printf("sum = %f\n" , sum);//float 必須用%f輸出
return 0;
}
7_5
/*
2020年11月8日20:56:17
求1到100之間所有的能被3整除的數字之和
*/
#include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i=3; i<=100; ++i)
{
if (i%3 == 0)
sum = sum + i;
}
printf("sum = %d\n", sum);
return 0;
}
7_6
/*
2020年11月8日21:30:27
求1到100之間奇數之和
求1到100之間的奇數的個數
求1到100之間的奇數的平均值
求1到100之間的偶數之和
*/
#include <stdio.h>
int main(void)
{
int i, mean, cnt=0, sum_odd = 0,sum_even = 0;//個數一般用cnt表示
for (i=1; i<=100; ++i)
{
if (i%2 == 0)
sum_even = sum_even + i;// sum_even += i;
else
{ sum_odd = sum_odd + i;
cnt +=1;
}
}
mean = sum_odd / cnt;
printf("sum_odd = %d sum_even = %d mean = %d cnt =%d\n",sum_odd, sum_even, mean, cnt);
return 0;
}
7_7
continue 的用法 偽代碼
# include <stdio.h>
int main (void)
{
int
for (1 ; 2 ; 3 )
{
A;
B;
continue;//如果執行該陳述句,則執行完該陳述句后會執行陳述句3,C和D都會被跳過去,不會被執行
C;
D;
}
return 0;
}
7_8
#include <stdio.h>
int main(void)
{
int i, n;
int f1, f2, f3;
f1 = 1;
f2 = 2;
printf("請輸入你想求的序列:");
scanf("%d", &n);
if (1 == n)
{
f3 = 1;
}
else if (2 == n)
{
f3 = 2;
}
else
{
for (i=3; i<=n; ++i)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
}
printf("%d\n", f3);
return 0;
}
7_9
/*
2020年11月30日09:50:02
一元二次方程用do while實作
*/
#include <stdio.h>
#include <math.h>
int main(void)
{
double a, b, c;
double delta;
double x1, x2;
char ch;
do
{
printf("請輸入一元二次方程的三個系數:\n");
printf("a = ");
scanf("%lf", &a);
printf("b = ");
scanf("%lf",&b);
printf("c = ");
scanf("%lf", &c);
delta = b*b - 4*a*c;
if (delta > 0)
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("有兩個解,x1 = %f, x2 = %lf\n",x1,x2);
}
else if (0 == delta)
{
x1 = x2 = (-b) / (2*a);
printf("有唯一解,x1 = x2 = %lf\n", x1, x2);
}
else
{
printf("無實數解!\n");
}
printf("您想繼續嗎(Y/N):");
scanf(" %c", &ch);//%c前面必須加一個空格,原因較復雜,涉及空白符的問題
}while ('y'==ch || 'Y'==ch);
return 0;
}
8、判斷陳述句
#include<stdio.h>
/*
一個;一個陳述句
if 的范圍問題
*/
int main(void)
{
if (4 > 2)
{
printf("AAAAA\n");
printf("BBBBB\n");
}
printf("CCCCC\n");
return 0;
}
/*
在VS C++中的輸出結果是:
----------------------------
AAAAA
BBBBB
CCCCC
----------------------------
總結:
1、 if (運算式)
陳述句A;
陳述句B;
解釋:if 默認只能控制陳述句A的執行或不執行
if 無法控制陳述句 B的執行或不執行
2、 if (運算式)
{
陳述句A;
陳述句B;
}
此時 if 可以控制陳述句 A或者陳述句B
由此可見:if 默認只能控制一個陳述句的執行或不執行
如果想控制多個陳述句的執行或不執行
就必須把這些陳述句用{}括起來
*/
8.1、判斷輸入資料的大小
#include <stdio.h>
int main(void)
{
int i, j ;
scanf("%d %d", &i ,&j);
if (i > j)
printf("i大于j\n");
else
printf("i小于j\n");
return 0;
}
8.2
#include <stdio.h>
int main(void)
{
if (3 > 2)
printf("AAAAA\n");
else
printf("BBBBB\n");
printf("CCCCC\n");
return 0;
}
/*
if
else
為一個陳述句;
CCCCC為一個陳述句;
本代碼只有兩個陳述句;
*/
8.3、考試成績
#include <stdio.h>
int main(void)
{
float score;
printf("請輸入您的考試成績:");
scanf("%f", &score);
if (score > 100)
printf("這是做夢!\n");
else if (score >= 90 && score <= 100 )
printf("優秀\n");
else if (score >= 80 && score < 90 )
printf("良好\n");
else if (score >=60 && score < 80)
printf("及格\n");
else
printf("不及格\n");
return 0;
}
8.4 互換數字、核心是寄存
//互換數字——核心是寄存
#include <stdio.h>
int main(void)
{
int i=3;
int j=4;
int t;
t=i;
i=j;
j=t; // 定義臨時變數
printf("i = %d, j = %d\n", i, t);
return 0;
}
8.5、三個數字的排序
//三個數字的排序
#include<stdio.h>
int main(void)
{
int a, b, c ; //等價于 int a; int b; int c;
int t; //定義一個臨時變數
printf ("請輸入三個整數(中間用空格隔開):");
scanf("%d %d %d" , &a, &b, &c);
if (a < b)
{
t = a;
a = b;
b = t;
}
if (a < c)
{
t = a;
a = c;
c = t;
}
if (b < c)
{
t = b;
b = c;
c = t;
}
printf("%d %d %d\n", a, b, c);
return 0 ;
}
8.6、最簡單的判斷
#include <stdio.h>
int main(void)
{
if (3 > 2)
printf("AAAA\n");
return 0;
}
8.7、注意的點:0為假,非0為真
#include<stdio.h>
int main(void)
{
/*
0為假
非0為真
格式:
if (運算式)
陳述句
功能:
如果運算式為真,則執行陳述句
如果運算式為假,陳述句不執行
*/
if (3)
printf("AAAAA\n"); // 會輸出AAAAA
if (0)
printf("BBBBB\n"); // 不會輸出BBBBB
if (0 == 0)
printf("CCCCC\n"); //會輸出CCCCC
return 0;
}
8.8、if陳述句的范圍問題
#include<stdio.h>
/*
一個;一個陳述句
if 的范圍問題
*/
int main(void)
{
if (4 > 2)
printf("AAAAA\n");
printf("BBBBB\n");
return 0;
}
/*
在VS C++中的輸出結果是:
----------------------------
BBBBB
----------------------------
總結:
1、 if (運算式)
陳述句A;
陳述句B;
解釋:if 默認只能控制陳述句A的執行或不執行
if 無法控制陳述句 B的執行或不執行
2、 if (運算式)
{
陳述句A;
陳述句B;
}
此時 if 可以控制陳述句 A或者陳述句B
由此可見:if 默認只能控制一個陳述句的執行或不執行
如果想控制多個陳述句的執行或不執行
就必須把這些陳述句用{}括起來
*/
9、switch的用法
/*
switch 的用法
如本例所示:
case 1 2 3 ,是程式的入口,一旦找到
該入口,則相當于代碼中沒有了case 1 2 3 部分,
執行代碼時按從上往下的順序依次執行
所以如果沒有break 的話,(如位置1的break)被注釋
則當輸入為1時
輸出則為:
1層開!
2層開!
*/
#include <stdio.h>
int main(void)
{
int val;
printf("請輸入您要進入的樓層:");
scanf("%d", &val);
switch (val)
{
case 1:
printf("1層開!\n");
break;//位置1
case 2:
printf("2層開!\n");
break;
case 3:
printf("3層開!\n");
break;
default:
printf("沒有蓋到這一層\n");
break;
}
return 0;
}
小結:一直在忙別的事,終于學完了流程控制部分,后續刷刷書上的練習題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229169.html
標籤:其他
上一篇:本人香樟精英經驗分享會部分經驗
