首页 > 系统相关 >C语言学习进程(翁恺)

C语言学习进程(翁恺)

时间:2022-08-29 09:14:21浏览次数:60  
标签:10 return int scanf C语言 运算符 printf 进程 翁恺

1.0——C的基本结构及语句

1.1——循环(loop)

1.2—— 多路分支 switch-case

1.3——break & continue

1.4——practice 1

 

 

C的框架

# include <stdio.h>
int main ()
{
	
	return 0;
 } 

  变量定义

标识符:字母,数字,下划线(例如:price)

初始化 

常量 const int AMOUNT = 100;

 数据类型

两个整数的运算只能是整数

浮点数 double 输入%lf 输出%f

整数计算没有误差

 表达式

运算符 + - =

算子 5 a i

运算符存在优先级

复合赋值

关系运算结果成立则为1,否则为0

关系运算符

==	相等

!=	不相等

>	大于

>=	大于或等于

<	小于

<=	小于或等于

注意其中有两个字符的运算符:==、>=和<=的两个字符必须紧紧连在一起,中间不能插入空格。

关系运算存在优先级:判断是否相等的 == 和 != 的优先级更低

运算关系:从左到右

关系运算结果成立则为1,否则为0
example:printf(" %d", 7 >= 3+4);

total += sum == total + sum

a++ == a + 1

a++作为表达式结果为a

++a 作为表达式结果为a+1

 套路

交换变量

 判断

if ( ){
      
}else {
    
}


