C语言编程浅析(二)

获取文件扩展名

#include<stdio.h>
char *getFileExtName(char *filename);
int main(){
	char *p,a[255];
	gets(a);
	p=getFileExtName(a);
	if(*p!='\0') puts(p);
	else printf("no dot\n");
	return 0;
}
char *getFileExtName(char *filename){
	while(*filename!='.' && *filename) filename++;
		if(*filename=='.')
			return filename+1;
		else return filename;
}

计算字符串长度(strlen)

#include <stdio.h>
char func(char *s)//计算字符串长度
{
	char *p=s;
	while(*p!='\0')
	p++;
	return p-s;
}
void main()
{
	printf("\n%d\n",func("Hello!"));
	getchar();//暂停
}

简易计算器

#include<stdio.h>
#include<math.h>
int main(){
	int a,b,temp;
	float c;
	char op,answer='y';
	do{
		puts("-------------------------------简易计算器V2.0-------------------------------------");
		puts("请输入运算符【+,-,*,/,p(幂次方),s(开方),r(倒数)】");
		fflush(stdin);
		op=getchar();
		puts("请输入计算的数(若为四则运算或幂次方中间用空格隔开):");
		if(op=='+'||op=='*'||op=='-'||op=='/'||op=='p'){
			scanf("%d%d",&a,&b);
			switch(op){
				case'+':
					printf("%d+%d=%d\n",a,b,a+b);
					break;
				case'-':
					printf("%d-%d=%d\n",a,b,a-b);
					break;
				case'*':
					printf("%d*%d=%d\n",a,b,a*b);
					break;
				case'/':
					if(b==0){
						puts("输入错误!除数不能为0!");
						break;
					}
					printf("%d/%d=%d\n",a,b,a/b);
					break;
				case'p':
					temp=pow(a,b);
					printf("%d的%d次方为%d\n",a,b,temp);
					break;
			}
		}
		else{
			scanf("%f",&c);
			switch(op){
				case'r':
					if(c==0){
						puts("输入错误!分母不能为0!");
						break;
					}
					printf("%.0f的倒数为1/%.0f\n",c,c);
					break;
				case's':
					printf("根号下%.0f为%.0f\n",c,sqrt(c));
					break;
				default:
					printf("输入错误的运算符,请重新输入!\n");
					break;
			}
		}
			printf("如需继续运行请输入y,否则输入n:");
			fflush(stdin);
			answer=getchar();
	}while(answer=='y');
	return 0;
}

解决输入产生的垃圾字符(缓存区中)

#include<stdio.h>
int main(){
		int a;
		char x;
		scanf("%d",&a);
		//getchar();
		scanf("%c",&x);
		//scanf(" %c",&x);或者scanf("%*c%c",&x); 
		printf("%d %c %d\n",a,x,x); 
		return 0;
}

#今天是今年的第几天

#include<stdio.h>
int main()
{
	int a,b,c,i,e=0;
	printf("请输入年.月.日:\n");
	scanf("%d.%d.%d",&a,&b,&c);
	b-=1;
	for(i=0;i<= b;i++)
	{
		switch(i)
		{
		case 1:case 3:case 5:case 7:case 8:case 10:case 12:
			e += 31;
			break;
		case 2:
			if(a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
			{
				e += 29;
			}
			else
			{
				e += 28;
			}
			break;
		case 4:case 6:case 9:case 11:
			e += 30;
		}
	}
	 e += c;
	 printf("%d\n",e);

	return 0;
}

静态本地变量

#include<stdio.h>
int f(void);
int gAll=12;
int main(int argc,char const *argv[]){
	f();
	//f();
	//f();
	return 0;
}
int f(void){
	int k =0;
	static int all =1;
	printf("&gAll=%p\n", &gAll);
	printf("&all =%p\n",&all);
	printf("&k   =%p\n",&k);
	printf("all=%d\n",all);
	all+=2;
	printf("agn all=%d\n",all);
	return all;
} 

开方算术

#include<stdio.h>
#include"math.h"
int main()
{
	int x;
	double y;
	printf("请输入需要开方的数据:\n");
	scanf("%d",&x);
	y=sqrt(x);
	printf("%7.2f\n",y);

	return 0;
}

快速排序

void sort(int *a, int left, int right)
{
    if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];
     
    while(i < j)                               /*控制在当组内寻找一遍*/
    {
        while(i < j && key <= a[j])
        /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
        序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/ 
        {
            j--;/*向前寻找*/
        }
         
        a[i] = a[j];
        /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
        a[left],那么就是给key)*/
         
        while(i < j && key >= a[i])
        /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
        因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
        {
            i++;
        }
         
        a[j] = a[i];
    }
     
    a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
    sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
    sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
                       /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}

