C语言程序设计

一:基础知识

  1. 整型
    (1) int: 4字节,32位,绝对值在 1 0 9 10^9 109范围以内的整数都可以。
    (2) long long int: 8字节,绝对值在 1 0 10 10^{10} 1010或者 1 0 18 10^{18} 1018范围以内的整数都可以。
    (如果long long型赋大于 2 31 2^{31} 231-1的初值,则需要在初值后面加上LL,否则会编译错误)
    (3) 10的10次方为 1e10 也可写成1e+10(如果是负10次方可以写成1e-10)

  2. 字符型
    显示字符 : 0 ~ 9 , A ~ Z , a ~ z
    ASCII码 :48 ~ 57,65 ~ 90 ,97 ~ 122
    小写字母的ASCII码值比大写字母的ASCII码值大32。
    字符常量用单引号标注

  3. 数组
    数组大小较大(大概 1 0 6 10^6 106j级别)则需要将其定义在主函数外面,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全部变量来自静态存储区,允许申请的空间较大。

  4. C 库函数 double exp(double x) 返回 e 的 x 次幂的值。
    在这里插入图片描述在这里插入图片描述double类型的输入格式是%lf,输出格式是%f.

  5. true为1,false为 0;

  6. break; 从switch语句或者包含它的最内层循环语句中跳出。

  7. continue; 使控制转移到包含它的最内层循环语句的末尾,然后重新开始下一轮循环。

\n 代表换行
\0 代表空字符NULL,其ASCII码为0,请注意\0不是空格
/*
*字符串常量可以作为初值赋给字符数组,并使用%s的格式输出
*/
#include<stdio.h>
int main()
{
    char a[25]="Wo ai de ren bu ai wo";
    printf("%s",a);
    return 0 ;
}
//Wo ai de ren bu ai wo

/*
*布尔型:整型常量在赋值给布尔型变量时会自动转换为true(1)或者false(0)
*/
#include<stdio.h>
int main()
{
    bool flag1 = 0, flag2 = true;
    int a = 1, b = 1;
    printf("%d %d %d\n",flag1, flag2, a==b);
    return 0 ;
}
// 0  1 1

/*
*强制类型转换
*/
#include<stdio.h>
int main()
{
   double r = 12.56;
   int a = 3, b = 5;
   printf("%d\n", (int)r);
   printf("%d\n", a / b);
   printf("%.1f", (double)a / (double)b);
   return 0;
}
12
0
0.6

/*
*符号常量(用一个标识符来替换常量)
*/
#include<stdio.h>
#define pi1 3.14
const double pi = 3.14;
int main()
{
   double r =3;
   printf("%.2f\n", pi*r*r);
   return 0;
}
28.26

/*
*条件运算符:三目运算符
*/
#include<stdio.h>
#define ADD(x) (x*2+1)
int main()
{
   int a=3,b=5;
   int c = a>b? 7:11;//a>b成立时取7,不成立时取11
   printf("%d\n", c);
   return 0;
}+
11

/*
*无穷大定义
*/
const int INF = (1<<30)-1;
const int INF = 0x3fffffff;

/*
*字符数组使用%s读入的时候读入结束的标志:空格和换行
*/
#include<stdio.h>
int main()
{
    char str[10];
    scanf("%s",str);
    printf("%s",str);
    return 0;
}
abcd efg
abcd

/*
*scanf的%c格式是可以读入空格和换行的
*/
#include<stdio.h>
int main()
{
    int a;
    char c,str[10];
    scanf("%d%c%s",&a,&c,str);
    printf("a=%d,c=%c,str=%s",a,c,str);
    return 0;
}
1 a bcd
a=1,c= ,str=a


/*
*三种实用的输出格式
*/
#include<stdio.h>
int main()
{
    int a = 123, b = 1234567;
    //%md可以使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐;如果变量本身超过m位,则保持原样
    printf("%5d\n",a);
    printf("%5d\n",b);

    //%05d 以0作为补充元素
    printf("%05d\n",a);
    printf("%05d\n",b);

    //%.mf浮点数保留m位小数输出
    double d1 = 12.3456;
    printf("%.1f",d1);
    return 0;
}
/*
*  123
*12345
*00234
*12345
*12.3
*/

/*
*getchar(): 输入单个字符
*putchar(): 输出单个字符
*/
#include<stdio.h>
int main()
{
   char c1,c2,c3;
   c1 = getchar();//getchar()可识别换行符
   getchar();
   c2 = getchar();
   c3 = getchar();
   putchar(c1);
   putchar(c2);
   putchar(c3);
   return 0;
}
/*
*abcd
*acd
*/

