栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言基础

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言基础

程序的执行

解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行

编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂的语言——机器语言——写的程序,然后,这个机器语言写的程序就能直接执行了

C程序框架:
#include 

int main(int argc, char **argv) {

	return 0;
}

 辗转相除法:

#include
int 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变量定义
#include 

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;
 } 
2.1.3变量赋值与初始化 
#include  

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; 
} 
2.1.4变量输入 
#include 

int main()
{
	int price = 0;
	
	printf("请输入金额(元):");
	scanf("%d", &price);  //读整数:要求scanf这个函数读入下一个整数,读到的结果是赋值给变量price 
	                      //小心price前面的& 
	
	int change = 100 - price;
	
	printf("找您%d元. n", change);
	
	return 0;
 } 
 2.1.5常量与变量

#include 

int 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;
}
#include 

int main() {
	int a;
	int b;

	printf("请输入两个整数:");
	scanf("%d %d", &a, &b);
	printf("%d + %d = %dn", a, b, a + b);

	return 0;
}
2.1.6浮点数

单位换算:

#include

//两个整数运算结果只能是整数。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;
}
2.2.1表达式

#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);
}

2.2.2运算符优先级

 #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.3交换变量

法一:临时变量

法二:不用临时变量 

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

3.1.1做判断

#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;
}

3.1.2判断条件

代码:

#include 

int 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语句)找零计算器
#include 

int 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;
}

比较数的大小:

方式一:

#include 

int main() {
	printf("请输入两个整数:");
	scanf("%d %d", &a, &b);
	
	int max = 0;
	if (a > b) {
		max = a;
	} else {
		max = b;
	}
	printf("大的是%dn", max);

	return 0;
}

方式二:

#include 

int main() {
    int a, b;

    printf("请输入两个整数:");
    scanf("%d %d", &a, &b);

    int max = b;
    if (a > b) {
        max = a;
}

printf("大的数是%dn", max);
return 0;
}
3.1.5 if语句再探

计算薪水:

#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;

 判断成绩:

#include 
//判断成绩
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;
}

3.2.1嵌套的if-else
#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  
#include  
#include  

等等……

 3.2.2级联的if-else  if
#include

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;
}

 3.2.3 分支:if-else的常见错误

if语句常见的错误
· 忘了大括号
· if后面的分号
· 错误使用==和=
· 使人困惑的else

 3.2.4 分支:多路分支

 

 

 

#include

int 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;
}
#include

int 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  #include  搭配 srand(time(0));和rand()

x % n 的结果是[0, n-1]的一个整数。

用正确的猜数方法最多7次可猜中。

4.2.4算平均数

 

 代码:

#include

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;
}
4.2.4整数逆序

输入一个正整数,输出逆序的数

整数的分解
一个整数是由1至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算。
对一个整数做%10的操作,就得到它的个位数;对一个整数做/10的操作,就去掉了它的个位数;然后再对2的结果做%10,就得到原来数的十位数;
依此类推。

代码: 

#include

int 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

代码:

#include

int 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
7
5.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循环的控制

法一

#include

int 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整除时,不用跳出循环,只需要改变下标志位的值。最后依据标志位的值来判断

法二 判断素数的另一种写法:

#include

int 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

#include
//输出前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;
}

5.2.3从嵌套循环中跳出

枚举:用1角,2角,5角凑出10元以内的整数

#include 

int 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循环最佳。

#include

int 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:不用数学函数

#include

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;
}
5.3.2 循环应用:最大公约数

greatest common divisor(gcd)


#include

int 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");
}

#include
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;
}
5.3.3循环应用:求最大公约数
#include
//辗转相除
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;
}
6.0.1练习4-0给定条件整数集

 代码:

#include
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;
}
6.0.2练习4-1水仙花数

 代码:

#include

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;
}
6.0.3练习4-2九九乘法表

 

代码: 

#include
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;
}
6.0.4练习4-3九九乘法表

代码:

#include

int 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;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/396294.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号