C语言_1-30

C语言是结构化程序设计,包含顺序结构、选择结构、循环结构,他们是各种复杂程序的基本结构单元。

1.文件

可执行文件(指令和数据构成):.exe .bat .com

不可执行文件(数据构成)

在C语言中------- .c /.cpp(源文件,文本) .h(头文件,文本) .i(预编译文件,文本) .s(汇编文件,文本) .o / .opp(二进制目标文件) .exe(可执行文件)

*.c源文件----预编译----*.h预编译文件----编译----*.obj目标文件----链接----*.exe可执行文件

第一个C语言程序

//hello.c                             注释----//  /*  不允许嵌套  */

#include <stdio.h>           预编译处理       
int main()
{
    printf("hello FatFaceRain \n");        语句
    return  0;
}

2.进制及进制转换

103(10) 1100111B     147(8)    67H

贪心算法:128 64 32 16 8 4 2 1

                    0    1   1   0  0 1 1 1

2.1C语言结构特点

一个源程序不论由多少个文件组成,都有且只有一个main函数。

3.数据类型

3.1数据类型的大小

sizeof关键字  计算变量或数据类型所占的字节个数

字节(byte)是计算机信息技术用于计量存储容量的一种计量单位,一个字节由8位二进制构成

76543210
//char;int;short;long int;long long;//-2 0 1 整型
//float;double;long double;        //12.32   浮点型
//bool;0 false,1 ture;                       布尔 
//void;                                      空类型,无类型
//sizeof
    printf("char size:       %d\n", sizeof(char));                  //1
    printf("short size:      %d\n", sizeof(short));                 //2
    printf("int size:        %d\n", sizeof(int));                       //4
    printf("long int size:   %d\n", sizeof(long int));             //4
    printf("long long size:  %d\n", sizeof(long long));        //8
    printf("float size:      %d\n", sizeof(float));                    //4
    printf("double size:     %d\n", sizeof(double));             //8
    printf("long double size:%d\n", sizeof(long double));  //8
    printf("bool size:       %d\n", sizeof(bool));                   //1

3.2   2^10=1KB   2^20=1MB   2^30=1GB   2^40=1TB   2^50=1PB

4.标识符,变量,常量

4.1 标识符命名规则----(1)由下划线“_”,英文字母(A-Z , a-z)和数字(0-9)构成,首字符必须是英文字母,或下划线“_”,首字符不能是数字。  (int a  char _b)

4.2变量,定义、声明

int age = 0;//初始化 (有类型----定义)

age=19;//赋值(无类型----不称作定义)

4.3变量的作用域

全局变量(::---c++中全局变量标识符)、局部变量、程序块中的变量

(向上就近原则)

4.4例:验证海伦公式(计算三角形面积)

#include <stdio.h>
#include <math.h>
int main()
{
	//a,b,c p, s;
	//sacnf a b c
	//p=;
	//s=;
	//printf s;
	float a=0.0,b=0.0,c=0.0,p=0.0,s=0.0;
	scanf("%f %f %f",&a,&b,&c);
	p=(a+b+c)/2;
	s=sqrt(p*(p-a)*(p-b)*(p-c));
	printf("三角形面积:%f\n",s);
	return  0;
}

4.4常量

1.字面常量(不可改变/不可写)

int a=2;

float  b=1.25f;

double c=12.6;

2.用#define定义的宏常量(无类型、不开辟空间、不能加 ;)----特点:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。

#define MAX 10

3.用const关键字修饰的变量,称为常变量(不可改,要初始化)。

int const x=10;
const float y=12.6;

4.枚举类型enum、枚举常量

#include <stdio.h>
enum week {mon=1,tue=2,wed=3,thu=4,fri=5,sat=6,sun=7};//枚举元素,只能是整型
int main()
{
	enum week wx;//1 2 3 4 5 6 7
	wx=mon;
	wx=sun;
	printf("%d\n",wx);
	return 0;
}

5.字符

5.1ASCII值

‘ ’---32   ‘0’---58    ‘A’---       ‘a’---97

‘  ’---字符定界     "   "---字符串定界

\---转义字符

6.顺序语句、选择语句、循环语句

6.1 if语句---单分支、双分支

6.2循环语句

while---先判断后执行

#include <stdio.h>
int main()
{
	int n=10;
	while(n>=0)
	{
		printf("%d\n",n);
		n--;
	}
	return 0;
}

do...while---先执行后判断

#include <stdio.h>
int main()
{
	int n=10;
	do
	{
		printf("%d\n",n);
		n--;
	}while(n>=0);
	return 0;
}

for循环语句

7.数组

数组是包含给定数据类型的一组数据,即一组相同数据类型元素的集合,内存中连续分配。

数组语法如下:<类型> 数组名 [元素数量];访问数组从下标0开始。

#include <stdio.h>
int main()
{
	int a[10] = {12,13,15,46,89,2,1,3,6,5 };
	for (int i =0; i <10; ++i)
	{
		printf("%d \n", a[i]);
	}
	return 0;
}

8.函数

#include <stdio.h>
#include <math.h>
float TriangleArea(float a,float b,float c)
{
	float p,s=-1;
	if((a+b)>=c&&(b+c)>=a&&(a+c)>=c)
	{
	p=(a+b+c)/2;
	s=sqrt(p*(p-a)*(p-b)*(p-c));
	}
	return s;
}
int main()
{
	float x,y,z,s;
	scanf("%f %f %f",&x,&y,&z);
	s=TriangleArea(x,y,z);
	printf("三角形面积:%f\n",s);
	return 0;
}