/*
typedef:起别名
*/
#include<stdio.h>
typedef long long LL;//将给long long起个别名LL
int main()
{
    LL a = 123456789012345, b = 234567890123456;
    printf("%lld\n",a+b);
    return 0;

}
/*
358024679135801
*/

/*
常用math函数
*/
#include<stdio.h>
#include<math.h>//头文件
typedef long long LL;
const double pi = acos(-1.0);//因为cos(pi)=-1;
int main()
{
   double db = -12.56;
   printf("%.2f\n",fabs(db));//取绝对值
   printf("%.0f %.0f\n", floor(db), ceil(db));//floor()向下取整,ceil向上取整
   printf("%f\n",pow(2.0,3.0));//次幂
   printf("%f\n",sqrt(2.0));//算术平方根
   printf("%f\n",log(1.0));//以e为底的对数(无对任意底数求对数的函数,需要使用换底公式)

   double a = sin(pi*45/180);//参数为弧度制 180度=3.14(弧度) ==sin(45)度
   double b = cos(pi*45/180);
   double c = tan(pi*45/180);
   printf("%.2f %.2f %.2f\n",a,b,c);

   a = asin(1.0);//反正弦值
   b = acos(-1.0);
   c = atan(0);
   printf("%.2f %.2f %.2f\n",a,b,c);

   a = round(3.40);//round进行四舍五入
   b = round(3.5);
   c = round(3.6);
   printf("%d %d %d\n",(int)a,(int)b,(int)c);

   return 0;

}
/*
12.56
-13 -12
8.000000
1.414214
0.000000
0.71 0.71 1.00
1.57 3.14 0.00
3 4 4
*/

if(n!=0)可以写成if(n)
if(n==0)可以写成if(!n)

/*
switch
*/
#include<stdio.h>
#include<math.h>

int main()
{
  int a = 1, b = 2;
  switch(a+b){
    case 2: printf("%d\n", a);break;
    case 3: printf("%d\n", b);break;
    case 4: printf("%d\n", a+b);break;
    default:printf("sad strory\n");
    return 0;
  }
}

//continue段后皆不执行。


