C语言学习练习代码

#define  _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include 
#include 
#include 
#include 

//练习54:ferror函数使用
int main()
{
	int c;//注意:int ,非char,要求处理EOF
	FILE* fp=fopen("test,txt","r");
	if(!fp)
	{
		perror("File opening failed");
		return -1;
	}
	//fgetc当读取失败的时候或者遇到文件结束的时候,都会返回EOF
	while((c = fgetc(fp)!= EOF))//标准C I/O读取文件循环
	{
		putchar(c);
	}
	//判断是什么原因结束的
	if(ferror(fp))
		puts("I/O error when reading");
	else if(feof(fp))
		puts("End of file reached successfully");
	//关闭文件
	fclose(fp);
	fp == NULL;
	return 0;
}

//练习53:perror函数使用,报错信息提示自定义
int main()
{
	//strerror-把错误码对应的错误信息的字符串地址返回
	//printf("%s\n",streeror);

	//perror
	FILE* pf = fopen("test2.txt","r");
	if(pf == NULL)
	{
		perror("hehe");//不需要传送错误码信息,hehe:错误信息
		return 0;
	}
	//读文件

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

练习52:文件的随机读取
//fseek和ftell和fwind
int main()
{
	char ch;
	//打开文件
	FILE* pf = fopen("test.txt","r");
	if(pf == NULL)
	{
		return 0;
	}
	//定义文件指针
	fseek(pf,2,SEEK_CUR);
	//读取文件
	ch= fgetc(pf);
	printf("%c\n",ch);//%c打印字符
	//关闭文件
	fclose(pf);
	pf=NULL;

	return 0;
}
int main()
{
	int pos = 0;
	//打开文件
	FILE* pf=fopen("test.txt","r");
	if(pf == NULL)
	{
		return 0;
	}
	//定位文件指针
	fseek(pf,-2,SEEK_END);
	pos = ftell(pf);
	printf("%d\n",pos);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}



练习51:二进制读写函数fread和fwrite
struct S 
{
	char name[20];
	int age;
	double score;
};
int main()
{
	struct S s={"张丹",20,21.5};
	FILE* pf=fopen("test.txt","wb");//以二进制形式写入
	if(pf == NULL)
	{
		return 0;
	}
	//二进制形式写文件
	fwrite(&s,sizeof(struct S),1,pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

int main()
{
	struct S temp={0};
	FILE* pf=fopen("test.txt","rb");//以二进制形式读取
	if(pf == NULL)
	{
		return 0;
	}
	//二进制形式读文件
	fread(&temp,sizeof(struct S),1,pf);
	printf("%s %d %lf\n",temp.name,temp.age,temp.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

//练习50:sscanf和sprintf
struct S
{
	int n;
	float score;
	char arr[10];
};

int main()
{
	struct S s={100,3.14f,"abcdef"};
	struct S tmp={0};
	char buf[1024]={0};

	sprintf(buf,"%d %f %s",s.n,s.score,s.arr);
	printf("%s\n",buf);
	sscanf(buf,"%d %f %s",&(tmp.n),&(tmp.score),&(tmp.arr));
	printf("%d %f %s\n",tmp.n,tmp.score,tmp.arr);
	return 0;
}


//练习49:文件操作2
//格式化输入输出函数fprintf();fscanf();
struct S
{
	int n;
	float score;
	char arr[10];
};
 int main()
 {
	 struct S s={100,3.14f,"bit"};
	 //打开文件
	 FILE* pf=fopen("test.txt","w");
	 //判断
	 if(pf == NULL)
	 {
		 return 0;
	 }
	 //格式化形式写文件
	 fprintf(pf,"%d %f %s",s.n,s.score,s.arr);
	 //关闭文件
	 fclose(pf);
	 pf = NULL;
	 return 0;
 }

//练习48:文件操作1
int main()
{
	int a=10000;
	FILE* pf=fopen("text.text","wb");
	fwrite(&a,4,1,pf);//二进制的形式写到文件中
	fclose(pf);
	pf=NULL;
	return 0;
}
int main()
{
	//打开二进制文件test.text.fopen打开
	//相对路径
	fopen("test.txt","r");
	//绝对路径,\要再加一个\进行转义
	fopen("D:\\C\\Review\\test11_24\\Project1\\test.txt","r");
	//..表示上一级路径
	//.表示当前路径
	fopen("..\\..\\test.txt","r");
	return 0;
}

int main()
{
	FILE* pf=fopen("text.txt","r");//文件指针接收返回值
	//判断是否打开成功,打开失败会返回null空指针
	if(pf == NULL)
	{
		printf("%s\n",strerror(errno));
		return 0;
	}
	else
	{
		printf("打开文件成功!\n");
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

//顺序读文件
int main()
{
	//打开或建立文件
	FILE* pfwrite = fopen("test.txt","w");
	//判断文件是否打开成功
	if(pfwrite == NULL)
	{
		printf("%s\n",strerror(errno));
	}
	//写文件
	fputc('b',pfwrite);
	fputc('i',pfwrite);
	fputc('t',pfwrite);

	//关闭文件
	fclose(pfwrite);
	pfwrite = NULL;
	return 0;
}

//顺序写文件
int main()
{
	FILE* pfread = fopen("test.txt","r");
	if(pfread == NULL)
	{
		printf("%s\n",strerror(errno));
		return 0;
	}
	//读文件
	printf("%c",fgetc(pfread));
	printf("%c",fgetc(pfread));
	printf("%c",fgetc(pfread));
	printf("\n");
	//关闭文件
	fclose(pfread);
	pfread = NULL;
	return 0;
}

//键盘-标准输入设备-stdout
//屏幕-标准输出设备-stdin
//是一个程序默认打开的两个流设备
//程序默认打开3个。分别是
//stdin FILE*//stdout FILE*//stderr FILE*
int main()
{
	int ch = fgetc(stdin);
	fputc(ch,stdout);
	return 0;
}

读取一行字符串
int main()
{
	//读取字符串的送往地址
	char buf[1024]={0};
	//打开文件
	FILE* pf=fopen("test.txt","r");
	//判断
	if(pf == NULL)
	{
		printf("%s\n",strerror(errno));
		return 0;
	}
	//读取
	fgets(buf,1024,pf);
	printf("%s\n",buf);

	fclose(pf);
	pf=NULL;

	return 0;
}

int main()
{
	//打开文件
	FILE* pf=fopen("test.txt","w");
	//判断
	if(pf == NULL)
	{
		printf("%s\n",strerror(errno));
		return 0;
	}
	//写入
	fputs("hello\n",pf);
	fputs("hello\n",pf);

	fclose(pf);
	pf=NULL;

	return 0;
}

int main()
{
	//从键盘读取一行文本信息
	char buf[1024]={0};
	fgets(buf,1024,stdin);//标准输入读取
	fputs(buf,stdout);//输出到标准输出流
//---------------
//	gets(buf);
//	puts(buf);
	return 0;
}

//练习47:柔性数组的使用2
struct S
{
	int n;
	int* arr;
};
int main()
{
	int i=0;
	int * ptr;
//动态开辟空间,分别两次
	struct S* ps=(struct S*)malloc(sizeof(struct S));
	ps->arr = (int *)malloc(5*sizeof(int));
	
	for(i=0;i<5;i++)
	{
		ps->arr[i]=i;
	}
	for(i=0;i<5;i++)
	{
		printf("%d ",ps->arr[i]);
	}
	printf("\n");
	//调整大小
	ptr=(int *)realloc(ps->arr,10*sizeof(int));
	if(ptr !=NULL)
	{
		ps->arr =ptr;
	}
	for(i=5;i<10;i++)
	{
		ps->arr[i]=i;
	}
	for(i=0;i<10;i++)
	{
		printf("%d ",ps->arr[i]);
	}
	//释放内存
	free(ps->arr);
	ps->arr =NULL;
	free(ps);
	ps=NULL;
	return 0;
}

//练习46:柔性数组的使用1
//优点:流程不易出错,方便内存释放,连续开辟一块动态内存,访问效率更高
struct S
{
	int n;
	int arr[];//大小可以调整,或者写为int arr[0];
};
int main()
{
	struct S*ps=(struct S*)malloc(sizeof(struct S)+5*sizeof(int));
	ps->n=100;
	int i=0;
	for(i=0;i<5;i++)
	{
		ps->arr[i]=i;
	}
	struct S* ptr=realloc(ps,44);
	if(ptr != NULL)
	{
		ps=ptr;
	}
	for(i=5;i<10;i++)
	{
		ps->arr[i]=i;
	}
	for(i=0;i<10;i++)
	{
		printf("%d",ps->arr[i]);
	}
	return 0;
}

//练习45:动态内存使用错误---非法访问内存
//返回栈空间地址的问题,局部变量
char *GetMemory(void)
{
	char p[]="hello world";//局部数组,在函数外之外生命周期结束了
	return p;
}
void Test(void)
{
	char* str=NULL;
	str=GetMemory();
	printf(str);
}
int main()
{
	Test();
	return 0;
}

//练习44:动态内存空间没有释放,内存泄露(错误示例)
void GetMemory(char* p)
{
	p=(char*)malloc(100);
}
void Test(void)
{
	char *str=NULL;
	GetMemory(str);
	strcpy(str,"hello world");
	printf(str);//没有错误,同printf("abcdef");
}
int main()
{
	Test();
	return 0;
}
//1、运行代码程序会出现崩溃现象
//2、程序存在内存泄漏的问题
//str以值传递的形式给p
//p是GetMemory函数的形参,只能函数内部有效,等GetNemory函数返回之后,动态开辟内存尚未释放并且
//无法找到,所以会造成内存泄露

改正1---传地址
void GetMemory(char** p)
{
	*p=(char*)malloc(100);
}
void Test(void)
{
	char *str=NULL;
	GetMemory(&str);
	strcpy(str,"hello world");
	printf(str);//没有错误,同printf("abcdef");
}
int main()
{
	Test();
	return 0;
}
改进2:使用return

//练习43:模拟实现memmove,处理内存重叠情况
//根据src和dest的大小来选择从前向后拷贝还是从后向前拷贝
//这个会报错,有问题,可修改的左值,迷惑,,,
void* my_memmove(void* dest, const void* src,size_t num)
{
	void* ret=dest;
	//
	assert(dest);
	assert(src);
	//判断
	if(dest < src)//从前向后
	{
		while(num--)
		{
			*(char*)dest = *(char*)src;
			++(char*)dest;
			++((char*)src);
		}
	}
	else
	{
		while(num--)
		{
			(*(char*)dest+num) = *((char*)src+num);
		}
	}

	return ret;
}
int main()
{
	int i=0;
	int arr1[]={1,2,3,4,5,6,7,8,9,10};
	my_memmove(arr1,arr1+3,3);
	for(i=0;i<10;i++)
	{
		printf("%d ",arr1[i]);
	}
	printf("\n");
	return 0;
}

//练习42:模拟实现memcpy
void* my_memcpy(void* dest,const void* src,size_t num)//size_t就是unsigned int
{
	void* ret = dest;
	//指针判断
	assert(dest);
	assert(src);
	//void*不能进行解引用,必须先强制转化
	while(num--)
	{
		*(char*)dest = *(char*)src;
		++(char*)dest;
		++(char*)src;
	}
	return ret;
}
struct S{
	char name[20];
	int age;
};
int main()
{
	struct S arr1[]={{"zhangsan",20},{"lisi",25}};
	struct S arr2[3]={0};
	my_memcpy(arr2,arr1,sizeof(arr1));//num为整个数组的长度,单位为字节
	return 0;
}

//练习41:strtok函数的使用,分割[email protected]
int main()
{
	char str[]={"[email protected]"};
	char p[]={"@."};
	char* ret=0;
	//调用strtok函数会破坏原字符串,因此需要赋值
	char buf[256]={0};
	strcpy(buf,str);
	//调用切割
	ret=NULL;
	for(ret = strtok(str,p);ret != NULL;ret = strtok(NULL,p))
	{
		printf("%s\n",ret);
	}
	return 0;
}

//练习40:模拟实现strstr寻找子串函数
//难!!考虑全面
char * my_strstr(char* p1,char* p2)
{
	char* s1 = p1;
	char* s2 = p2;
	char* cur = p1;
	assert(p1 !=NULL);
	assert(p2 !=NULL);
	if(*p2 == '\0')
	{
		return p1;
	}
	while(*cur)
	{
		s1 = cur;
		s2 = p2;
		while((*s1 != '\0')&&(*s2 !='\0')&&(*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if(*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;

}

int main()
{
	char p1[]={"abcedf"};
	char p2[]={"ced"};
	char* ret=0;
	ret=my_strstr(p1,p2);
	if(ret != NULL)
	{
		printf("成功\n");
	}
	return 0;
}

//练习39:模拟实现strcmp函数
int my_strcmp(const char* str1,const char*str2)
{
	assert(str1);
	assert(str2);
	while(*str1 == *str2)
	{
		if(*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	if(*str1 > *str2)
	{
		return 1;
	}
	else
	{
		return -1;
	}
}
return (*str1 - *str2);
int main()
{
	int ret=0;
	char p1[]={"zbcedfg"};
	char p2[]={"xyz"};
	ret=my_strcmp(p1,p2);
	printf("%d\n",ret);
	return 0;
}

//练习38:实现追加字符串函数模拟实现
//strcat
char* my_strcat(char* dest,const char* src)
{
	char* ret=dest;
	//1、找到目标字符串的\0
	while(*dest != '\0')
	{
		dest++;
	}
	//2、复制
	while(*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[30]={"hello"};
	char arr2[]={"world"};
	char* temp=0;
	temp=my_strcat(arr1,arr2);
	printf("%s\n",temp);
	return 0;
}

//练习37:在杨氏矩阵中寻找一个数字
//杨氏矩阵:每行每列都是递增
//要求:时间复杂度小于0(N)
//使用矩阵右上角或者左下角元素进行收缩,每次判断去掉一行或一列
//形参处必须声明,接收数组的大小,行列
int FindNum(int arr[3][3],int k,int row,int col)
{
	int x=0;
	int y=col-1;
	//确定右上角元素坐标
	while((x<=2)&&(y>=0))
	{
		if(arr[x][y]k)
		{
			y--;
		}
		else
		{
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
	int ret=0;
	//封装一个函数,先设定再实现
	ret=FindNum(arr,7,3,3);
	if(ret==1)
	{
		printf("找到了!\n");
	}
	else
	{
		printf("找不到!\n");
	}
	return 0;
}
//改进:可以通过&x,&y返回型参数来带回坐标值


//练习36:判断两个字符串,是否由左旋关系
//abcdefgabcdefg包含左旋后的所有情况--因此寻找此字串
//
int is_move(char* arr1,char* arr2)
{
	int len1=0;
	int len2=0;
	char* temp=NULL;
	//空指针判断
	assert(arr1);
	assert(arr2);
	//1、追加字符串
	len1=strlen(arr1);
	len2=strlen(arr2);
	if(len1 != len2)
	{
		return 0;
	}
	strncat(arr1,arr1,len1);
	//2、判断子串
	temp=strstr(arr1,arr2);
	if(temp==NULL)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
int main()
{
	//不能给常量字符串,要以数组形式,可以改变
	char arr1[20]={"abcdef"};//arr1[]不能空着,一定要开辟足够大的空间
	char arr2[]={"defabc"};
	int ret=0;
	ret=is_move(arr1,arr2);
	if(ret==1)
	{
		printf("YES!\n");
	}
	else
	{
		printf("NO!\n");
	}
	return 0;
}


练习35:左旋字符串
不能使用常量字符串,因为不能被修改,应该使用数组

//1、暴力求解法
void l_rotate(char *arr,int k)
{
	int len=0;
	char temp='0';
	int i=0;
	//传入参数有指针,判断assert
	assert(arr);
	len=strlen(arr);//到0停止,不包含0
	for(i=0;i=2)&&(j>=1))
			{
				arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
			}
		}
	}
	//打印
	for(i=0;i<10;i++)
	{
		for(j=0;j<=i;j++)
		{
			printf("%d ",arr[i][j]);
			
		}
		printf("\n");
	}
	return 0;
}

//练习31:调整数组内容使奇数全部位于偶数前面
//有一些问题,arr[left]和arr[right]
//数组:1 2 3 4 5 6 7 8 9 10

void move(int *arr,int size)
{
	int *left=arr;
	int *right=arr+size-1;
	while(left=2)
	{
		total += empty/2;
		empty=empty/2+empty%2;
	}
	printf("汽水数为:%d\n",total);
	return 0;
}


//练习29:找出1-10000的水仙花数
int main()
{
	int i=0;
	//1、产生1-10000数字
	for(i=0;i<100000;i++)
	{
		int n=1;//记录每个i的位数
		int tmp=i;
		int ret=0;
		//2、判断i
		//123/10 n++
		//12/10 n++
		//1/10=0
		while(tmp/=10)
		{
			n++;
		}
		//3、计算每位数的n次方之和
		//得到每位数字%10
		tmp=i;
		while(tmp)
		{
			ret=ret+pow(tmp%10,n);
			tmp/=10;
		}
		
		//4、判断是否等于i,即为水仙花数
		if(ret==i)
		{
			printf("%d ",i);
		}
	}
	return 0;
}

//练习28:计算实现a+aa+aaa+aaaa+……
int main()
{
	int a=0;
	int n=0;
	int sum=0;
	int i=0;
	int ret=0;
	printf("请输入a和n:\n");
	scanf("%d%d",&a,&n);	
	for(i=0;i=1)
		{
			printf("请输入两个操作数:");
			scanf("%d%d",&x,&y);
			ret = pa[input](x,y);
			printf("结果是:%d\n",ret);
		}
		else if(input == 0)
		{
			printf("退出\n");
			break;
		}
		else
		{
			printf("选择错误\n");
		}
	}while(input);
	return 0;
}

//函数指针数组
int Add(int x,int y)
{
	return x + y;
}
int Sub(int x,int y)
{
	return x - y;
}
int Mul(int x,int y)
{
	return x * y;
}
int Div(int x,int y)
{
	return x / y;
}

int main()
{
	//指针数组
	int * arr[5];
	//需要一个数组,这个数组可以存放4个函数的地址-函数指针的数组
	int (*pa)(int,int)=Add;
	int (*parr[4])(int,int)={Add,Sub,Mul,Div};//函数指针的数组
	int i=0;
	for(i=0;i<4;i++)
	{
		printf("%d\n",parr[i](2,3));
	}
	return 0;
}


//二级指针传参
void test(char **p)
{
}
int main()
{
	char c='b';
	char*pc=&c;
	char**ppc=&pc;
	char* arr[10];
	test(&pc);//可以传一维指针的地址
	test(ppc);//一维指针的指针
	test(arr);//一维指针数组的数组名
	return 0;
}

二维数组传参
void test(int *arr)//err
{
}
void test(int* arr[5])/err
{
}
void test(int (*arr)[5])//right
{
}
void test(int **arr)//err
{
}
int main()
{
	int arr[3][5]={0};
	test(arr);
}

//一维数组传参
#include 
 void test(int arr[])
 {
 }
void test(int arr[10])
{
}
void test(int *arr)
{
}
void test2(int *arr[20])
{
}
void test2(int **arr)
{
}
int main()
{
	int arr[10]={0};
	int *arr2[20]={0};
	test(arr);
	test2(arr2);
	return 0;
}


练习25:判断大端小端字节序存储模式
指针类型决定指针解引用可以访问的字节数
版本1
int main()
{
	int a=1;
	char* p=(char*)&a;
	if(*p == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}
//版本2:使用函数,精简
int check_sys()
{
	int a=1;
	return *(char*)&a;
}

int main()
{
	int ret=0;
	//定义一个函数,返回值为1即为小端;返回值为0即为大端
	ret=check_sys();
	if(ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

//练习24:使用指针实现strcpy
void my_strcpy(char* des,char*src)
{
	while(*src!='\0')
	{
		*des=*src;
		des++;
		src++;
	}
	*des=*src;
}
///改进1:更加精简,判断条件更精妙
void my_strcpy(char* des,char*src)
{
	while(*des++=*src++)
	{
		;	
	}
}
///改进2:先判断指针的有效性,避免程序出问题,但是容易隐匿错误
void my_strcpy(char* des,char*src)
{
	if(des != NULL && src!= NULL)
	{
		while(*des++=*src++)
		{
			;	
		}
	}
}
///改进3:使用assert()断言,发现错误时,及时报错
//包含头文件
#include 
void my_strcpy(char* des,char*src)
{
	assert(des != NULL);//断言,符合条件时继续执行,不符合时报错提示
	assert(src != NULL);//断言判断!!

	while(*des++=*src++)
	{
		;	
	}
}

改进4:使用const,char*
包含头文件,加上返回函数,函数功能更丰富
#include 
char* my_strcpy(char* des,const char*src)
{
	char* ret=des;
	assert(des != NULL);//断言,符合条件时继续执行,不符合时报错提示
	assert(src != NULL);//断言判断!!

	while(*des++=*src++)
	{
		;	
	}
	return ret;
}

int main()
{
	char arr1[]={"#####################"};
	char arr2[]={"bit"};
	my_strcpy(arr1,arr2);
	printf("%s\n",arr1);
	return 0;
}


//练习23:递归计算N的K次方
//n^k=n*n^(k-1)
double Power(int n,int k)
{
	if(k<0)
		return 1.0/Power(n,(-k));
	else if(k==0)
		return 1.0;
	else
		return n*Power(n,k-1);
}
int main()
{
	int n=0;
	int k=0;
	double ret=0.0;
	scanf("%d%d",&n,&k);
	ret=Power(n,k);
	printf("%lf\n",ret);
	return 0;
}

//练习22:使用递归来计算一个非负整数各位数字之和
//1729
//DigitSum(172)+9%10
//DigitSum(17)+2%10+9%10
//DigitSum(1)+7%10+2%10++9%10
//1%10+7%10+2%10++9%10
int DigitSum(int num)
{
	int count=0;
	if(num>9)
		return count=DigitSum(num/10)+num % 10;
	else
		return num;
}

int main()
{
	int num=0;
	int sum=0;
	printf("请输入数字:");
	scanf("%d",&num);
	sum=DigitSum(num);
	printf("%d\n",sum);
	return 0;
}

//练习21:分别打印二进制数中的奇数位和偶数位
//32:0000000000000000000000000000000011

void print(int m)
{
	int i=0;
	printf("偶数位:\n");
	for(i=30;i>=0;i=i-2)
	{
		printf("%d ",(m>>i)&1);
	}
	printf("\n");
	printf("奇数位:\n");
	for(i=31;i>=0;i=i-2)
	{
		printf("%d ",(m>>i)&1);
	}
	printf("\n");
}
int main()
{
	int num=0;
	printf("请输入数字:\n");
	scanf("%d",&num);
	print(num);
	return 0;
}


//练习20:数一个二进制数中的1的个数
//这个是最优解!!!!!
//n=n&(n-1)的次数,直至n!=0
//这个循环可以执行的次数=二进制中的1的个数

//计算子函数
//int count_bit_one(int n)
//{
//	int count=0;
//	while(n)
//	{
//		n=n&(n-1);
//		count++;
//	}
//	return count;
//}

//练习19:数组练习
//自己写函数实现1、数组元素初始化
//2、打印数组元素
//3、reverse逆序排列数组元素

//初始化函数
void Init(int arr[],int size)
{
	int i=0;
	for(i=0;i>i)&1))
		{
			count++;
		}
	}
	printf("%d\n",count);
	return 0;
}


//练习16:冒泡排序法,升序排序
//冒泡排序函数
//数组传过去的是数组首元素的地址,&arr[0]
//arr[]为一个指针
void bubble_sort(int arr[],int size)
{
	//这个数组元素为size=9,需要排8趟,size-1
	int i=0;
//采用flag对冒泡排序进行算法优化
	for(i=0;iarr[j+1])
			{		
				int temp=0;
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
                flag=0;
			}
		}
      if(flag==1)
      {
           break;
       }
	}
}
//主函数
int main()
{
	int arr[]={9,8,11,6,5,4,20,2,1};
	int size=0;
	int i=0;
	size=sizeof(arr)/sizeof(arr[0]);
	//排序函数
	bubble_sort(arr,size);
	for(i-0;i10)
	{
		print(input/10);
	}
	printf("%d ",input%10);
}
int main()
{
	int input;
	printf("请输入数字:\n");
	scanf("%d",&input);
	//函数调用
	print(input);
	return 0;
}



//练习12:
//猜数字游戏

//游戏(子函数)
void game()
{
	int ret=0;
	int guess=0;
	printf("欢迎来到猜数字游戏!\n");
	printf("请输入猜测数字:\n");
	//系统随机生成随机数
	//利用不断随时间变化的时间戳来作为生成随机数的变化变量
	//time()函数可以获取系统时间戳,NULL为空指针
	srand((unsigned int)time(NULL));
	ret=rand();
	ret = ret%100;	
	//printf("%d\n",ret);
	do
	{
		scanf("%d",&guess);
		if(guess>ret)
		{
			printf("猜大了\n");
		}
		else if(guess到sqrt->到在非偶数中找素数
//注意提高代码的效率,培养自己的代码思想
int main()
{
	int i=0;
	int j=0;
	int count=0;
	for(i=101;i<=200;i+=2)
	{
		for(j=2;j<= sqrt(i);j++)
		{
			if(i%j==0)
			{
				break;
			}
		}
		if(j> sqrt(i))
		{
			printf("%d ",i);
			count++;
		}
	}
	printf("\ncount=%d ",count);
	return 0;
}



//练习8:判断输出1000到2000内的闰年
//闰年的判断
//1、被4整除同时不被100整除
//2、被400整除
int main()
{
	int count=0;
	int i=0;
	for(i=1000;i<=2000;i++)
	{
		if(((i%4==0) && (i%100!=0))||(i%400==0))
		{
			count++;
			printf("%d ",i);
		}
	}
	printf("\n,count=%d",count);
	return 0;
}

//练习7:求出两个数的最大公约数
//辗转相除法
int main()
{
	int m=0;
	int n=0;
	int r=0;
	printf("请输入2个数字:\n");
	scanf("%d%d",&m,&n);
///程序效率会更高
wile(r=m%n)
	while(m%n)
	{
		r=m%n;
		m=n;
		n=r;
	}
	printf("最大公约数为%d",n);
}


//练习6:输出1至100中3的倍数
//!!!!!!!有一点疑问,怎么控制逢5换行
int main()
{
	int i=0;
	int j=0;
	for(i=0;i<=100;i++)
	{
		if(i%3 ==0)
		{
			j++;
			printf("%d ",i);
		}
		if(j%5 == 0)
			printf("\n");
	}
	printf("\n");
	return 0;
}





//练习5:比较3个数中的最大,中,最小
//按从大到小的顺序输出

int main()
{
	int a=0;
	int b=0;
	int c=0;
	printf("请输入3个数字:\n");
	scanf("%d%d%d",&a,&b,&c);

	if(aarr[mid])
		{
			left=mid+1;
		}
		else if(mright)
	{
		printf("找不到!\n");
	}
	return 0;
}




//练习题3,在一个有序数组中查找某一个数字,
//第一种方法:按序查找
int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9};
	int i=0;
	int m=0;
	int num=0;
	num=sizeof(arr)/sizeof(arr[0]);//确定数组元素个数
	printf("请输入需要查找的数字:");
	scanf("%d",&m);
	for(i=0;i

你可能感兴趣的:(c语言)