9.可见性(作用域)和生存期

可见性,此阶段针对编译和链接过程

进程---cpu+内存(代码区.text、数据区(存放数据,三部分---数据区.data、堆区.heap、栈区.stack(存在栈帧)))

生存期也叫生命期,此阶段针对的是程序的执行过程。

(1)局部变量生存期:函数被调用,分配存储空间,到函数执行结束,存储空间释放。存储在.stack区。

(2)全局变量的生存期:从程序开始执行,到执行后结束。存储在.data区。

(3)动态生命期

10.运算符

操作数、运算符、左值(可读可写)和右值(可读)

10.1 ?:条件运算符(与if语句等同用法)

#include <stdio.h>
int main()
{
	int a=0,b=0;
	int max=0;
	scanf("%d %d",&a,&b);
	max=a>b?a:b;//与if语句等同用法
	/*
	if(a>b)
	{
    	max=a;
	}
	else
    {
        max=b;
    }
	*/
	printf("max=%d\n",max);
	return 0;
}

10.2前置++,后置++(回写能力,单目运算)

#include <stdio.h>
int main()
{
	int a=10,b=10,x=0;
	x=++a;
	printf("x=%da=%d\n",x,a);
	x=b++;
	printf("x=%di=%d\n",x,b);
	return 0;
}

10.3取余%

(1)判断是否能够整出某个数

(2)判别奇偶数,判别质数(或素数)---一个数只能被1和自身整除

(3)计算范围,形成循环

#include <stdio.h>
int main()
{
	//abcdefghijklmnopqrstuvwxyz
	//bcdefghijklmnopqrstuvwxyza
	//.
	//.
	//.
	//zabcdefghijklmnopqrstuvwxy
	char a[]={"abcdefghijklmnopqrstuvwxyz"};
	int n=26,k;
	for(int i=0;i<n;i++)	 
	{
		k=i;
		for(int j=0;j<n;j++)
		{
			printf("%c",a[k]);
			k=(k+1)%n;
		}
		printf("\n");
	}
	printf("\n");
	return 0;
}

(4)求最大公约数:求最大公约数最常见的方法是欧几里得算法(又称辗转相除法),其计算原理依赖于定理:gcd(a,b)=(b,a mod(取模) b)

#include <stdio.h>
int main()
{
	int a=0,b=0;
	scanf("%d %d",&a,&b);
	int c=a>b?a:b;
	int i=c+1;
	while(i--)
		{
			if(a%i==0&&b%i==0)
			{
				printf("最大公约数:%d\n",i);
				break;
			}
		}
	return 0;
}
//辗转相除法
#include <stdio.h>
int main()
{
	int a=0,b=0,tmp=0;
	scanf("%d %d",&a,&b);
	while(b!=0)
	{
		tmp=a%b;
		a=b;
		b=tmp;
	}
	printf("%d\n",a);
	return 0;
}
以下是一个用C语言的SHA-1算法的示例代码: ```c #include <stdio.h> #include <stdint.h> #include <string.h> // 定义常量 #define SHA1_BLOCK_SIZE 20 // 定义函数 void sha1(const uint8_t *message, uint32_t len, uint8_t *hash) { uint32_t h[5] = {0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0}; uint32_t w[80]; uint32_t a, b, c, d, e, f, k, temp; for (int i = 0; i < len / 64; i++) { // 将消息分块 for (int j = 0; j < 16; j++) { w[j] = (message[i*64 + j*4] << 24) | (message[i*64 + j*4 + 1] << 16) | (message[i*64 + j*4 + 2] << 8) | (message[i*64 + j*4 + 3]); } for (int j = 16; j < 80; j++) { w[j] = (w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16]); w[j] = (w[j] << 1) | (w[j] >> 31); } // 初始化变量 a = h[0], b = h[1], c = h[2], d = h[3], e = h[4]; // 消息扩展和算法迭代 for (int j = 0; j < 80; j++) { if (j < 20) { f = (b & c) | (~b & d); k = 0x5A827999; } else if (j < 40) { f = b ^ c ^ d; k = 0x6ED9EBA1; } else if (j < 60) { f = (b & c) | (b & d) | (c & d); k = 0x8F1BBCDC; } else { f = b ^ c ^ d; k = 0xCA62C1D6; } temp = (a << 5) | (a >> 27); temp += f + e + k + w[j]; e = d; d = c; c = (b << 30) | (b >> 2); b = a; a = temp; } // 更新哈希值 h[0] += a; h[1] += b; h[2] += c; h[3] += d; h[4] += e; } // 输出哈希值 for (int i = 0; i < 5; i++) { hash[i*4] = (h[i] >> 24) & 0xFF; hash[i*4 + 1] = (h[i] >> 16) & 0xFF; hash[i*4 + 2] = (h[i] >> 8) & 0xFF; hash[i*4 + 3] = h[i] & 0xFF; } } int main() { uint8_t message[] = "Hello, world!"; uint8_t hash[SHA1_BLOCK_SIZE]; sha1(message, strlen(message), hash); printf("Message: %s\n", message); printf("Hash: "); for (int i = 0; i < SHA1_BLOCK_SIZE; i++) { printf("%02x", hash[i]); } printf("\n"); return 0; } ``` 该代码将输入的消息分块、进行消息扩展和算法迭代,最终输出20字节的哈希值。需要注意的是,该代码并不是SHA-1算法的最优实现,仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值