//冒泡排序
#include<stdio.h>
#include<math.h>
int main()
{
    int a[10]={3,1,4,5,2};
    for(int i=0;i<5;i++)
    {
        for(int j=0; j<4-i; j++){
            if(a[j] < a[j + 1]){//降序
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
    for(int i=0;i<5;i++)
    {
        printf("%d\n",a[i]);
    }
}

/*
memset-对数组中每一个元素赋相同的值
因memset按字节赋值,建议赋值0或者-1
*/
#include<stdio.h>
#include<string.h>//memset的头文件
int main()
{
    int a[5] = {1,2,3,4,5};
    memset(a, -1, sizeof(a));
    for(int i=0;i<5;i++)
        printf("%d ",a[i]);
}

/*
memset-对数组中每一个元素赋相同的值
因memset按字节赋值,建议赋值0或者-1
*/
#include<stdio.h>
#include<string.h>//memset的头文件
int main()
{
    int a[5] = {1,2,3,4,5};
    memset(a, -1, sizeof(a));
    for(int i=0;i<5;i++)
        printf("%d ",a[i]);
}

/*
gets输入:以\n作为输入结束
puts输出
*/
#include<stdio.h>
#include<string.h>//memset的头文件
int main()
{
    char str1[20];
    char str2[5][10];
    gets(str1);
    for(int i=0;i<3;i++)
        gets(str2[i]);
    puts(str1);
    for(int i=0; i<3; i++)
        puts(str2[i]);
    return 0;
}

/*
空字符串\0:表示存放的字符串的结尾
在使用gets或者scanf输入字符串时会自动添加在输入的字符串后面,并占用一个字符位,而puts与printf可以通过识别\0作为字符串的结尾来输出。
getchar输入时要手动在字符串后加入"\0"
*/
#include<stdio.h>
#include<string.h>//memset的头文件
int main()
{
    char str1[15];
    for(int i=0; i<3; i++){
        str1[i] = getchar();
        //printf("%d : %c\n",i,str1[i]);
    }
    str1[3] = '\0';
    puts(str1);
    return 0;
}

/*
string.h头文件:包含了许多用于字符数组的函数
strlen()  可以得到字符数组中第一个\0前的字符的个数。
strcmp(str1, str2) 返回两个字符串大小的比较结果,比较原则是按字典序。
strcpy(str1, str2) 将字符串str2复制给str1,这里的“复制”包括了结束符\0.
strcat(str1, str2)将字符数组2接到字符数组1后面。
*/
#include<stdio.h>
#include<string.h>
int main()
{
    /*char str[10];
    gets(str);
    int len = strlen(str);
    printf("%d\n",len);
    */

    char str1[50], str2[50];
    gets(str1);
    gets(str2);
    int cmp = strcmp(str1, str2);
    if(cmp < 0) printf("str1 < str2\n");
    else if(cmp > 0) printf("str1 > str2\n");
    else printf("str1 == str2\n");

    strcpy(str1, str2);
    strcat(str1, str2);
    puts(str1);
    return 0;
}

/*头文件 stdio.h
sscanf(str, "%d", &n) string + scanf将字符数组str中的内容以"%d"的格式写到n中(从左到右)
sprintf(str, "%d", n) string + printf 把n以"%d"格式写到str字符数组中(从右向左)
*/
#include<stdio.h>
int main()
{
   int n,m;
   char str[100] = "123:456";
   sscanf(str, "%d:%d", &n,&m);
   printf("%d %d\n", n, m);

   n = 23;
   double t =3.44;
   sprintf(str, "%d%lf", n,t);
   printf("%s\n", str);

   return 0;
}

/*
指针是一个unsigned类型的整数
数组名称也可作为数组的首地址使用
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>

int main()
{
   int a=1;
   printf("%d %d\n", &a, a);

   int* p = &a;//int* 是指针变量的类型,p才是变量名,用来存储地址,因此地址&a是赋值给p而不是*p的
   //星号的类型的一部分就记错
   p = &a;
   a = 233;
   printf("%d\n", *p);

   int b[10] = {1};
   p = b;
   printf("%d\n", *p);//其实输出的为a[0]

   for(int i=0; i<10; i++){
    scanf("%d",b+i);
   }
   for(int i=0; i<10; i++){
     printf("%d ", *(b+i));
   }
   return 0;

}
/*
指针变量用于枚举数组中的元素
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>

int main()
{
   int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
   for(int *p = a; p < a + 10; p++){
    printf("%d ", *p);
   }
   printf("\n");

   int* p =a;
   int* q = &a[5];
   printf("q = %d\n", q);
   printf("p = %d\n", p);
   printf("q - p = %d\n", q-p);
   return 0;

}
/*
1 2 3 4 5 6 7 8 9 10
q = 2686720
p = 2686700
q - p = 5//两个int型的指针相减,等价于在求两个指针之间相差了几个int
*/

/*
指针变量作为函数参数
视为把变量的地址传入函数,如果在函数中对这个地址中的元素进行改变,原来的数据就会确实地被改变
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>

void change(int* p)
{
    *p = 233;
}
int main()
{
   int a = 1;
   int* p = &a;
   change(p);//地址传递
   printf("%d\n", a);
   return 0;

}

/*

 指针的引用:试图通过将传入的地址交换来达到交换两个变量的效果

*/
#include<stdio.h>
#include<string.h>

#include<stdlib.h>


void swap(int* &a, int* &b)
{
    int *temp = a;
    a = b;
    b = temp;
}
int main()
{
   int a = 1, b = 2;
   int *p1 = &a, *p2 = &b;
   swap(p1, p2);
   printf("a = %d, b = %d\n", *p1, *p2);
   return 0;

}
/*


*/

/*
浮点数的比较

*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const double eps = 1e-8;
#define Equ(a, b) ((fabs((a)-(b)))<(eps)) //两个浮点数是否相等
#define More(a, b) (((a)-(b)>(eps)) //a > b?
#define Less(a, b) (((a)-(b)<(-eps)) //a < b?
#define MoreEqu(a, b)  (((a)-(b)>(-eps))// >=  a > b-eps
#define LessEqu(a, b) (((a)-(b)<(eps))// a < b + eps
//圆周率
const double pi = acos(-1.0);//cos(pi) = -1;
int main()
{
   double a = 1.23;
   if(Equ(a, 1.23)){
      printf("true\n");
   }
   else{
       printf("false\n");
   }
   return 0;
}




二: 算法笔记课后习题

/*
题目描述

从键盘输入3个实数a, b, c,通过比较交换,将最小值存储在变量a中,最大值存储在变量c中,中间值存储在变量b中,并按照从小到大的顺序输出这三个数a, b, c。

末尾输出换行。 
*/
#include<stdio.h>
#include<math.h>

int main()
{
  double a, b,c,t;
  scanf("%lf %lf %lf",&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("%.2f %.2f %.2f\n",a, b, c);
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值