原文链接: c语言二级常见函数
上一篇: Matlib画饼状图
下一篇: C语言求ln2
#include <stdio.h>
#include <string.h>
#include <math.h>
//统计字符串中有多少单词,单词间有若干空格,开始处没有空格
int f1(char *p){
int count=0;
//注意运算符优先级,如果p指向的字母不是空格,下一个是空格或者结束符说明是一个单词
while(*p){
if(*p!=' ' && (*(p+1)==' ' || *(p+1)==0) )
count++;
p++;
}
return count;
}
//输出给定字符串的最长子串
void f2(char *p){
char *res=p;
int max=0,i=0;
while(*p){
if( (*(p+1)==' '||*(p+1)=='\0') && i!=0){
if(max<i){
max=i+1;
res=p-i;
}
i=0;
}else if(*p!=' '){
i++;
}
p++;
}
for(i=0;i<max;i++)
printf("%c",res[i]);
}
//计算正实数数组平均值并返回,将大于平均值的数放到res数组中
double f3(double arr[],int len,double res[]){
int i,j;
double avg=0;
for(i=0;i<len;i++)
avg=avg+arr[i]/len;
for(i=j=0;i<len;i++)
if(arr[i]>avg)
res[j++]=arr[i];
res[j]=-1;
return avg;
}
//冒泡排序,由小到大
void f4(int arr[],int len){
int i,j,t;
for(i=0;i<len;i++)
for(j=i;j<len;j++)
if(arr[i]>arr[j]){
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
//找数组中小于平均值,且最接近平均值的数
double f5(double arr[],int len){
int i,res;
double avg=0,d=32767;
for(i=0;i<len;i++)
avg=avg+arr[i]/len;
for(i=0;i<len;i++)
if(arr[i]<avg && avg-arr[i]<d){
d=avg-arr[i];
res=i;
}
return arr[res];
}
//矩阵右上三角数翻倍
void f6(){
int a[3][3]={
1,2,3,4,5,6,7,8,9
},i,j;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
a[i][j] *= 2;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
//将正实数数组中的比平均值小或等的数放在后面,比平均值大的数放在前面
void f7(){
double arr[10]={
2,3,1,5,9,7,4,6,8,14
},avg=0;
int i,j=0;
double t[10];
for(i=0;i<10;i++)
avg+=arr[i]/10;
for(i=0;i<10;i++)
if(arr[i]>avg){
t[j++]=arr[i];
arr[i]=-1;
}
for(i=0;i<10;i++)
if(arr[i]>0)
t[j++]=arr[i];
for(i=0;i<10;i++)
printf("%.2lf ",t[i]);
}
//将字符串中单词首字母大写
void f8(){
char str[]=" i am a student to take exam";
char *p=str;
int k=0; //k表示p指向字符前面是否是空格
for(;*p;p++)
if(k){
if(*p==' ')
k=0;
}else{
if(*p!=' ')
k=1;
*p=toupper(*p);
}
printf("%s\n",str);
}
//输出矩阵周边元素之和
void f9(){
int arr[4][4]={
1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4
},i,j,sum=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i==0 || j==0 || i==3 || j==3)
sum += arr[i][j];
printf("%d\n",sum);
}
//将一组数字字符串转换为整数
void f10(){
long res=0;
char s[]="1234";
char *p=s;
while(*p){
if(isdigit(*p))
res=res*10+*p-'0';
p++;
}
printf("%ld",res);
}
//对第三位小数四舍五入
void f11(){
double d=12.126;
int t=(d*1000+5)/10;
d=(t/100.0);
printf("%lf",d);
}
//生成20个不同元素
void f12(){
int a[20]={0};
int i,x,n=0;
x=rand()%100;
while(n<20){
for(i=0;i<n;i++)
if(x==a[i]) break;
if(i==n){
a[n]=x;n++;
}
x=rand()%20;
}
for(i=0;i<20;i++)
printf("%d ",a[i]);
}
//矩阵转置
void f13(){
int a[4][4]={
1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4
},i,j,t;
for(i=0;i<4;i++){
for(j=i+1;j<4;j++){
t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t; }
}
for(i=0;i<4;i++){
for(j=0;j<4;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
//求一定范围素数
void f14(){
int max=11,i,j,count=0;
int num[max];
for(i=3;i<=max;i+=2){
for(j=2;j<i/2+1;j++){
if(i%j==0) break;
}
if(j>=i/2+1)
num[count++]=i;
}
for(i=0;i<count;i++)
printf("%d ",num[i]);
}
//生成矩阵,矩阵最外面一圈全是1,依次向里面加一
void f15(){
int n=7;
int i,j,k,m;
int a[n][n];
m= n%2 ? n/2+1 : n/2;
for(i=0;i<m;i++){
for(j=i;j<n-i;j++)
a[i][j]=a[n-i-1][j]=i+1;
for(k=i+1;k<n-i;k++)
a[k][i]=a[k][n-i-1]=i+1;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%3d ",a[i][j]);
printf("\n");
}
}
//进制转换.转为k进制并输出
void f16(){
int num=12;
int a[32],i,k=8;
for(i=0;num;i++){
a[i]=num%k;
num /= k;
}
for(;i;i--)
printf("%d",a[i-1]); //注意是i-1
}
//判断幻方,每行每列和主对角,次对角线元素和相等
int f17(){
int n=3;
int a[3][3]={4,9,2,3,5,7,8,1,6};
int i,j,m1=0,m2=0,row,col;
for(i=0;i<n;i++){
j=n-i-1;
m1 += a[i][i];
m2 += a[i][j];
}
if(m1!=m2) return 0;
for(i=0;i<n;i++){
row=col=0;
for(j=0;j<n;j++){
row+=a[i][j];
col+=a[j][i];
}
if((row!=col || (row!=m1))) return 0;
}
return 1;
}
//删除字符串中的所有空格
void f18(){
char s[]=" i l o ve y ou ";
char *p=s;
int i=0;
while(*p){
if(*p!=' ')
s[i++]=*p; //一条语句多种用途
p++;
}
s[i]='\0';
printf("%s\n",s);
}
//回文字符串判断
void f19(){
char s[]="hegfeh";
int n=strlen(s),i;
for(i=0;i<n/2;i++){
if(s[i]!=s[n-i-1]){
printf("no\n");
return;
}
}
printf("yes\n");
}
//将字符串中的数字前移,字母后移
void f20(){
char s[]="abc123ghhf34";
char *p=s;
int i,j=0,k,n=strlen(s);
char s2[n];
for(i=0;i<n;i++){
if(s[i]>='0' && s[i]<='9'){
s2[j++]=s[i];
s[i]='\0';
}
}
for(i=0;i<n;i++)
if(s[i]!='\0')
s2[j++]=s[i];
s2[j]='\0';
printf("%s\n",s2);
}
//将字符串中元素按照ascii码排序
void f21(){
char s[]="bdknawazq";
char c;
int i,j,n=strlen(s);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++){
if(s[i]>s[j]){
c=s[i];
s[i]=s[j];
s[j]=c;
}
}
printf("%s\n",s);
}
//输出所有素数因子
void f22(){
int num=100;
int i;
while(num!=1){
for(i=2;i<=num;i++){
if(num%i==0){
printf("%d ",i);
num=num/i;
break;
}
}
}
}
//统计单词个数
void f23(){
char s[]=" i love my fam and ";
char *p=s;
int count=0,flag=0;
while(*p){
if(*p!=' ' && flag==0){
count++;
flag=1;
}
if(*p==' ') flag=0;
p++;
}
printf("%d",count);
}
//实现strcat
void f24(){
char s1[100]="hello";
char s2[100]=" world";
char *p1=s1,*p2=s2;
while(*p1) p1++;
while(*p1++=*p2++);
*p1='\0';
printf("%d %s\n",strlen(s1),s1);
}
//实现strcpy
void f25(){
char s1[100]="hello";
char s2[100]=" world";
char *p1=s1,*p2=s2;
while(*p1++=*p2++);
printf("%d %s\n",strlen(s1),s1);
}
//实现strlen
void f26(){
char s[100]="hello"
" world\xab";
char *p=s;
int i=0;
while(p[i]) i++;
printf("%d %d\n",strlen(s),i);
}
//格式输出
void f27(){
printf("%10lf\n",1.25);
printf("%#o\n",12);
printf("%#x\n",25);
printf("%5.3lf\n",125);
printf("%3.1lf\n",1.25);
printf("%e\n",123567.123);
}
//数字逆序输出
void f28(){
int i=12345;
while(i){
printf("%d",i%10);
i/=10;
}
}
//三目运算符
void f29(){
int a=1,b=2,c=3,d=4,e=5,k;
k=a>b?c:d>e?d:e;
printf("k=%d\n",k);
}
//数字逆序
void f30(){
int i=1234,k=0;
while(i){
k=k*10+i%10;
i/=10;
}
printf("%d\n",k);
}
//计算2+22+222+2222
long f32(long n){
return n==1?2:f32(n-1)*10+2;
}
void f31(){
long n=4,sum=0;
while(n)
sum+=f32(n--);
printf("%d\n",sum);
}
//sizeof
void f33(){
printf("%d %d\n",sizeof(1.1F),sizeof(1.1));
typedef struct{
int a;
char c[2];
}Stu;
printf("%d\n",sizeof(Stu));
}
//取出数字中的奇数,构成新数字12345 -- 135
void f34(){
long n=1234571,i=1,k,res=0;
while(n){
k=n%10;
if(k%2){
res=k*i+res;
i*=10;
}
n/=10;
}
printf("%d\n",res);
}
//整数溢出
void f35(){
unsigned short i=0;
printf("%u\n",i);
i--;
printf("%u\n",i);
short s=32767;
printf("%d\n",s);
s++;
printf("%d\n",s);
s=-32768-1;
printf("%d\n",s);
}
//结构体对齐
void f36(){
struct st1
{
char a[10];
int b;
double c;
};
printf("%d\n",sizeof(struct st1)); //24
struct st2
{
int b;
char a[10];
double c;
};
printf("%d\n",sizeof(struct st2)); //24
struct st3
{
int b;
double c;
char a[10];
};
printf("%d\n",sizeof(struct st3)); //32
struct st4
{
int b;
double c;
char a[5];
};
printf("%d\n",sizeof(struct st4)); //24
struct st5
{
int b;
int c[2];
char a[5];
};
printf("%d\n",sizeof(struct st5)); //20
struct st6
{
char a[3];
int b;
int c[2];
};
printf("%d\n",sizeof(struct st6)); //20
struct st7
{
char a[3];
int b;
int c[2];
struct st5 s;
};
printf("%d\n",sizeof(struct st7)); //36
union u1{
long a;
int b;
char s[5];
};
printf("%d\n",sizeof(union u1)); //8
struct st8
{
char a[3];
int b;
int c[2];
union u1 x;
};
printf("st8=%d\n",sizeof(struct st8)); //24
union u2{
long a;
int b;
char s[9];
};
printf("%d\n",sizeof(union u2)); //12
union u3{
int a;
char c;
char s[12];
};
printf("%d\n",sizeof(union u3)); //12
//1)大小足够容纳最宽的成员;
//2)大小能被其包含的所有基本数据类型的大小所整除
union u4{
double a;
double c;
char s[12];
};
printf("%d\n",sizeof(union u4)); //16
}
//通过指针找数组最大值
void f37(){
int a[4]={
1,7,2,5
},*p,*s;
for(p=a,s=a;p-a<4;p++)
if(*p>*s)
s=p;
printf("max=%d\n",a[s-a]);
}
/* 辗转相除法求最大公约数 */
void f38()
{
int m, n, a, b, t, c;
printf("Input two integer numbers:\n");
scanf("%d %d", &a, &b);
m=a; n=b;
while(b!=0) /* 余数不为0,继续相除,直到余数为0 */
{ c=a%b; a=b; b=c;}
printf("The largest common divisor:%d\n", a);
printf("The least common multiple:%d\n", m*n/a);
}
//最大公约数相减法
void f39(){
int a=10,b=18;
while(a!=b){
if (a>b) a=a-b;
else b=b-a;
}
printf("%d\n",a);
}
//将字符串中用双引号括出来的单词输出,用空格隔开
void f40(){
char s[100]="hello \"world\" i am from \"china\"";
char *word=s,len=0,i,n=strlen(s),flag=0; //flag=0表示word指向字母之前没有引号
while(*word){
if(flag==1 && *word!='\"'){
len++;
}else if(flag==0 && *word=='\"' ){
flag=1;
}else if(flag==1 && *word=='\"'){
char *p=word-len;
for(i=0;i<len;i++)
printf("%c",p[i]);
printf(" ");
len=0;
flag=0;
}
word++;
}
printf("\n");
}
//过滤字符串中的数字
void f41(){
char s[100]="hel121lo wo23rd!";
char *p=s,*res=s;
while(*p){
if(*p>='0' && *p<='9')
p++;
else
*(res++)=*(p++);
}
*res='\0';
printf("%s\n",s);
}
//过滤指定字符串中的字符
void f42(){
char s1[100]="hello world!";
char s2[100]="old";
char *p=s1,*res=s1;
while(*p){
int flag=1;
char *t=s2;
while(*t){
if(*p==*t) {flag=0;break;}
t++;
}
if(flag){
*res++=*p++;
}else{
p++;
}
}
*res='\0';
printf("%s\n",s1);
}
//双重排序,先按照成绩排序,再按照名字排序
void f43(){
typedef struct{
char id[32];
char name[32];
double score;
}Stu;
Stu ss[7]={
{"a","a",12},{"d","d",100},{"e","e",66},{"k","k",66},{"p","p",33},{"m","m",80},{"s","s",66}
},t;
t=ss[0];
int i,j;
for(i=0;i<7;i++)
printf("%s %s %.2lf\n",ss[i].id,ss[i].name,ss[i].score);
for(i=0;i<7;i++){
for(j=i;j<7;j++){
if(ss[i].score>ss[j].score){
t=ss[i];ss[i]=ss[j];ss[j]=t;
}else if(ss[i].score==ss[j].score){
if(strcmp(ss[i].name,ss[j].name)>0){
t=ss[i];ss[i]=ss[j];ss[j]=t;
}
}
}
}
printf("排序后\n");
for(i=0;i<7;i++)
printf("%s %s %.2lf\n",ss[i].id,ss[i].name,ss[i].score);
}
//对矩阵每列进行排序
void f44(){
int a[4][4]={
1,6,3,8,22,14,0,9,3,11,2,4,5,22,6,12
},i,j,k,t;
for(i=0;i<4;i++){
for(j=0;j<4;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=j;k<4;k++){
if(a[j][i]>a[k][i]){
t=a[j][i];a[j][i]=a[k][i];a[k][i]=t;
}
}
}
}
printf("排序后\n");
for(i=0;i<4;i++){
for(j=0;j<4;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
}
int main(int argc, char *argv[])
{
f44();
return 0;
}