【无标题】

  • 变量(必须是一个合法的标识符)命名规矩
    • 不能用关键字特定字
    • 必须字母和下划线开头
    • 除了字母、数字、下划线不允许其他字符
    • 大小有别
  • printf("格式控制" , 输出表列);
    • %[ -左对齐 0左空位填零 <数字> . <数字>] 类型字符
  • scanf("格式控制", &地址表列);
    • 没有精度控制
    • 在输入  空格、回车、Tab、不属于数值的字符,认为输入结束【例如:scanf("%d%lf",&a,&b);   输入: 3.14 100↙   输出: a=3, b=0.14】
  • 空值型void(出现在函数定义头部,表示无返回值)
  • 优先级(高到低):
    • 括号
    • 单目运算符:!
    • 算数运算符:+-*/
    • 关系运算符:=<>
    • 逻辑运算符(不包括!)&&||
    • 三目运算符:max=a>b?a:b
    • 赋值运算符
    • 逗号运算符最低(左→右,最后一个为整个的值)a=1,b=2;  等价于a=1;b=2;
  • 注释
  • 全部1024 = pow(2 , 10) 倍    B字节 < KB < MB兆 < GB < TB
  • 进制转换(八%o,十六%x)

    • 2转某—2幂(八-3;十六-4)

    • 某转2—2余数

    • 某转10—某幂

    • 10转某—某余数

  • 负数  原码-倒过来—反码-加1—补码

  • ASCII表:字符被替换成十进制数字;数字即字符、字符即数字

    • 不可显示字符:\n'=换行; '\t'=Tab(对对齐); \b=退格(删除其实); \r=回车

    • 常用的ASCII码:'A'=65 , 'a'=97 【大小写差32】;'0'=48

  • 逻辑运算符(判断真-非0;假-0)
    &&、||、! (b=5; !b=0)
    优先级:!> 关系运算符> || >&&
    ||&&从左到右,一旦成功表达式1,不再判断执行表达式2
    例如:x=2;   printf("%d ", 'A'&&(x=6));   printf("x=%d ", x); 输出:1_ x=6
     
  • 复合赋值运算符
    • 右⬅左
    • +=  -=  /=  *=
    • 例如:a=12; a+=a-=a*a        得出  - 264

  • (++)与(--)
    • 只能用于变量,表达式不行

    • 看到式子就先搞左的,运算后,再右的

    • 例如:a=1;  b = (++a*a++)+(++a);    得出a=4; b=7

  • 赋值过程中的类型转化书本62.07bmaybe

  • 常用数学函数<math.h>
    • fabs(x)——绝对值
    • pow(x,y)——x的y次方
    • sqrt(x)——根号x
  • 常见的程序
    • 2、整数计算(两整数相除为整数,要小数 . 一下)(参与%的必须为整数)
      • 即加减乘除:5/2=2;2/5=0;5%2=1;2%5=2(余本身);除数不为0
    • 5、分离位数
      • 个位=n%10    十位=n/10%10   百位=n/100  以此类推
    • 6、#define宏变量
      • #define A 123(无分号)程序里的A全部替代为123
    • 闰年
      • 需满足①能被4整除,但 不能被100整除。②能被400整除;
        (year%4==0 && year%100!=0) || year%400==0
    • putchar()函数
      • putchar(c);  显示参数c所表示的一个字符。参数c可以是字符型常量、字符型变量或整型变量。类printf
    • getchar()函数
      • getchar();//不需要参数。接收从键盘输入的一个字符(包括空白字符)。类似scanf
      • 例如:c=getchar();printf("%d" , c); 输入A 输出65
      • 例如:printf("%04c" , getchar() ); 输入A输出000A
  • 顺序结构