if (score < 60 ) 
    printf(" not pass);
else 
    printf(" pass ");
           

 注释(comment)

// 初始化
int price = 0;

/* 42 */

  循环(loop)

循环体内要有打破循环的条件

while ( ){
    ;
     ;       
}
判断,再执行
do
{
    <循环体语句>
    }while( );
for 念做 对于
( ; ; )for 中的可以省略

for ( <初始条件> ; <循环继续条件> ; <每轮动作> ){

}

 

逻辑运算

自左向右,如果左边的结果可以决定结果了, 就不会做右边的计算 

结果是0 或 1

运算符       例
!            !a
&&           a && b
||           a || b 

   

优先级

单目 > 双目

关系 > 逻辑 > 条件 > 赋值

 

条件运算方向:自右向左

逗号运算for (i=0 ,j=10 ;i<j ;i++,j-- )

 

if 再探

if (){
}else if ()
{
}else if ()
{
}else {
}

 

多路分支 switch-case

switch ( type ){
    case 1:
        printf("hello\n");
        break;
    case 2:
        
        break;
    default:
        
        break;
}

  


循环

break & continue

break可跳出所在那层循环,而continue则结束这一次循环

//	判断素数 
	int x = 0;
	int i = 2;
	int isPrime = 1; 
	
	scanf("%d", &x );
	
	for ( i=2 ; i<x ; i++ )
	{
		if (x % i == 0 ){
			isPrime = 0;
			break;
		}
	}
	if (isPrime == 1){
		printf ("是素数");
	}else{
		printf("不是素数"); 
	}
	
	return 0;

 跳出嵌套循环

goto

//	如何用1角、2角和5角的硬币凑出10元以下的金额 
	int x = 0;
	int one , two , five = 0;
	
	scanf ("%d",&x);
	
	for ( one = 0 ; one <x*10 ; one++){
		for ( two = 0 ; two <x*10/2 ; two++){
			for ( five = 0 ; five <x*10/5 ; five++){
				if (1*one + 2*two + 5*five == x*10 ){
					printf("%d个一角和%d个两角和%d个五角可以合成%d元\n",one ,two , five , x);
					goto out;
				}
			}
		}
	}
	out :
	return 0;

接力break

//	如何用1角、2角和5角的硬币凑出10元以下的金额 
	int x = 0;
	int one , two , five = 0;
	int exit = 0;
	
	scanf ("%d",&x);
	
	for ( one = 0 ; one <x*10 ; one++){
		for ( two = 0 ; two <x*10/2 ; two++){
			for ( five = 0 ; five <x*10/5 ; five++){
				if (1*one + 2*two + 5*five == x*10 ){
					printf("%d个一角和%d个两角和%d个五角可以合成%d元\n",one ,two , five , x);
					exit = 1;
					break;
				}
			}
		if (exit == 1) break;
		}
	if (exit == 1) break;
	}

	return 0;

 


practice 1

素数判断
 	int x = 0;
	int i = 2;
	int isPrime = 1; 
	
	scanf("%d", &x );
	
	for ( i=2 ; i<x ; i++ )
	{
		if (x % i == 0 ){
			isPrime = 0;
			break;
		}
	}
	if (isPrime == 1){
		printf ("是素数");
	}else{
		printf("不是素数"); 
	}
	
	return 0;
//	整数的正分解
	int x = 0;
	int mask = 1;
	int t = 0;
	
	scanf ("%d", &x);
	t = x;
	while ( t>9 ){
		t /= 10;
		mask *= 10;
	}

	do{
		printf ("%d", x/mask);
		if ( mask>9 ){
			printf(" ");
		}
		x %= mask;
		mask /= 10;
	}while( mask>0 );
	
	return 0;
//	给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数 
	int x = 0;
	int i,j,k;
	int cnt = 0;
	
	scanf("%d",&x);
		
	for ( i=x ; i<=x+3 ; i++ ){
		for ( j=x ; j<=x+3 ; j++){
			for ( k=x ; k<=x+3 ; k++){
				if (i!=j && j!=k && i!=k){
					printf("%d%d%d",i,j,k);
					cnt++;
					if (cnt == 6){
						printf("\n");
						cnt = 0;						
					}else{
						printf(" ");
					}
				}
				
			}
		}
	}
	
	return 0;
水仙花数
//	水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153),
	int n = 3;
	scanf ("%d",&n);
	int mask = 1;
	int t = n;
	while(t>1){
		t--;
		mask *= 10;
	}
//	printf("%d",mask);
	int i = mask;
	for (i ;i<mask*10;i++){
//		先令t=i,d=mask
//		再分解t,求幂
//		求和 
		t=i;
		int d=mask;
		int sum = 0;
		while(t>0){
			int p = t/d;
			int j = 1;
			int k = p;
			while (j<n){
				k *= p;
				j++;
			}
			sum += k;
			t = t%d;
			d /=10;
		}
		if (sum == i){
			printf ("%d\n",i);
		}
	}
			
	return 0;
九九乘法表
 	int i,j = 1;
//	记每行为i*j,第一行j=1,第二行j=2
//	而每一行i递增到j 
	for (j=1;j<10;j++){
	
		for (i=1;i<=j ;i++){
			printf ("%d*%d=%d",i,j,i*j);
			if (i*j<10){
				printf ("   ");				
			}else {
				printf ("  ");
			}
		}
		printf("\n");
	}
	
	return 0;
统计素数并求和
 //	遍历m~n的数
//	判断素数,cnt ++
//	printf
//	sum 
	
	int m,n = 0;
	scanf ("%d %d",&m,&n);
	int i = 1;
	int cnt = 0;
	int sum = 0;
//	m = 10;n = 31;
	
	if (m ==1){
		m = 2;
	} //考虑 m=1 的特殊情况 
	
	for ( i=m ; i<=n ; i++ ){
		int j = 1;
		int isPrime = 1;
		for ( j=2 ; j<i ; j++){
			if ( i%j == 0){
				isPrime = 0;
				break;
			}
			
		}
		if ( isPrime == 1){
			cnt ++;
			sum += i;
//			printf("%d\n",i);
		}
	}
	printf ("%d %d",cnt,sum);
	
	return 0;
猜数游戏(mine)
 //	统计cnt,scanf n
//	for 循环 n 次,猜中就break
//	判断正负,if

	int x=12,n=2;
	scanf ("%d %d",&x,&n);
	int cnt = 0;
	int a = 0;
	do{
		scanf ("%d",&a);
		cnt ++;
		if ( a<0 ) {
			cnt = n+1;
			break;
		}
		
		if ( a == x ){
			break;
		}else if ( a>x){
			printf ("Too big\n");			
		}else {
			printf ("Too small\n");
		}
	}while ( a!=x && cnt <n );
	
	if ( cnt == 1){
		printf ("Bingo!\n");
	}else if ( cnt<=3 ){
		printf ("Lucky You!\n");
	}else if ( cnt<=n ){
		printf ("Good Guess!");
	}else {
		printf ("Game Over");
	}
	
//	printf ("%d\n",cnt);

 


数据类型

C语言的类型
整数; char ;short ;int ; long ;long long
逻辑: bool
浮点数;float ; double ; long double
指针
                                //个人认为还有 字符

类型名称:int ,long ,double
输入输出时的格式化:%d %ld %lf
表达数的范围:char < short < int < float < double
内存中占据字节的大小:1各字节到16个字节
内存中的表达形式:二进制数(补码)、编码

 

 sizeof

是判断数据类型或者表达式长度的运算符

例:int 为4个字节

 sizeof(int) = 4

 

 整数的内部表达

补码的认识

 

如果不以补码的形式,需加上 unsigned

例:unsigned char c = 255;

 

整数越界

# include <stdio.h>
int main ()
{
	char c = 127;
	c = c+1;
	printf("c=%d",c);
	 
	return 0;	
		
}

输出结果:c=-128

整数的输入输出

整数的输入输出

%d : int
%u : unsigned
%ld : long long
%lu : unsigned long long

 

8进制和16进制

  •  一个以0开始的数字字面量是8进制
  • 一个以0x(0X)开始的数字字面量是16进制
  • %o用于8进制,%x用于16进制
代码试验
     char c = 012;
	int i = 0x12;
	printf ("c=%d,i=%d",c,i);
	
	return 0;

{
    c=10,i=18  //输出结果
}

	char c = 012;
	int i = 0x1a;
	printf ("c=%d,i=%d",c,i);
	
	return 0;

{
    c=10,i=26    //输出结果
}

	char c = 012;
	int i = 0x12;
	printf ("c=%o,i=%x",c,i);
	
	return 0;

{
    c=12,i=12    //输出结果
}

	char c = 012;
	int i = 0x1a;
	printf ("c=%o,i=%x\n",c,i);
	i = 0X1a;
	printf ("c=%o,i=%X",c,i);
	
	return 0;

{
    c=12,i=1a
    c=12,i=1A    //输出结果
}

 

 

浮点类型

  • float 有效数字 7
  • double 有效数字 15

浮点的输入与输出

类型 scanf printf
float %f %f,%e(E)
double %lf %f,%e(E)
浮点的输入与输出(例子)
 double ff = 1234.56789;
	printf ("%f\n%e\n%E\n",ff,ff,ff);
	ff = 1e-10; // 中间不能有空格
	printf ("%f\n%e\n%E\n",ff,ff,ff);
	printf ("%.16f\n",ff);
			
	return 0;

{
    1234.567890
    1.234568e+003
    1.234568E+003
    0.000000
    1.000000e-010
    1.000000E-010
    0.0000000001000000  //输出
}

输出精度

  • 在%和f之间加上.n可以指定输出小数点后几位,这样的输出是做4舍5入
  • printf ("%.3f\n",-0.0049);
  • printf("%.30f\n",-0.0049);
  • printf("%.3f\n",-0.00049);

  

输出精度(实例)
printf ("%.3f\n",-0.0049);
	printf("%.30f\n",-0.0049);
	printf("%.3f\n",-0.00049);
	printf ("%.3f\n",-0.0045);	//此处我还未理解为啥结果不是-0.005 

	return 0;

{
    -0.005
    -0.004899999999999999800000000000
    -0.000
    -0.004  // 输出
}

 浮点运算的精度

	float a,b,c ;
	a = 1.345f;
	b = 1.123f;
	c = a + b ;
	if (c == 2.468)
		printf ("相等\n");
	else
		printf ("不相等! c=%.10f,或%f\n",c,c);

{
    不相等! c=2.4679999352,或2.468000 //输出
}
  • 带小数点的字面量是double而非float
  • float需要用f或F后缀来表明身份
  • f1 == f2可能失败
  • fabs(f1-f2) < 1e-12 //判断浮点数相等的方法,fabs表示取绝对值

 

 字符(character)

  • char是一种整数,也是一种特殊的类型:字符。这是因为:
  • 用单引号表示的字符字面量:'a' , '1'
  • ''也是一个字符  //中间无空格
  • printf和scanf里用%c来输入输出字符
	char x = 49;
	char c = '1';
	int i = 49;
	scanf ("%c",&c);
	scanf ("%d",&i);
	
	x = i;
	
	printf ("%c\n",x);

'1'的ASCII编码是49,所以c==49时,它代表'1'

 

 字符计算

字符计算实例
 	char c = 'A';
	c++;
	printf ("%c\n",c) ;
	
	int i = 'Z'-'A';
	printf ("%d\n",i);

{
    B
    25    //输出
}
  • 一个字符加一个数字得到ASCII码表中那个数之后的字符
  • 两个字符的减,得到它们在表中的距离

大小写转换

  • 字母在ASCII表中是顺序排列的
  • 大写字母和小写字母是分开排列的,并不在一起
  • 'a'-'A'可以得到两段之间的距离,于是
  • 'X'+'a'-'A'可以把一个大写字母变成小写字母,而
  • 'x'+'A'-'a'可以把一个小写字母变成大写字母

 

 逃逸字符

  • 用来表达无法印出来的控制字符或特殊字符
    ,它由一个反斜杠“\”开头,后面跟上另一
    个字符,这两个字符合起来,组成了一个字符

printf ("请分别输入身高的英尺和英寸,如输入\"5 7\"表示5英尺7英寸");

字符 意义 字符 意义
\b 回退一格 \" 双引号
\t 到下一个表格位 \' 单引号
\n 换行 \\ 反斜杠本身
\r 回车    

 

自动类型转换

  • 当运算符的两边出现不一致的类型时,会自动转换成较大的类型
  • 大的意思是能表达的述的范围更大  //例如 整数会转换为浮点,int会转换为double
  • char -> short -> int -> long -> long long
  • int -> float -> double

 

  • 对于printf,任何小于int的类型会被转换成int;float会被转换成double
  • 但是scanf不会,要输入short,需要%hd

 

强制类型转换

  • 要把一个量强制转换成另一个类型(通常是较小的类型),需要:
  • (类型)值
  • 比如:
    • (int)10.2
    • (short)32
  • 注意这时候的安全性,小的变量不总能表达大的量
    • (short)32768

只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,无论是值还是类型都不改变

  • 强制类型转换的优先级高于四则运算
强制类型转换实例
 	double a = 1.0;
	double b = 2.0;
	int i = (int)a/b;
	printf ("%d\n",i);

{
    0    //输出
}

 

bool

  • #include<stdbool.h>
  • 之后就可以使用bool和true、false
bool实例
 # include <stdio.h>
# include <stdbool.h>
int main ()
{
	bool t = true ;
	bool b = true ;
	t = false;
	printf ("%d %d",b,t);
	
	return 0;	
}
	
{
    1 0 // 输出
}

 

逻辑运算

  • 逻辑运算的结果只有0或1
  • 逻辑量是关系运算或逻辑运算的结果
运算符 描述 示例 结果
! 逻辑非 !a 如果a是true结果就是false(0),如果a是false结果就是true(1)
&& 逻辑与 a && b 如果a和b都是true,结果就是true;否则就是false
|| 逻辑或 a || b 如果a和b有一个是true,结果为true;两个都是false,结果为false

例 : 表达数学中 4<x<6

x>4 && x<6

问题:如何理解!age<20

单目运算符的优先级 高于 双目运算符,所以先对!age运算结果是0或1,再判断<20,所以必然成立,故结果为1(true)

 

优先级

  • ! > && > ||
  • 例题:理解 !done && (count >MAX)
优先级 运算符 结合性
1 () 从左到右
2 ! 、+ 、- 、++、 -- 从右到左(单目的+和-特殊)
3 * 、/ 、% 从左到右
4 +、 - 从左到右
5 <、<=、 >、 >=   从左到右
6 ==、 != 从左到右
7 && 从左到右
8 || 从左到右
9 = 、+=、 -=、 *= 、/= 、%= 从右到左

短路

不要把赋值,包括复合赋值组合进表达式!

  • 逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
    • a==6 && b==1  
    • a==6 && b+=1  
  • 对于&&,左边是false时就不做右边了
  • 对于||,左边是true时就不做右边了

 

条件运算符

  • count = (count>20)?count - 10:count+10;
  • 条件、条件满足时的值和条件不满足时的值
  • 条件运算符的优先级高于赋值运算符,但是低于其它运算符
  • 条件运算符是自右向左结合的
  • x ? y : z;

逗号运算

  • 逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果。
  • 逗号的优先级是所有的运算符中最低的,所以它两边的表达式会先计算
  • 逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果
  • for (i=0,j =10 ; i<j ; i++,j--)

 


函数

  • “代码复制”是程序质量不良的表现

调用函数

  • 函数名(参数值);
  • ()起到了表示函数调用的重要作用
  • 即使没有参数也需要()
  • 如果有参数,则需要给出正确的数量和顺序
  • 这些值会被按照顺序依次用来初始化函数中的参数

从函数中返回值

  • return停止函数的执行,并送回一个值
  • return;
  • return 表达式; 
  • 一个函数里可以出现多个return语句

返回值

  • 可以赋值给变量
  • 可以再传递给函数
  • 甚至可以丢弃
  • 有的时候要的是副作用

没有返回值的函数

  • void函数名(参数表)
  • 不能使用带值的return
  • 可以没有return
  • 调用的时候不能做返回值的赋值
  • 如果函数有返回值,则必须使用带值的return

 

标签:10,return,int,scanf,C语言,运算符,printf,进程,翁恺
From: https://www.cnblogs.com/alien-han/p/16548645.html

相关文章

  • 尝试理解Linux容器进程与宿主机共享内核到底是什么意思?
    背景近期接触容器技术时,经常看到各类比较容器与虚拟机区别的文章中会提到:容器是共享宿主机的内核,而虚拟机则是拥有自己独立的内核,所以不可能在Linux上用容器运行windows,但......
  • python中的多线程与多进程
    线程概念:线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的......
  • 检查一个容器的进程绑核情况
    目录获取容器id获取容器id#!/usr/bin/envbashnow=$(date+%s)dockerids=$(dockerps|grepxx-pod|grepyy-container|awk'{print$1}')foritemin${dock......
  • C语言常用编译选项
    目录编译选项-Wall-Wextra-Werror-Werror=implicit-function-declaration-Werror=unused-variable参考编译选项当-Wxx时,指的是,针对某个类型产生告警,特殊的-Wall是对所有......
  • C语言中的SDL库有啥用?
     SimpleDirectMediaLayer(SDL)isacross-platformdevelopmentlibrarydesignedtoprovidelowlevelaccesstoaudio(声音),keyboard(键盘),mouse(鼠标),joystick(操纵......
  • 进程、线程补充与协程相关介绍
    补充点1.死锁当你知道锁的使用抢锁必须要释放锁,其实你在操作锁的时候也极其容易产生死锁现象(整个程序卡死阻塞)fromthreadingimportThread,Lockimporttimemu......
  • 端口占用解决(Window系统)——结束占用端口的进程
    1.打开dos窗口。2.查看端口的占用情况。输入 netstat-ano查看所有端口的占用情况。记住PID(进程号)。 如果觉得太长了,也可以依据端口号输入 netstat-aon|findstr"......
  • JVisualVM监控远程Java进程
    一、添加远程IP地址选择“远程”,添加“远程主机“,填写IP地址,然后确定 二、使用JMX技术,修改Catalina.shJAVA_OPTS="$JAVA_OPTS-Dcom.sun.management.jmxremote-D......
  • C语言基本算术运算
    基本算术类型C运算符合表达式负号第一优先级(一元运算符)乘除求余第二优先级(二元运算符)加减第三季优先级(三元运算符)注意:1/2的结果是01.0/2的结果是0.5(整型除法和浮点......
  • C语言发展历程及开发环境
                         ......