程序的执行
解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行
编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂的语言——机器语言——写的程序,然后,这个机器语言写的程序就能直接执行了
C程序框架:#includeint main(int argc, char **argv) { return 0; }
辗转相除法:
#includeint main() { int u, v; scanf("%d%d", &u, &v); while (v != 0) { int temp = u % v; u = v; v = temp; } printf("%d", u); return 0; }
2.1.2变量定义
#include2.1.3变量赋值与初始化int main() { int price = 0; //定义了一个变量。变量名是price,类型是int,初值是0. //变量是一个保存数据的地方. //需要在程序中保存数据时,比如上面的例子要记录用户输入的价格,就需要一个变量来保存它. //用一个变量保存了数据,它才能参加后面的找零计算. //变量定义的一般形式: // <类型名称><变量名称>; // int price; // int amount; // int price,amount; //变量的名字: // 变量需要一个名字,变量的名字是一种“标识符”,意思是它是用来标识这个与那个的不同名字. printf("请输入金额(元):"); scanf("%d", &price); int change = 100 - price; printf("找您%d元。n", change); return 0; }
#include2.1.4变量输入int main() { int price = 0; //price = 0是一个式子,“= ”是一个赋值运算,表示将=右边的值赋给左边的变量. //赋值:在程序设计中,a=b表示要求计算机做一个动作:将b的值赋给a.关系是静态的, // 而动作是动态的.在数学中a=b等价于b=a,在程序设计中二者意思完全相反. //初始化:当赋值发生在定义变量时,就像 price = 0,就是变量的初始化.所有的变量 // 在第一次使用(出现在赋值运算符的右边)之前应该赋值一次. printf("请输入金额(元):"); scanf("%d", &price); //读整数 int change = 100 - price; printf("找您%d元。n", change); return 0; }
#include2.1.5常量与变量int main() { int price = 0; printf("请输入金额(元):"); scanf("%d", &price); //读整数:要求scanf这个函数读入下一个整数,读到的结果是赋值给变量price //小心price前面的& int change = 100 - price; printf("找您%d元. n", change); return 0; }
#includeint main() { //const int Amount = 100; //const是一个修饰符,加在int前面,用来给这个变量加上一个const(不变的)的属性。 //这个const的属性表示这个变量的值一旦初始化,就不能再修改了。 //用const了,Amount应该大写 int amount = 100; int price = 0; printf("请输入金额(元):"); scanf("%d", &price); //int change = 100 - price; //固定不变的数,是常数。直接写在程序里,称为直接量(literal) int change = amount - price; //更好的方式是,定义一个常量:const int AMOUNT = 100; printf("找您%d元。n", change); return 0; }
#include2.1.6浮点数int main() { int a; int b; printf("请输入两个整数:"); scanf("%d %d", &a, &b); printf("%d + %d = %dn", a, b, a + b); return 0; }
单位换算:
#include2.2.1表达式//两个整数运算结果只能是整数。10和10.0在C中是完全不同的数。10.0是浮点数。 //浮点数:带小数点的数值 //double:双精度浮点数 int main() { printf("请分别输入身高的英尺和英寸," "如输入"5 7"表示5英尺7英寸:"); double foot; double inch; scanf("%lf %lf", &foot, &inch); printf("身高是%f米. n", ((foot + inch / 12) * 0.3048)); return 0; }
#include
//一个表达式是一系列运算符(operator)和算子(operand)的组合,用来计算一个值
int main() {
int hour1, minuter1;
int hour2, minuter2;
scanf("%d %d", &hour1, &minuter1);
scanf("%d %d", &hour2, &minuter2);
int t1 = hour1 * 60 + minuter1;
int t2 = hour2 * 60 + minuter2;
int t = t2 - t1;
printf("时间差为 % d小时 % d分", t / 60, t % 60);
}
#include
//求两数平均值
int main() {
int a, b;
scanf("%d %d", &a, &b);
double c = (a + b) / 2.0;
ptintf("%d和%d的平均值 = %fn", a, b, c);
return 0;
}
法一:临时变量
法二:不用临时变量
2.2.4复合赋值与递增递减1.复合赋值
5个算术运算符, + -*/ % ,可以和赋值运算符“ = ”结合起来,形成复合赋值运算符:“ += ”、“ -= ”、“ *= ”、“ /= ”和“ %= ”
total += 5;
total = total + 5;
注意两个运算符中间不要有空格
代码:
#include
int main() {
int a = 10;
printf("++a = %dn", ++a);
printf("a = %dn", a);
printf("a++ = %dn", a++);
printf("a = %dn", a);
return 0;
}
输出:
++a = 11
a = 11
a++ = 11
a = 12
#include
int main() {
int hour 1, minute1;
int hour 2, minute2;
scanf("%d %d", &hour1, &minute1);
scanf("%d %d", &hour2, &minute2);
int ih = hour2 - hour1;
int im = minute2 - minute1;
if (im < 0) {
im = 60 + im;
ih--;
}
printf("时间差是%d小时%d分。n", ih, im);
return 0;
}
代码:
#includeint main(){ printf("%dn", 5 == 3); printf("%dn", 5 > 3); printf("%dn", 5 <= 3); return 0; }
输出:
0 1 0
所有的关系运算符的优先级比算术运算符的低,但是比赋值运算符高。
3.1.3 (if语句)找零计算器3.1.4 (else语句)找零计算器
#includeint main() { //初始化 int price = 0; int bill = 0; //读入金额和票面 printf("请输入金额:"); scanf("%d", &price); printf("请输入票面:"); scanf("%d", &bill); //计算找零 if (bill >= price) { printf("应该找您:%dn", bill - price); } else { printf("您的钱不够n"); } return 0; }
比较数的大小:
方式一:
#includeint main() { printf("请输入两个整数:"); scanf("%d %d", &a, &b); int max = 0; if (a > b) { max = a; } else { max = b; } printf("大的是%dn", max); return 0; }
方式二:
#include3.1.5 if语句再探int main() { int a, b; printf("请输入两个整数:"); scanf("%d %d", &a, &b); int max = b; if (a > b) { max = a; } printf("大的数是%dn", max); return 0; }
计算薪水:
#include//计算薪水 int main() { const double RATE = 8.25; //const是这个变量为常量 const int STANDARD = 40; double pay = 0.0; int hours; printf("请输入工作的小时数:"); scanf("%d", &hours); printf("n"); if (hours > STANDARD) pay = STANDARD * RATE + (hours - STANDARD) * (RATE * 1.5); else pay = hours * RATE; printf("应付工资:%fn", pay); return 0;
判断成绩:
#include3.2.1嵌套的if-else//判断成绩 int main() { const int PASS = 60; int score; pritnf("请输入成绩:"); scanf("%d", &score); printf("你输入的成绩是%d.n", score); if (score < PASS) printf("很遗憾,这个成绩没有及格。"); else () { printf("祝贺你,这个成绩及格了。"); printf("再见n"); } return 0; }
#include//找三个数中的最大值 int main() { int a, b, c; printf("请输入两个整数:"); scanf("%d %d %d", &a, &b, &c); int max = 0; if (a > b) { if (a > c) { max = a; } else { max = c; } } else { if (b > c) { max = b; } else { max = c; } } printf("最大的是%dn", max); return 0; }
C语言和C++中的万能头文件 #include
这个头文件包含以下等等C++中包含的所有头文件:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
等等……
3.2.2级联的if-else if#include3.2.3 分支:if-else的常见错误int main() { int x; scanf("%d", &x); int f = 0; if (x < 0) { f = -1; } else if (x == 0) { f = 0; } else if (x > 5) { f = 2 * x; } else { f = 3 * x; } printf("%dn", f); return 0; }
if语句常见的错误
· 忘了大括号
· if后面的分号
· 错误使用==和=
· 使人困惑的else
#includeint main() { //pritnf("请输入成绩(0~100)"); int grade; scanf("%d", &grade); grade /= 10; switch (grade) { case 10: case 9: printf("An"); break; case 8: printf("Bn"); break; case 7: printf("Cn"); break; case 6: printf("Dn"); break; default: printf("Fn"); break; } return 0; }
#includeint main() { printf("请输入月份:"); int mounth; scanf("%d", &mounth); switch (mounth) { case 1: printf("Januaryn"); break; case 2: printf("Februaryn"); break; case 3: printf("Marchn"); break; case 4: printf("Apriln"); break; case 5: printf("Mayn"); break; case 6: printf("Junen"); break; case 7: printf("Julyn"); break; case 8: printf("Augustn"); break; case 9: printf("Septempern"); break; case 10: printf("Octobern"); break; case 11: printf("Novembern"); break; case 12: printf("Decembern"); break; } return 0; }
在 VS2019 中使用 scanf 时总是提示 unsafe , 报出错误:
C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
解决办法是在已经建立的项目中,以后可能需要经常进行在不同的项目进行这项操作:
项目 → **属性 → c/c++ → 常规 → SDL检查 改为 否。
//C语言中的一个输入函数 scanf() 是从标准输入流stdio(键盘输入)中读内容的通用子程序,
//可以说明的格式读入多个字符,并保存在对应地址的变量中。scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。(end of file)
//C++标准输入流是 cin 。并搭配提取运算符">>"。cin>>a>>b;
4.1.1 循环#include//几位数 int main() { int x; int n = 0; scanf("%d", &x); n++; x /= 10; while (x > 0) { n++; x /= 10; } printf("%dn", n); return 0; }
4.1.2 while循环 4.1.3 循环:do-while循环
4.2.1循环计算 4.2.2猜数
代码:
#include#include #include int main() { srand(time(0)); int number = rand() % 100 + 1; int count = 0; int a = 0; printf("我想好一个1到100之间的数"); do { printf("请猜这个数"); scanf("%d", &a); count++; if (a > number) { printf("猜大了"); } else if (a < number) { printf("猜小了"); } } while (a != number); printf("你用了%d次猜到答案。n", count); return 0; }
#include
x % n 的结果是[0, n-1]的一个整数。
用正确的猜数方法最多7次可猜中。
4.2.4算平均数
代码:
#include4.2.4整数逆序int main() { int number; int sum = 0; int count = 0; scanf("%d", &number); while (number != -1) { sum += number; count++; scanf("%d", &number); } printf("%fn", 1.0 * sum / count); return 0; }
输入一个正整数,输出逆序的数
整数的分解
一个整数是由1至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算。
对一个整数做%10的操作,就得到它的个位数;对一个整数做/10的操作,就去掉了它的个位数;然后再对2的结果做%10,就得到原来数的十位数;
依此类推。
代码:
#includeint main() { int x; // scanf("%d", &x); x = 1326835; int digit; int ret = 0; while(x > 0) { digit = x % 10; // printf("%dn", digit); ret = ret * 10 + digit; printf("x = %d, digit = %d, ret = %dn", x, digit, ret); x /= 10; } printf("%d", ret); return 0; }
输出:
x = 1326835, digit = 5, ret = 5 x = 132683, digit = 3, ret = 53 x = 13268, digit = 8, ret = 538 x = 1326, digit = 6, ret = 5386 x = 132, digit = 2, ret = 53862 x = 13, digit = 3, ret = 538623 x = 1, digit = 1, ret = 5386231 5386231
代码:
#includeint main() { int x; // scanf("%d", &x); x = 700; int digit; int ret = 0; while(x > 0) { digit = x % 10; printf("%dn", digit); ret = ret * 10 + digit; //printf("x = %d, digit = %d, ret = %dn", x, digit, ret); x /= 10; } //printf("%d", ret); return 0; }
输出:
0 0 75.1.1for循环
#include//阶乘 int main() { int n; scanf("%d", &n); int fact = 1; for (int i = 1; i <= n; i++) { fact *= i; } printf("%d != %dn", n, fact); return 0; }
阶乘:从n乘到1
#include//阶乘 int main() { int n; scanf("%d", &n); int fact = 1; int i = 1; for (i = n; i > 1; i--) { fact *= i; } printf("%d != %dn", n, fact); return 0; }
5.1.2循环的计算和选择
5.2.1循环的控制
法一
#includeint main() { int x; scanf("%d", &x); int i; int isPrime = 1; for (i = 2; i < x; i++) { if (x % i == 0) { isPrime = 0; } } if (isPrime == 1) { printf("是素数n"); } else { printf("不是素数n"); } return 0; }
上面的代码中,设置一个了标志位 isPrime,令isPrime的初始值为1,当num可以被i整除时,不用跳出循环,只需要改变下标志位的值。最后依据标志位的值来判断
法二 判断素数的另一种写法:
#includeint main() { int x; scanf("%d", &x); int i; for (i = 2; i < x; i++) { if (x % i == 0) { break; } } if (i < x) { printf("不是素数n"); } else { printf("是素数n"); } return 0; }
break:跳出循环
continue:跳过循环这一轮剩下的语句进入下一轮
5.2.2嵌套循环输出1~100内素数
#include//1~100素数 int main() { int x; for (x = 1; x <= 100; x++) { int i; int isPrime = 1; for (i = 2; i < x; i++) { if (x % i == 0) { isPrime = 0; break; } } if (isPrime == 1) { printf("%d ", x); } } return 0; }
输出50个素数(Output 50 prime numbers):
Method 1
#include//输出前50个素数 int main(int argc, char** argv) { int x; x = 2; //x的初始值为第一个素数2 int count = 0; //计数器:计数50个素数 while (count < 50) { int i; int isPrime = 1; //x是素数 for (i = 2; i < x; i++) { if (x % i == 0) { isPrime = 0; break; } } if (isPrime == 1) { printf("%dn", x); count++; //是素数则自增1,循环50次则完成50个素数 } x++; //x从2开始自增 } return 0; }
输出50个素数(Output 50 prime numbers):
Method 2
#include5.2.3从嵌套循环中跳出//输出前50个素数 int main(int argc, char** argv) { int x; x = 2; //x的初始值为第一个素数2 int count = 0; //计数器:计数50个素数 //while (count < 50) { for(x = 2; count<50; x++){ //用for写判断语句就是关于count,而不是x,有些不和谐 int i; int isPrime = 1; //x是素数 for (i = 2; i < x; i++) { if (x % i == 0) { isPrime = 0; break; } } if (isPrime == 1) { printf("%dn", x); count++; //是素数则自增1,循环50次则完成50个素数 } //x++; //x从2开始自增,搭配while (count < 50) { } return 0; }
枚举:用1角,2角,5角凑出10元以内的整数
#includeint main() { int x; int one, two, five; int exit = 0; scanf("%d", &x); for (one = 1; one < x * 10; one++) { for (two = 1; two < x * 10 / 2; two++) { for (five = 1; five < x * 10 / 5; five++) { if (one + two * 2 + five * 5 == x * 10) { printf("可以用%d个1角加%d个2角加%d个5角得到%d元n", one, two, five, x); } } } } return 0; }
如何跳出循环:
5.3.1前n项求和
第一题:f(n) = 1 + 1/2 + 1/3 + 1/4 +…+ 1/n 。
[析]:起点的数字是1,终点的数字是n,都是明确的,所以用for循环最佳。
#includeint main() { int n; int i; double sum = 0.0; scanf("%d", &n); for (i = 1; i <= n; i++) { sum += 1.0 / i; } printf("f(%d)=%fn", n, sum); return 0; }
输出:
10 f(10)=0.645635
第二题:计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。
Method 1: 数学函数pow(x,n)
#include#include int main(int argc, char** argv){ int n, i; double sum = 0.0; scanf("%d", &n); for (i = 1; i <= n; i++) { sum += pow(-1, i + 1) / (3*i-2.0); } printf("f(%d) = %f", n, sum); return 0; }
Method 2:不用数学函数
#include5.3.2 循环应用:最大公约数int main(int argc, char** argv){ int n, i; double sum = 0.0; int sign = 1; //用于改变正负号 scanf("%d", &n); for (i = 1; i <= n; i++) { sum += sign * 1.0 / i; sign = -sign; //每循环一次改变一次正负号 } printf("f(%d) = %f", n, sum); return 0; }
greatest common divisor(gcd)
#includeint main(int argc, char** argv) { int a, b, temp; scanf("%d %d", &a, &b); while (b != 0) { temp = a % b; a = b; b = temp; printf("a=%d,b=%d,temp=%dn", a, b, temp); } printf("gcd = %d", a); return 0; }
5.3.2 循环应用:整数分解
正序分解整数:输入一个非负整数,正序输出每一位数字
输入:61432
输出:6 1 4 3 2
解决末尾空格:printf("%d ", d); 中%d后面的空格山删去 → printf("%d", d);
后面接上一段判断代码,在最后一轮循环不输出空格,最后一轮的情况为x是个位数,
若x >=10,x除以10(x /= 10)还会大于0(x > 0),
若x < 10,x除以10(x /= 10),则等于0:
if (x >= 10) { //或x > 9
printf("n");
}
#include5.3.3循环应用:求最大公约数int main() { int x; scanf("%d", &x); int mask = 1; int t = x; while (t > 9) { t /= 10; mask *= 10; } printf("x=%d, mask=%dn", x, mask); do { int d = x / mask; printf("%d", d); if (mask > 9) { printf(" "); } x %= mask; mask /= 10; } while (mask > 0); printf("n"); return 0; }
#include6.0.1练习4-0给定条件整数集//辗转相除 int main() { int a, b; int t; scanf("%d%d", &a, &b); while (b != 0) { t = a % b; a = b; b = t; } printf("gcd=%dn", a); return 0; }
代码:
#include6.0.2练习4-1水仙花数int main() { int a; scanf("%d", &a); int i, j, k; int cnt = 0; //计数器,题目每6个数换行 i = a; while (i <= a + 3) { j = a; while (j <= a + 3) { k = a; while (k <= a + 3) { //除去重复情况 if (i != j && i != k && j != k) { cnt++; printf("%d%d%d", i, j, k); if (cnt == 6) { //计数器,题目每6个数换行 printf("n"); cnt = 0; //重置计数器,记录下一轮循环 } else { printf(" "); //题目每个数隔开 } } k++; } j++; } i++; } return 0; }
代码:
#include6.0.3练习4-2九九乘法表int main() { int n; scanf("%d", &n); int first = 1; int i = 1; while (i < n) { first *= 10; i++; } printf("first=%dn", first); //遍历100-999 i = first; while (i < first*10) { int t = i;//临时变量t来记录i,防止分解i过程中被破坏 int sum = 0;//每位数n次幂之和 do { int d = t % 10; t /= 10; int p = d; int j = 1; while (j < n) { p *= d; j++; } sum += p; } while (t > 0); if (sum == i) { printf("%dn", i); } i++; } return 0; }
代码:
#include6.0.4练习4-3九九乘法表int main() { int n; n = 9; int i, j; i = 1; while (i <= n) { j = 1; while (j <= i) { printf("%d*%d=%d", j, i, i * j); if (i * j < 10) { printf(" ");//3个空格 } else { printf(" ");//2个空格 } j++; } printf("n"); i++; } return 0; }
代码:
#includeint main() { int m, n, i; int count = 0; int sum = 0; scanf("%d %d", &m, &n); if (m == 1) { m = 2; // 1 is not a prime, we can let m=2 and judge from 2 } for (i = m; i <= n; i++) { int isPrime = 1; int k; for (k = 2; k < i - 1; k++) { if (i % k == 0) { isPrime = 0; break; } } //judge whether "i" is prime if (isPrime) { count++; sum += i; } } printf("%d %dn", count, sum); return 0; }