//输入两个整数x和y,交换二者的值,然后输出
#include <stdio.h>
int main()
{
     int x, y, temp;
     scanf("%d%d", &x, &y);
     temp = x; //将x的初值赋予变量temp
     x = y; //仅改变变量x的值,y的值不变
     y = temp; //变量y被赋予新的值,原值被覆盖
     printf("%d %d\n",x,y);
     return 0;
}
  •   选择结构if & switch
    • if语句

      #include<stdio.h>
      int main( )
      {
          if(表达式)【非0为真,0为假;真就执行,假就跳过 】【if(n)=if(n!=0);本来就是判断表达式是否为0,所以没差】
          语句1; 【if到这个; 】
      
          else if(表达式)【x=100是赋值!!得==】
          语句2;【复合语句要打包成语句块 ,语句块结尾不要;】
      
          else
          语句3;
      return 0;
      }

      {if(a>b)
      max=a;
      else
      max=b;}        等价于max=(a>b)?a:b;

    • switch语句
      #include<stdio.h>//switch通常用在多分支的 
      
      int main()
      {
      char grade;
      
      scanf("%c",&grade);
      switch (grade)//括号里只能整形&字符型,不能浮点数
      {
      case'A':printf("优");break; //case标记作用(必须是不同常量),break跳出
      case'B':printf("良");
              printf("haha");
              break;
      case'C':printf("合格");break;
      case'D':
      case'F':printf("不合格");break;
      default :printf("滚");//如果没有default,跳到后面。
      
      }
      return 0;
      }
      //若没有printf后面的,就跳到下一行;即多个case共用一组执行
      //case后的语句组,不要{ }

    • 例:② 运输公司对用户计算运输费用。路程(s km)越远,每吨·千米运费越低。标准如下:
      s < 250               没有折扣     250 ≤ s < 500       2%折扣         500 ≤ s < 1000   5%折扣
      1000 ≤ s < 2000  8%折扣     2000 ≤ s < 3000   10%折扣        3000 ≤ s           15%折扣

      #include <stdio.h>//利用了折扣变化点,和除法只保留整数的特点
      
       int main()
       { 
           int c,s; 
           float p,w,d,f;
      
           printf("please enter price,weight,discount:"); 
           scanf("%f,%f,%d",&p,&w,&s); 
         c = (s>=3000)?12:(s/250);
         switch (c)
           { 
               case 0: d=0; break; 
               case 1: d=2; break; 
               case 2: 
               case 3: d=5; break; 
               case 4: 
               case 5: 
               case 6: 
               case 7: d=8; break; 
               case 8: case 9: case 10: 
               case 11: d=10; break; 
               case 12: d=15; break; 
           }
           f = p * w * s * (1 - d / 100); 
           printf("freight=%10.2f\n",f); 
           return 0;
      }
      

  • 循环结构while、do..while、for

    • while语句

      while函数【计数循环】
      #include<stdio.h>
      int main()
      {
          int x;
          while(判断条件)//没条件就while(1)
          {
              循环
          }
      return 0;
      }

      例如·:求班级53人平均成绩

      #include <stdio.h>
      int main()
      {    
      	int i=0;
      	double total,average,mark;
      	while (i < 53)
      	{
      		scanf("%lf", &mark);
      		total += mark;
      		i++; 
      	}
      	average=total/53.0;
      	printf("%.2f",average);
      	return 0;
      }
      
    • 例如:输入两个整数,分别输出他们的最大公约数和最小公倍数 

      #include <stdio.h>//辗转相除法
      int main()
      {    
      	int a,b,x,y;
      	scanf("%d %d",&a,&b);
      	x=a*b;
      	y=a%b;
      	while(y)
      	{
      		a=b;
      		b=y;
      		y=a%b;	
      	}
      	printf("最大公约数是:%d;最小公倍数是:%d",b,x/b);
      	return 0;
      }

    • do....while

      do while函数【不确定循环】
      #include<stdio.h>
      int main()
      {
          int x;
      
          do
          {
              循环
          }while(循环条件);//记得" ; " 复合语句记得加大括号
      //经常是while ((c=getchar())!='\n')
      //putchar(c);
      
      
      return 0;
      }

      例如:输入一个非负整数,并进行逆向显示,输出要求忽略最高位的0, 如输入,2100,输出12;

      #include <stdio.h>
      int main()
      {    
      	int x,n,i;
      	do
      	{
      		scanf("%d",&x);
      		if(x<=0)
      		printf("请输入正整数\n"); 
      	}while(x<0);
      	
      	while(x>0)
      	{
      		i=x%10;//个位数
      		n=n*10+i;//前进一位+个位数
      		x/=10;//撇了个位数
      	}
      	printf("%d",n);
      	
      	return 0;
      }

    • for语句

      #include<stdio.h>
      
      int main()
      {
          int x;
      
          for(初始条件;判断条件;循环变量更新)
          {
              循环
          }
      return 0;
      }
      • for嵌套循环

      • ????

        #include <stdio.h>
        int main()
        {    
        	int i,j;
        	
        	for(i=5;i>0;i--)//五行,\n;其实这一步就是很巧妙的让下面简单很多
        	{
        		for(j=1;j<6-i;j++) //做前面空格嫁妆,第一排1个 第二排2个
        		printf(" ");
        		for(j=1;j<=2*i-1;j++) //每排*的个数
        		printf("*"); 
        		
        		printf("\n");
        	} 
        
        	
        	return 0;
        }

      • ②百钱买百鸡
        公鸡5块,母鸡3块,小鸡1/3块,100块钱买了一百只鸡,请问各买几只?
        #include <stdio.h>
        
        int main()
        {    //这道题两个条件1、一百只鸡2、一百块钱
        	int rooster,hen,chick;
        	for(rooster=0;rooster<=20;rooster++)
        	{
        		for(hen=0;hen<=33;hen++)
        		{
        			chick=(100-5*rooster-3*hen)*3;
        
        			if(chick+rooster+hen==100)
        			printf("公鸡%d只 母鸡%d只 小鸡%d只\n",rooster,hen,chick);
        		}
        	}
        	
        	return 0;
        }

    • break语句

      • 用于①switch语句的case分支中、②循环结构的循环体中   !!只能这两!!

      • 作用是在满足某种条件时跳出循环,故常与if搭配【结束他所在的循环体的循环】

      • 例如:在全系1000学生中,征集慈善募捐,当总数达到 10万元时就结束,统计此时捐款的人数,以及平均每人捐款的数目
        #include <stdio.h>
        int main()
        {    
        	int student;
        	double money,sum;
        	for(student=1;student<=1000;student++)
        	{
        		scanf("%lf",&money);
        		sum+=money;
        		if(sum>=100000)
        			break;
        	}
        	printf("捐款人数是:%d 人均捐款:%.2lf",student,sum/student);
        	return 0;
        }
    • continue语句

      • for/while/do…while语句的循环体中【爱if】

      • 满足某种条件时中止本次循环,就是跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判断【节省循环时间】看不懂,——已看懂

        #include <stdio.h>
        
        int main()
        {    
        	int i,j;
        
        	for(i=0;i<5;i++)
        	{
        		for(j=0;j<5;j++)
        		{
        			if(j==i+1)
        				continue;
        			printf("*");
        		}
        		printf("\n");
        	}
        	return 0;
        }

        例如:要求输出100~200之间的不能被3整除的数

        #include <stdio.h>
        int main()
        {    
        	int i;
        	for(i=100;i<=200;i++)
        	{
        		if(i%3==0)
        		continue;
        		printf("%d ",i);
        	}
        	return 0;
        }

  • 数组

    • 用来批量表达函数,可以先存储后运算

    • double s[100] 【这一批数字有100个】【这批数据类型一样都是double】
      s[i-1] 【表示第i个数】;
      因为一切从0开始,所以得 i - 1 / / a[5]是第6个数

    • 一维数组:类型符 数组名[常量表达式]  // 数组的名称并不是变量

    • 例如:
      int n=5,a[10], b[5]={1,2,3,4,5};
        a[0]=a[5]+a[7]-a[2*3] 合法
        a[n]=20; 合法
      /*int c[4]={0,1};  相当于int c[4]={0,1,0,0};
      int b[5]={1,2,3,4,5}; 可写为 int b[ ]={1,2,3,4,5};*/

    • 例如:有6个人的代号,要求对它们按由小到大的顺序排列【冒泡泡】

      #include <stdio.h>
      int main()
      {    
      	int i,j,t,a[10];
      	printf("input 10 numbers :\n");
      	for (i=0; i<10; i++)
          { 
      		scanf("%d",&a[i]);//循环输入10个数
          } 
      	printf("\n");//跳出后回车
      	for (j=0;j<9;j++)//此循环为了固定一下
          {
      		for (i=0;i<9-j;i++) //开始冒泡泡
              {
      			if (a[i]>a[i+1])  //让最大的数沉淀到a[9]
                  t=a[i];
                  a[i]=a[i+1];
                  a[i+1]=t; //通过辗转得到ai+1为大,ai为小
              }
      	printf("the sorted numbers :\n");
          }
      	for (i=0; i<10; i++) 
      		printf("%d ",a[i]); //从小到大输出
      printf("\n");
      	
      	return 0;
      }

    • 二维数组:int a[3][6] ;  就是有横纵的。3为行,6为列

    • 初始化:int a[2][3]={{1,2,3},{4,5,6}};    可以跳过其中的某行,对其他行进行赋值
      等价于=int a[ ][4]={1,2,3,4,5,6};

    • 二维数组转置:
      1 2 3    变成 4 1
      4 5 6            5 2
                          6 3

      #include<stdio.h>
      int main( )
      {
      	int a[2][3]={1,2,3,4,5,6},b[3][2],i,j;
      	printf("array a: \n");
      	for(i=0;i<2;i++)
      	{
      		for(j=0;j<3;j++)
      		{
      			printf("%4d ",a[i][j]);
      		b[j][i]=a[i][j];
      		}printf("\n");
      	}
      	printf("array b:\n");
      	for(i=0;i<3;i++)
      	{
      		for(j=0;j<2;j++)
      		{
      			printf("%4d ",b[i][j]);
      		}printf("\n");
      	}	
      return 0;
      }

    • 有一个3×4的矩阵,要求编程序求出其中值最大 的那个元素的值,以及其所在的行号和列号。

      #include<stdio.h>
      int main( )
      {
      	int a[3][4]={38,47,10,24,46,37,57,2,28,1,4,3},max,row,colum;
      	int i,j;
      	for(i=0;i<3;i++)
      	{
      		for(j=0;j<4;j++)
      		if(a[i][j]>max)
      		{
      			max=a[i][j];
      			row=i+1;
      			colum=j+1;
      		}
      	}
      	printf("%d %d %d",max,row,colum);	
      return 0;
      }
      

    • 字符数组(scanf输入不能带空格。不然直接跳下一个。

      • 初始化:char a[3]={'Y','e','s'};  

        • 字符串数组:string
            1、一定用‘\0’表示结束(其acsii表—0)【'0'与'\0':\0不可见只是用来结束用的,'0'acsii为48】
             2、char a[4]={"Yes"};   【{}加不加无所谓】
             3、printf("%s" , a[4]);  
             4、输入:
                      ①逐个字符输出:       int n = -1;   scanf("%c" , &a[++n]);
                      ②
          直接字符串输入:   char a[3] ;   scanf(" %s ",    a);
                      ③多个字符串输入,以“空格”为界 切换下一个字符串
             5、使用字符串函数时候#include <string.h>
                      
          输出:puts(数组名称);
                      输入:gets(字符数组);  (不会被空格分隔,只被回车)(超出的话会覆盖电脑里其他重要东西,不安全)
                      所以输入选择了fgets。fgets(字符名,个数,stdin);  其实只输入个数-1个,stdin占\0
                      strcat将多个字符数组拼接到第一个数组里面去:strcat(字符数组1 , 字符数组2);   char str1[30]="abcd";    char str2[]="efj";    printf("%s" , strcat(str1,str2));  输出:abcdefj    所以第一个[]要足够大
                   
          strcpy(数组1,数组2);  将2复制进入1   char str1[10]; str2="emm"; printf("%s" , strcpy(str1,str2));  or   printf("%s" , strcpy(str1, "emm"));  
                        strncpy:将2的前n个复制到1去;strncpy(str1,str2,4);复制一点的话不包括\0,n不能超过1的长度
                       
          strcmp:比较字符串大小(acsii码表里的顺序);strcsmp(str1,str2);若1=2,函数值为0;1>2,函数为正整数;1<2,负整数;例如:if(strcmp(str1,str2)>0)  
                     
          strlen:测量字符串长度,不包含\0.  printf(“%d” , strlen(数组名称))
                     strlwr转小写,strupr转大写

                    memset:给数组赋值,按字节赋值。char a[10];memset(a,0,sizeof(a));将数组赋值为0;(一个整数,4个字节,如果memset(a,1,5)只是赋值了一个数字+一个字节。)

      • 关灯问题:有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关 (这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打 开,开着的灯将被关闭),依此类推。一共有k个人,问最后由哪些灯开着?输入:n 和k,输出开着的灯的编号。0<=k<=n<=1000。
        样例输入:7 3,样例输出:1 5 6 7

        #include<stdio.h>
        int main( )
        {
        	int n,k;
        	int a[n],b[k],i,j;
        	int x[1001]={0};//0表示黑灯,1表示亮灯
        	scanf("%d %d",&n,&k);
        	a[i]=i;
        	b[j]=j;
        	for(j=1;j<=k;j++)
        	{
        		for(i=1;i<=n;i++)//让灯和人进入循环
        		{
        			if(i%j==0)//如果灯号是人号的倍数
        			{
        				if(x[i]==1)//如果这个灯本来亮着,就关了它
        				x[i]=0;
        				else//如果不是,就开灯
        				x[i]=1;
        				
        			}
        		}
        	}
        	for(i=0;i<=n;i++)//上面开开关关完了,现在来看一下谁开谁关
        	{
        		if(x[i]==1)
        		printf("%d ",i);
        	}	
        return 0;
        }

      • 输入一个3x3的整数矩阵,把以正中心的数字为轴左转90度后输出。

        #include <stdio.h>
        
        int main() {
            int a[3][3];
            int i,j;
            for(i = 0; i < 3; i++)
        	{
                for(j = 0; j < 3; j++)
        		{
                    scanf("%d",&a[i][j]);//输入 
                }
                scanf("\n");
            }
            
            for(j = 0; j <3; j++)
        	{
                for( i = 2; i >=0; i--)
        		{
                    printf("%3d",a[i][j]);//结果是从左下角向上打。说实话。有点没看懂。 
                }
                printf("\n");
            }
            return 0;
        }

      •       统计单词数 

        #include<stdio.h>
        int main()
        {
        	char s[81],c;
        	int i,num=0,word=0;
        	fget(s,81,stdin);
        	for(i=0;(c=s[i]!='\0');i++)
        	{
        		if(c==' ')
        		word=0;
        		else if(word==0)
        		{
        			word=1;num++;
        		}
        		printf("%d word\n",num);
        	}
        	return 0;
        } 

           

      • 3个字符串比较大小/和数字比较大小对比学习

        #include<stdio.h> 
        #include<string.h>
        int main()
        {
        	char str[3][10],string[10];
        	int i;
        	for(i=0;i<3;i++)
        	{
        		fgets(str[i],10,stdin);
        	} 
        	if(strcmp(str[0],str[1])>0)
        		strcpy(string,str[0]);
        	else strcpy(string,str[1]);
        	if(strcmp(str[2],string)>0)
        		strcpy(string,str[2]);
        	printf("\nthe largest:\n%s\n",string);	
        	 	
        	return 0;
        }
        

      •  高精度加法
        输入两个1000位以内的正整数,输出他们的和。输入123456789  987654321  输出1111111110.
        字符转数字-‘0’

        #include<stdio.h> 
        #include<string.h>
        char sa[1001],sb[1001];
        int i,a[1001],b[1001],c[1001];int la,lab;
        int main()
        {
        	scanf("%s %s",sa,sb);
        	la=strlen(sa);lb=strlen(sb);
        	memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
        	
        	for(i=0;i<la;i++)//低位对齐 
        		a[la-i-1]=sa[i]-'0';
        	for(i=0;i<lb;i++)
        		b[lb-i-1]=b[i]-'0';
        	lc=la>lb?la:lb;
        	for(i=0;i<lc;i++)
        	{
        		c[i]=a[i]+b[i]+c[i];
        		if(c[i]>=10)
        		{
        			c[i+1]=1;
        			c[i]=c[i]-10;
        		}
        	}
        	if(c[lc]>0)lc++;
        	for(i=lc-1;i>=0;i--)
        	printf("%d",c[i]);
        			
        	return 0;
        }

    • 函数

      • 函数定义

        #include<stdio.h>//???
        
        int f(int x)
        {
            int r = 2*x;
            return r;
        }
        
        int main()
        {
            scanf("%d",&x)
            printf("%d",f(x));
            return 0;
        }
        • 函数没有返回值,就用viod

          #include<stdio.h>
          void greeting()
          {
              printf("Good morning!\n");
          }
          
          int main()
          {
              greeting();
              return 0;
          }
        • 无参函数、有参函数、空函数

          无参函数
          int f(void)//or f()
          {
              函数体
          }
          
          
          有参函数
          int add(int a,int b)
          {
              int res;
              res=a+b;
              return res;
          }
          
          空函数
          void f()
          {
          }

        • 调用函数(返回值)

          • 函数类型 函数名(实参表列)【无参函数括号里可以没东西,多个,隔开】

            //简单看点
            #include <stdio.h>
            int max(int a,int b)
            {
            	int c;
            	c=a>b?a:b;
            	return c; 
            }
            
            int main() 
            {
            	int x,y,z;
            	scanf("%d%d",&x,&y);
            	z=max(x,y);
            	printf("%d",z);
            	return 0;
            }

            调用函数截止于第一个return。

        • 调用函数

          //两数比大小
          #include<stdio.h>
          
          int max(int a, int b);
          
          int max(int a,int b)
          {
              if(a>b) return a;
              else return b;
          }
          
          int main()
          {
              int x,y,c;
              scanf("%d%d",&x,&y);
              c=max(x,y);
              printf("%d",c);
              return 0;
          }
  • 指针

    • 指针-变量地址;数组-变量本身
      //*取值; &取地址
      p:指针变量-地址;  *p:指向这个地址中的数值

      char *a = &b;
      printf("%c",*a);

  • 递归

    //年龄问题5小孩
    #include<stdio.h>
    
    int age(int n);
    int age(int n)
    {
        
    }
    
    int main()
    {
        
        printf(
    • 阶乘

      #include<stdio.h>
      
      int fact(int n);
      
      int fact(int n)
      {
          int x;
          if(n>0)
              x=n*fact(n-1);
          else
              x=1;
      }
      
      int main()
      {
          int x,y;
          scanf("%d",&x);
          y=fact(x);
          printf("%d",y);
      }

      汉诺塔

      //64盘子的汉诺塔
      #include

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值