C 语言基础实例

linux安装gcc
linux下使用gcc编译c:
gcc test.c -o test
或者
gcc test.c -o test -lm(使用math里面的库的时候可能编译出错undefined reference to `sqrt’,需要加上-lm 连接math库)
调用编译好的文件
./test

#include<stdio.h>
#include <string.h>
#include <math.h>
/*输出前N项的斐波那契数*/
void feibo(int n){
	int first=1,next=2;
	int i,now;
	for(i=3;i<n;i++){
		 now=first+next;
		 first=next;
			next=now;
			printf("第&d个斐波那契数列是%d\n",i,now);
	}
}
/*求2个数的最大公约数*/
int maxDivNum(int first,int sed){
	int i=first;
	if(sed<first){
		i=sed;
	}
	for(;i>0;i--){
		if(first%i==0 && sed%i==0){
			return i;
		}
	}
	return 1;
}
/*求2个数的最小公倍数*/
int minDivNum(int first,int sed){
	int i=first;
	if(sed>first){
		i=sed;
	}
	for(;i<first*sed;i++){
		if(i%first==0 && i%sed==0){
			return i;
		}
	}
	return i;
}
/*阶乘*/
int factorial(int n){
	int i=2;
	int res=1;
	for(;i<=n;i++){
		res*=i;
	}
	return res;
}
/*循环输出字母*/
void printWorld(){
	char i='A';
	for(;i<='Z';i++){
		printf("字母为%c",i);
	}
}
/*判断该整数数字是几位数。*/
int isHowMany(int num){
	int res=1;
	while((num/=10)>=1){
		res++;
	}
	return res;
}
/*计算一个数的 n 次方*/
long n2index(int n,int index){
	int i=0;
	long res=1;
	for(;i<index;i++){
		res=res*n;
	}
	return res;
}
/*判断回文数0是,1不是*/
int isPalindrome(char str[],int len){
	int start=0;
	int end=len-1;
	while(start<end){
		if(str[start++]!=str[end--]){
			return 1;
		}
	}
	return 0;
}
/*判断一个数是否为质数0是,1不是*/
int isprime(int n){
	int i;
	for(i=2;i<=sqrt(n);i++){
		if(n%i==0){
			return 1;
		}
	}		
	return 0;
}
/*s到end之间的质数*/
void printFromS2E(int s,int end){
	int i=s;
	for(;i<=end;i++){
		if(isprime(i)==0){
			printf("当前的质数为%d",i);
		}
	}
}
/*判断Armstrong数(阿姆斯壮数)153=1^3+5^3+3^3
1634=1^4+6^4+3^4+4^4*/
int isArmstrong(int n){
	int len=isHowMany(n);
	int sum=0;
	int t=n;
	while(n>0){
		sum+=pow(n%10,len);
		n=n/10;
	}
	if(sum==t){
		return 0;
	}
	return 1;
}
/*打印一个整数的所有因数*/
void printAllFactor(int n){
	int i=1;
	for(;i<=n;i++){
		if(n%i==0){
			printf("我是因数%d呢\n",i);
		}
	}
}

/*打印佛洛依德三角n
	1
    2    3
    4    5    6
    7    8    9   10
   11   12   13   14   15*/
void printFrod(int n){
	int i=0,j=0,count=1;
	while(count<n){
		i++;
		for(j=0;j<i;j++){
			printf("%d ",count++);
		}
		printf("\n");
	}
}
/*杨辉三角,  
1
1   1
1   2   1
1   3   3    1
1   4    6   4   1
1   5   10   10  5   1 打印前row行杨辉三角*/
void yanghuiAngle(int row){
	int i,j,k;
	int temp[row];
	temp[0]=1;
	for(i=0;i<row;i++){
		for(k=row-i;k>0;k--)printf(" ");
		for(j=i-1;j>0;j--){
			temp[j]=temp[j]+temp[j-1];
		}
		temp[i]=1;
		for(j=0;j<=i;j++){
			printf("%d ",temp[j]);
		}
		printf("\n");
	}
}
/*数字金字塔1
      2 3 2
    3 4 5 4 3
  4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5*/
void printNum(int row){
	int i,j; 
	for(i=1;i<=row;i++){
		for(j=row-i;j>0;j--)printf("  ");
		for(j=i;j<2*i;j++)printf("%d ",j);
		for(j=j-2;j>=i;j--)printf("%d ",j);
		printf("\n");
	}
}
void printNum10(){
	int i,j;
	for(i=1;i<=10;i++){
		for(j=10;j<100;j+=10){
			printf("  %d ",i+j);
		}
		printf("\n");
	}
}
void printNum101(){
	int i,j;
	for(i=2;i<=10;i++){
		for(j=i;j<=i*10;j+=i){
			printf("  %d ",j);
		}
		printf("\n");
	}
}
/*二进制转10进制*/
int binary2Decimal(long n){
	int res=0,i=0,oz=0;
	while(n>0){
		oz=n%10;
		res=res+oz*pow(2,i++);
		n=n/10;
		printf("n为%d\n",n);
	}
	return res;
}
/*十进制转二进制*/
long long decimal2Bin(int n){
	int res=0,i=1,oz=0;
	while(n>0){
		oz=n%2;
		res+=oz*i;
		i=i*10;
		n=n/2;
	}
	return res;
}
/*八进制转十进制*/
int octal2decimal(long long n){
	int res=0,i=0,oz=0;
	while(n>0){
		oz=n%10;
		res+=oz*pow(8,i);
		i++;
		n=n/10;
	}
	return res;
}
/*十进制转八进制*/
long long decimal2octal(int n){
	int res=0,i=1,oz=0;
	while(n>0){
		oz=n%8;
		res+=i*oz;
		n=n/8;
		i=i*10;
	}
	return res;
}
/*八进制转二进制*/
long long octal2bin(long long n){
	int res=0,i=0,oz=0;
	/*八转十*/
	while(n>0){
		oz=n%10;
		res+=oz*pow(8,i);
		n=n/10;
		i++;
	}
	n=res;
	res=0,i=1,oz=0;
	/*十转二*/
	while(n>0){
		oz=n%2;
		res+=oz*i;
		n=n/2;
		i=i*10;
	}
	return res;
}
/*二进制转八进制*/
long long bin2octal(long long n){
	int res=0,i=0,oz=0;
	/*二转十*/
	while(n>0){
		oz=n%10;
		res+=oz*pow(2,i);
		i++;
		n=n/10;
	}
	n=res;
	res=0,i=1,oz=0;
	/*十转八*/
	while(n>0){
		oz=n%8;
		res+=oz*i;
		i=i*10;
		n=n/8;
	}
	return res;
}
/*字符串翻转传入的char str[]="hello" c语言初始化为连续的7个地址空间,并且把首地址赋值给str
所以这里打印str(%p)就为第一个字符的地址,str+1就为第二字符的地址,*str就为第一个字符,打印str(%s)
为hello,但是如果是char str[5]="hello"就会乱码,应为c语言将字符数组自动加上了'\0',作为字符串
的结束符。所以str的实际长度sizeof为6,strlen为5
*/
char* reverseStr(char* str){
        int i=0;
        int j=strlen(str)-1;
        char temp;
        while(i<j){
                temp=str[i];
                str[i]=str[j];
                str[j]=temp;
                i++;j--;
        }

        return str;
}
/*求平均数*/
double avg(int arr[],int len){
	int i=0;
	int sum=0;
	for(;i<len;i++){
		sum+=arr[i];
	}
	return sum/len;
}
/*矩阵相加*/
void add2matrix(int a[][2],int b[][2],int rowlen,int linelen){
	int i,j;
	for(i=0;i<linelen;i++){
		for(j=0;j<rowlen;j++){
			a[i][j]=a[i][j]+b[i][j];
		}
	}
}
/*矩阵转换*/
void reverseMatrix(int a[10][10],int rowlen,int linelen){
        int i,j;
        int temp[10][10];
        for(i=0;i<linelen;i++){
                for(j=0;j<rowlen;j++){
                        temp[i][j]=a[j][i];
                }
        }
	memcpy(a, temp, rowlen*linelen);
}
/*使用指针访问数组*/
void testPointer(int a[],int len){
	int i;
	for(i=0;i<len;i++)printf("这是指针%p\n",a+i);
	
	for(i=0;i<len;i++)printf("这是元素%p\n",*(a+i));
	
}
void testPointer(){
    int  var;
   int  *ptr;/*申明一个指针类型的变量*/
   var = 3000;
   /* 获取 var 的地址并赋值给ptr地址 */
   ptr = &var;
   *ptr = var;
  	var=400;
    /*打印地址ptr = 0x7ffc3fadff8c*/
   printf("ptr = %p\n", ptr );
   /*使用*获取指针类型的值,并打印*ptr = 400*/
   printf("*ptr = %d\n", *ptr );

    int  *ptr1;
	ptr1=&var;/*三个指针类型变量指向同一个地址,一个改变其他的全部改变*/
     /* 普通赋值(普通赋值之前要先给*ptr1一个地址,不然会发生	Segmentation fault) */
	*ptr1=40000;
    /*打印地址ptr1 = 0x7ffc3fadff8c*/
   printf("ptr1 = %p\n", ptr1 );
	/*使用*获取指针类型的值,并打印*ptr1 = 40000*/
    printf("*ptr1 = %d\n", *ptr1 );
    /*var = 40000*/
	printf("var = %d\n", var );
	/**ptr = 4	0000*/
   printf("*ptr = %d\n", *ptr );
}
/*交换三个数:值交换(改变指针指向的值,相应的指针就指向也就改变了,实际参数(指针或者地址)没有改变,但是实际参数的指向的值改变了)*/
void cyclicSwap1(int *a,int *b,int *c){
	int temp;
	temp=*a;
	*a=*b;
	*b=*c;
	*c=temp;
}
/*交换三个数:地址交换(函数传递是地址参数,在函数里面改变参数的地址,不影响实际参数的地址,所以这里面的abc的地址和值都改变了,但是实际参数的地址不会改变)*/
void cyclicSwap2(int *a,int *b,int *c){
	int *temp;
	temp=a;
	a=b;
	b=c;
	c=temp;
	printf("innera=%d;b=%d;c=%d\n",*a,*b,*c);
}
/*找到数组的最大值*/
int findMax(int a[],int len){
    int i;
    int max=0;
	for(i=0;i<len;i++){
		if(a[i]>max){
			max=a[i];
		}
	}
	return max;
}
/*删除字符串里面的特殊字符*/
char * delSpe(char str[]){
	int len=strlen(str);
	char *res=str;/*将str的地址给res*/
	int i,c=0;;
	for(i=0;i<len;i++){
		if((str[i]<='Z'&&str[i]>='A') ||(str[i]<='z'&&str[i]>='a') || (str[i]<=9&&str[i]>=0)  ){
			res[c++]=str[i];
		}
	}
	res[c]='\0';//字符串以\0结尾;
	return res;
}
/*连接两个字符串*/
char * strconnection(char *str1,char *str2){
	int len1=strlen(str1);
	int len2=strlen(str2);
	int i;
	for(i=0;i<len2;i++){
		*(str1+len1+i)=*(str2+i);
	}
	return str1;
}
/*计算字符串的长度*/
int computerLen(char *str){
	int i=0;
	for(;str[i]!='\0';i++);
	return i;
}
/*查找字符串在字符中出现的次数*/
int comTimes(char *str,char c){
	int sum=0,i=0;
	for(;str[i]!='\0';i++){
		if(str[i]==c){
			sum++;
		}
	}
	return sum;
}
/*字符串复制:值复制*/
void stringcopy1(char *to,char *from){
	int i;
	for(;from[i]!='\0';i++){
		to[i]=from[i];
	}
	to[i]='\0';
}
/*字符串复制:值复制*/
void stringcopy2(char *to,char *from){
	int i;
	for(;from[i]!='\0';i++){
		*(to+i)=*(from+i);
	}
	to[i]='\0';
}
/*字符串排序,有小到大*/
void compStr(char str[][10],int len){
	printf("%d\n",len);
	int i=0,j;
	char t[10];
	for(;i<len-1;i++){
		for(j=i+1;j<len;j++){
			if(strcmp(str[i],str[j])>0){
				strcpy(t,str[i]);
				strcpy(str[i],str[j]);
				strcpy(str[j],t);
			}
		}
	}
}
/*字符串排序,有小到大*/
void compStr(char str[][10],int len){
	printf("%d\n",len);
	int i=0,j;
	char t[10];
	for(;i<len-1;i++){
		for(j=i+1;j<len;j++){
			if(strcmp(str[i],str[j])>0){
				strcpy(t,str[i]);
				strcpy(str[i],str[j]);
				strcpy(str[j],t);
			}
		}
	}
}
typedef  struct{
	float real;
	float img;
}mix;
struct Mix add(struct Mix one,struct Mix two){
	struct Mix m;
	m.real=one.real+two.real;
	m.img=one.img+two.img;
	return m;
}
mix add1(mix one,mix two){
	mix m;
	m.real=one.real+two.real;
	m.img=one.img+two.img;
	return m;
}
/*读取文件中所有数据并打印*/
void readTxt(){
	FILE *f=NULL;
	f=fopen("./a.txt","r+");
	fseek(f,0,SEEK_END);//将文件指针移动到文件的末尾
	long size=ftell(f);//获取从文件头到文件指针处的的长度
	char buff[size+1];
	fseek(f,0,SEEK_SET);//将文件指针移动到文件的头
	fread(buff,sizeof(*buff),size,f);//读文件里面的全部内容
	buff[size]='\0';//加上结束符
	printf("read:%s\n",buff);
	fclose(f);
}
/*写文件*/
void writeTxt(){
	FILE *f=NULL;
	f=fopen("./b.txt","a+");//文件存在,读取会从文件的开头开始,写入则只能是追加模式。如果文件不存在会创建文件,
	fputs("this is test a \n",f);
	fputs("this is test b \n",f);
	fclose(f);
}
/*输出当前文件代码,__FILE__为当前文件常量*/
void printShell(){
	FILE *f=NULL;
	f=fopen(__FILE__,"r+");
	char c;
	c=fgetc(f);
	while(c!=EOF){
		putchar(c);
		c=fgetc(f);
	};
	fclose(f);
}
/*约瑟夫问题,30个人(1-9报数),每次数到第9个人kill掉,直到剩下15个为止*/
void whoisd(){
	int a[30];
	int i=0,count=0,i9=0;
	while(count<15){
		if(i==30){
			i=0;
		}
		if(a[i]!=-1){
			if(i9==9){//kill
				a[i]=-1;	//kill
				count++;
				printf("%d\n",i);
				i9=1;
			}else{
				i9++;
			};
		}
		i++;
	}
}
int main(){
	whoisd();
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值