联合(union)

#include<stdio.h>
typedef union{
	int i;
	char ch[sizeof(int)];
}CHI;

int main(){
	CHI chi;
	int i;
	chi.i=1234;
	for(i=0;i<sizeof(int );i++){
		printf("%02hhX",chi.ch[i]);
	}
	printf("\n");
	return 0;
} 

冒泡排序

#include<stdio.h>
#define N 100
int main(void)
{
	int n,i,h,j,a[N];
	printf("需要多少整数:\n");
	scanf("%d",&n);
	printf("输入你要的排序的整数:\n");
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<n;i++){
		for(j=0;j<n-1;j++){
			if(a[j]>a[j+1]){
				h=a[j];
				a[j]=a[j+1];
				a[j+1]=h;
			}
		}
	}
	for(i=0;i<n;i++)
	printf("%d",a[i]);
	return 0;
}

判断两个字符串大小(strcmp)

#include<stdio.h>
#define N 10
int _strcmp(char *str1, char *str2);
int main(void){
	char str[2][255];
	int i;
	printf("输入两个字符串:\n");
	for(i=0;i<2;i++)
		scanf("%s",str[i]);
	printf("%d\n",_strcmp(str[0],str[1]));
	return 0;
}
int _strcmp(char *str1, char *str2){
	int rn=0,i=0;
	while(*(str1+i)==*(str2+i)&&*(str1+i)!='\0'&&*(str2+i)!='\0')
		i++;
	if(*(str1+i)>*(str2+i))
		rn=1;
	else if(*(str1+i)<*(str2+i))
		rn=-1;
	return rn;
}

求最小公倍数

#include<stdio.h>
int lcm(int,int);//最小公倍数
int gcd(int,int);//最大公约数
int main(void){
	int a,b;
	printf("请输入需要的求最小公倍数的两个整数:\n");
	scanf("%d%d",&a,&b);
	printf("最大公约数为:%d\n",gcd(a,b));
	printf("最大公倍数为:%d\n",lcm(a,b));
	return 0;
}

int lcm(int x,int y){
	return x*y/gcd(x,y);
}

int gcd(int x,int y){
	return y==0?x:gcd(y,x%y);
}

去掉字符串的空格

#include <stdio.h>
void fun(char *str)//字符指针加快运行速度//
{
	int i,j=0;
    for(i=0;str[i]!='\0';i++)
    if(str[i]!=' ')//将str数组中的字符串去掉空格重新排列//
        str[j++]=str[i];
	    str[j]='\0';
}
void main()
{
    char str[80];
    int n;
    printf("Input a string:");
    gets(str);
    fun(str);//字符数组的首地址作为形式参数//
    printf("%s\n",str);
}

任意位置插入

#include<stdio.h>
#define N 20
char* insert(char *,char *,int);
int main(void){
	char s1[N],s2[N];
	int n;
	gets(s1);
	gets(s2);
	scanf("%d",&n);
	puts(insert(s1,s2,n));
	return 0;
}
char* insert(char *s1,char *s2,int n){
	int i,j;
	char s3[N+N];
	for(i=n,j=0;*(s1+i)!='\0';i++)
		s3[j++]=*(s1+i);
		s3[j]='\0';
	while(*s2!='\0')
	{
		*(s1+n)=*s2;
		n++;
		s2++;
	}
	for(i=0;s3[i]!='\0';i++){
		*(s1+n)=s3[i];
		n++;
	}
	*(s1+n)='\0';
    return s1;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值