2017/11/29C语言笔记整理

来源:互联网 发布:刷黄金卷轴软件 编辑:程序博客网 时间:2024/06/05 23:54
数组


知识点


格式 
类型名int[10]+变量名arr 
即int arr[10]表示包含十个int类型元素的数组。


初始化 
完全初始化:int arr[5] = {1, 2, 3, 4, 5,}; 
注:也可以不规定数组的大小,但需要写出所有元素: 
char buf[]={“ABC”}; 
char buf[]=”ABC”; 
int a[]={1,2,3} 
部分初始化:int arr_[5] = {1, 2}; 
数组置零:int arr[5]={};


数组名左值与右值 
右值:数组名可以作为右值,表示该数组首元素的首地址。注意:arr,&arr,&arr[0]的值相同,即表达的内容相同。 
左值:数组名不可以作为左值。原因:1.数组名在编译后为常量只读。2.数组作为一个整体,没有匹配的数值与其空间对应。


传值调用 
数组名作为参数时,丢了数组本身的大小,退化成了一个指针 
数组名作为参数传递的是地址(数组首元素首地址) 
数组名作为参数,要加上元素个数


其他 
数组的下标从0开始。 
数组越界,编译器不检查,提高效率
实现
利用数组实现冒泡排序 
#include <stdio.h> 
int main(void)
{
int a;
printf("请输入要排序的数组的总长度:");
scanf("%d",&a);
int arr[a];
int i=0,j=0,temp=0;
for(i=0;i<a;i++)
{
printf("\n请输入要输入的数据:"); 
scanf("%d",&arr[i]);
}
for(i=0;i<a;i++)
{
printf(" %d",arr[i]);
}
printf("\n");
for(i=0;i<a-1;i++)
{
for(j=0;j<a-1-i;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(i=0;i<a;i++)
{
printf(" %d",arr[i]);
}
printf("\n");
return 0;




}
利用数组实现选择排序 
#include <stdio.h>
int main(void)
{
int a=0;
printf("请输入你要排序的数组长度:\n");
scanf("%d",&a);
int i=0,j=0,temp=0;
int arr[a];//数组的初始化
for(i=0;i<a;i++)
{
printf(" %d",arr[i]);

printf("\n");
for(i=0;i<a-1;i++)
{
for(j=i+1;j<a;j++)
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
printf("----------排序后----------");
for(i=0;i<a;i++)
{
printf(" %d",arr[i]);
}
printf("\n");
return 0; 

利用数组实现进制转换 
#include <stdio.h>
void fun(void)
{
int a=0,b=0;
printf("请输入要转换的正整数:\n");
scanf("%d",&a);
if(a<0)
{
return;
}
printf("请输入要转换的进制数:\n");
scanf("%d",&b);
char arr[100]={0},i=0;
do
{
arr[i]=a%b;
a=a/b;
i++;
}while(a>0);
for(i-1;i>=0;i--)
{
if(arr[i]<10)
{
printf("%d",arr[i]);
}
else
{
printf("%c",arr[i]-10+'A');
}
}
printf("\n");

int main(void)
{
fun();
return 0; 







利用传值调用完成冒泡和选择排序 
#include <stdio.h>
void maopao(int arr[],int lenth)
{
int i=0,j=0,temp=0;
for(i=0;i<lenth;i++)
printf(" %d",arr[i]);
putchar(10);
printf("----------排序后---------\n");
for(i=0;i<lenth-1;i++)
{
for(j=0;j<lenth-1-i;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(i=0;i<lenth;i++)
printf(" %d",arr[i]);
printf("\n");
}
void xuanze(int arr[],int lenth)
{
int i=0,j=0,temp=0;
for(i=0;i<lenth;i++)
printf(" %d",arr[i]);
putchar(10);
printf("----------排序后---------\n");
for(i=0;i<lenth-1;i++)
{
for(j=i+1;j<lenth;j++)
{
if(arr[i]>arr[j])
{
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
for(i=0;i<lenth;i++)
printf(" %d",arr[i]);
printf("\n");
}


int main(void)
{
int arr[5]={5,4,3,2,1};
maopao(arr,5);
xuanze(arr,5);
return 0;
}




利用传值调用完成数组元素调换 
#include <stdio.h>
void func_show_arr(int arr[],int lenth)
{
int i=0;
for(i=0;i<lenth;i++)
{
printf(" %d",arr[i]);
}
putchar(10);
}
void diaohuan(int arr[],int lenth)
{
int i=0,temp=0;
for(i=0;i<lenth/2;i++)
{
temp=arr[lenth-1-i];
arr[lenth-1-i]=arr[i];
arr[i]=temp;
}
printf("\n");
}
int main(void)
{
int arr[5]={1,2,3,4,5};
func_show_arr(arr,5);
diaohuan(arr,5);
func_show_arr(arr,5);
return 0;
}
利用传值调用完成二分查找 
方法一:循环 
#include <stdio.h>
int search_arr_element(int arr[],int left,int right,int data)
{
int mid=0;
while(left<=right)
{ mid=(left+right)/2;
if(data>arr[mid])
{
left=mid+1;
}
else if(data<arr[mid])
{
right=mid-1;
}
else
{
printf("你要查找的数%d的下标为%d\n",data,mid);
return mid;
}
}
printf("%d这个数不存在\n",data);
return -1;
}
int main(void)
{
int data=0;
int arr[5]={1,2,3,4,5};
data=search_arr_element(arr,0,4,2);
// printf("%d\n",data);


return 0;
}
方法二:递归 
#include <stdio.h>
void search(int arr[],int left,int right,int data)
{
int mid=(right+left)/2;
if(data==arr[mid])
{
printf("你要进行查找的数%d的下标为%d\n",data,mid);
return;
}
if(right<left)
{
printf("没有你要查找的数%d",data);
return;
}
if(data>arr[mid])
{
search(arr,mid+1,right,data);
}
if(data<arr[mid])
{
search(arr,left,mid-1,data);
}
}
int main(void)
{
int arr[5]={12,17,28,31,56};
search(arr,0,4,2);
return 0;
}
利用传值调换完成数组循环右移
#include <stdio.h>
void func(char arr[],int steps)
{

int i=0,temp=0,lenth=0,j=0;
while(arr[i]!='\0')
{
i++;
}
lenth=i;
for(i=0;i<steps;i++)
{
temp=arr[lenth-1];
for(j=lenth-1;j>0;j--)
{
arr[j]=arr[j-1];
}
arr[0]=temp;
}
return;
}
int main(void)
{
int steps=0;
char arr[]="12345678";
printf("请输入你要进行移动的位数:\n");
scanf("%d",&steps);
printf("arr[%s]\n",arr);
func(arr,steps);
printf("arr[%s]\n",arr);
return 0;
}
利用函数调用查找数组中数最大的数
#include <stdio.h>
int find_max_data(int arr[],int lenth,int *p)
{
int i=0,max=arr[0];
for(i=0;i<lenth;i++)
{
if(arr[i]>max)
{
max=arr[i];
*p=i;
}
}
return max;
}
int main(void)
{
int lenth,i,max;
printf("请输入你要查找的数组的长度:\n");
scanf("%d",&lenth);
int arr[lenth];
printf("请输入你要查找的数组元素:\n");
for(i=0;i<lenth;i++)
{
scanf("%d",&arr[i]);
}
max=find_max_data(arr,lenth,&i);
printf("此数组中最大数为%d下标为%d\n",max,i);

字符串


知识点


所有的字符串都是以字符数组的形式存储在内存中。


char *类型指向常量字符串 
char a[]类型填写变量字符串
此时p1=p2,因为两个char *格式的变量都指向了同一个常量区的字符串“123“
此时str1!=str2,因为两个char型数组指向了不同的存在于栈中的字符串“123“
原创粉丝点击