C语言复习:30道练习题

问题描述】依次输入一个整型数组的元素值,然后将该数组前n个元素中的值按逆序重新存放。例如,输入值的顺序为8,6,5,4,1,2,逆序存放后的顺序为2,1,4,5,6,8的顺序存放(注意是逆序存放而不是逆序输出)。
提示:
(1)定义一个数组,数组大小不超过999,为该数组前n个元素赋值。
(2)在循环中,使第0个元素与第n-1个元素交换,第1个元素与第n-2个元素交换,第2个元素与第个n-3元素交换(注意循环次数按n/2确定,n为数据个数)。
(3)输出逆序存放后的各数组元素(使用循环语句)。

【输入形式】第一行输入数组的元素个数,第二行输入依次输入元素值,用空格分开
【输出形式】逆序存放后的输入元素,用空格分开
【样例输入】

5

12#23#8#76#10

(#表示空格)

【样例输出】10#76#8#23#12
【样例说明】输入中的第一行的5表示对数组的前5个元素进行逆序存放,第二行依次为前5个元素的值;输出结果为逆序存放后数组的前n个元素值。

#include  <stdio.h> 
#include  <string.h> 
void swap(int b[],int len)
{
    int temp;
    int i=0;
    for ( i = 0; i < len/2; i++)
    {
        temp=b[i];
        b[i]=b[len-1-i];
        b[len-1-i]=temp;
    }
    i=0;
    for ( i = 0; i < len; i++)
    {
        printf("%d",b[i]);
        printf(" ");
    }

}
int main()
{
    int a[999];
    int n;
    int i=0;
    scanf("%d",&n);
    for( i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    swap(a,n);
    
    return 0;
}

【问题描述】

若将某一素数的各位数字的顺序颠倒后得到的数仍是素数,则此素数称为可逆素数。编写一个判断某数是否可逆素数的函数,在主函数中输入一个整数,再调用此函数进行判断
【输入形式】

用户在第一行输入一个整数。
【输出形式】

程序在下一行输出yes或是no,yes表示此数是可逆素数,no表示不是。用户输入的数必须为正整数。注意:yes或是no全是小写输出。
【样例输入】

#include  <stdio.h> 
#include  <string.h> 
int isP(int b)
{
    int c;
    
    for(c=2;c<b/2+1;c++)
    {
        if(b%c==0)
        {
           return 0;
        }

    }
    
    return 1; 
   

}
void sawp(int c)
{
    int i,nc=0;
   
    while(c!=0)
    {
        i=c%10;
        c=c/10;
        nc=nc*10+i;
        
    }
    
    if(isP(nc))
       { printf("yes");}
    else
        {printf("no");}
    
}
int main(){
    int a;
    scanf("%d",&a);
    if(!isP(a))
    {
        printf("no");
    }
       
    else{sawp(a);}
         
    
    
    return 0;
}

【问题描述】字符串逆序:设计函数功能是将一个字符串逆序,函数声明:void stringNx(char *a) 使用这个函数完成将输入的字符串逆序输出

【输入形式】要求输入一个字符串

【输出形式】逆序后输出

【样例输入】abcd 

【样例输出】dcba

#include  <stdio.h> 
#include  <string.h> 
void stringNx(char *a) 
{
    int len=strlen(a);
    int i;
    for ( i = len-1; i >=0; i--)
    {
        
        printf("%c",a[i]);
    }
    
}
int main()
{
    char a[100];
    scanf("%s",a);//字符串不用取地址哦
  
    stringNx(a);
    return 0;
}

【问题描述】

两个集合的差集定义如下:
集合A、B的差集,由所有属于A但不属于B的元素构成。
输入两个集合A、B,每个集合中元素都是自然数。求集合A、B的差集。
【输入形式】
从标准输入接收集合中的自然数元素,以空格分隔。-1表示输入结束。
其中,每个集合都不输入重复的元素。
【输出形式】
输出差运算后集合中的元素,以空格分隔。输出元素的顺序与原有集合A输入的顺序一致。
如果A、B的差集为空集,则不输出任何数值。

#include  <stdio.h> 
#include  <string.h> 
void less(int r[],int d[],int lr,int ld)
{
    
    int i,j;
    int Less;
    for ( i = 0; i < lr; i++)
    {
        for (j = 0; j < ld; j++)
        {
           if(d[j]==r[i])
           {
                r[i]=-1;
           }
        }
        
    }

    for(i=0;i<lr;i++)
    {
        if (r[i]!=-1)
        {
            printf("%d",r[i]);
            printf(" ");
        }
        
    }
    
}
int main()
{
    int lr=0, ld=0;
    int c=0,i=0;
    int a[10],b[10];
   while(scanf("%d",&c)!=EOF)
   {
        if (c==-1)
        {
            break;
        }
        a[i++]=c;
        lr++;
   }
   i=0;
    while(scanf("%d",&c)!=EOF)
   {
        if (c==-1)
        {
            break;
        }
        b[i++]=c;ld++;
   }
less(a,b,lr,ld);
return 0;
}

【问题描述】Fibonacci数列:无穷数列1,1,2,3,5,8,13,21,34,55,…, 被称为Fibonacci数列。求第n个Fibonacci数。

【输入形式】输入数字n

【输出形式】输出第n个Fibonacci数

#include  <stdio.h> 
#include  <string.h> 
void Fibonacci(int b) 
{
    int i;
    int s[b];
    s[1]=1;s[0]=1;
     for( i = 2; i < b; i++)
    {
        s[i]=s[i-1]+s[i-2];

    }
    printf("%d",s[b-1]);

}
int main()
{
    int a;
    scanf("%d",&a);
    Fibonacci(a);
    return 0;
}

【问题描述】输入一个字符串,将这个字符串中的大写英文字母除去,输出剩余的字符组成的字符串。

【输出形式】输出除去大写英文字母的剩余字符串

【样例输入】Hello, World! 

【样例输出】ello, orld!

#include  <stdio.h> 
#include  <string.h> 
 void Print(char *c)
 {
    int i,len=strlen(c);
    for ( i = 0; i < len; i++)
    {
        if(c[i]<='A'||c[i]>='Z')
        {
            printf("%c",c[i]);
        }
    }
    
 }
int main()
{
    char a[100];
    
    gets(a);
    
    Print(a);
return 0;
 
}

【问题描述】

编写函数int sum(int x),求整数x的各位数字之和。编写一个程序,调用sum函数计算任一输入的整数的各位数字之和。
【输入形式】

控制台输入一个整数。
【输出形式】

输出一个整数,是根据该输入整数计算各位数字之笔。 

#include  <stdio.h> 
#include  <string.h> 
int sum(int x)
{
    int s=0,temp;
    while (x!=0)
    {
        temp=x%10;
        x=x/10;
        s+=temp;
    }
    
    return s;
}
int main()
{
    int a;
    scanf("%d",&a);
    
    printf("%d",sum(a));
    return 0;
 
}   

【问题描述】完全数是特殊的自然数。它所有的真约数(即除了自身以外的约数)的和,恰好等于它本身。 第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6 第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。 输入一个整数m,输出区间[1,m]内最大的完全数。

【输入形式】输入一个整数。

【输出形式】输出不超过m的最大完全数。

【样例输入】32

【样例输出】28

这里,有限定时间,作者用了一个逆序直接输出进行了优化

#include  <stdio.h> 
#include  <string.h> 
void isAll(int b)
{
    int i,j,sum=0;
    for (j = b; j > 0; j--)
    {
       for ( i = 1; i <j; i++)
        {
            if(j%i==0)
            { 
                sum+=i;
                continue;
            }
        }
        if(sum==j)
        {
             printf("%d",sum);
             break;
           
        }
        sum=0;
    }
    
    
    

}

int main()
{
    int a;
    scanf("%d",&a);
    isAll(a);
return 0;
 
}

【问题描述】

编写一个程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符。
【输入形式】

从键盘输入一个字符串,以回车结束输入。要求程序可以处理含有空格的字符串。
【输出形式】

程序接收此字符串,然后将其按照字符ASCII码值从小到大的顺序进行排序,并删除重复的字符输出。如果字符串为空,输出也应该为空。

#include <stdio.h>
int main(){
	char a[100],b;
	int n=0;
     int i,j;
	
	while(scanf("%c",&b)){
        if(b=='\n')
        {
            break;
        }
        a[n]=b;
		n++;
		
	}
//排序
	for( i=0;i<n-1;i++){
		for(j=n-1;j>i;j--){
			if(a[j-1]>a[j]){
				int temp=a[j-1];
				a[j-1]=a[j];
				a[j]=temp;
			}
		}
	}

//去空格
    int cou=0;
	for(i=0;i<n;i++){
        if(a[i]!=32)
        {
            cou=i;
            break;
        }
	}
   

//去重
    for ( i = cou; i < n; i++)
    {
        printf("%c",a[i]);
         while(a[i]==a[i+1])
            {
                i++;
            }     
    }
    
	return 0;
}

【问题描述】编写一个字符串复制函数strCopy(),将字符串1中奇数位置的字符复制到另一个字符串2中,在主函数中调用函数strCopy()并输出复制后的结果。例如,当字符串1为"This is a C program",则字符串2为"Ti saCporm"。

【输入形式】输入字符串
【输出形式】输出复制后的字符串
【样例输入】This is a C Program
【样例输出】Ti saCporm
【样例说明】
【评分标准】

#include  <stdio.h> 
#include  <string.h> 
void strCopy(char  *str)
{
    int l=strlen(str);
    int i;
    //char nstr;
    for ( i = 0; i < l; i+=2)
    {
        //nstr+=str[i];
        printf("%c",str[i]);
    }
    
}
int main()
{
    char a[100],b;
    int n=0;
    while(scanf("%c",&b)){
        if(b=='\n')
        {
            break;
        }
        a[n]=b;
		n++;
		
	}
    strCopy(a);
    return 0;
}

【问题描述】在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。 

  给定一个整数序列,请找出这个整数序列的中间数的值。 

【输入形式】

  输入的第一行包含了一个整数n,表示整数序列中数的个数。 

  第二行包含n个正整数,依次表示a1, a2, …, an。 

【输出形式】

  如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。 

【样例输入】

  6 

  2 6 5 6 3 5 

【样例输出】

  5 

【样例说明】

  比5小的数有2个,比5大的数也有2个。

【样例输入】

  4 

  3 4 6 7 

【样例输出】

  -1 

【样例说明】

  在序列中的4个数都不满足中间数的定义。

#include  <stdio.h> 
#include  <string.h> 
void  Center(int d[],int L,int c)
{
    int i,cout=0,cout2=0;
     for ( i = 0; i < L; i++)
        {
            if(d[i]<d[c-1])
            {
                cout++;
            }else if(d[i]>d[c-1])
            {
                cout2++;
            }
        }
        if(cout==cout2)
        {
            printf("%d",d[c-1]);
        }else{
             printf("-1");
        }
}
void sort(int a[],int l)
{
    int i,j,temp,k;
    for ( i = 0; i < l-1; i++)
    {
       
        for ( j = i+1; j < l; j++)
        {
            if(a[i]>a[j])
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }        
    }
    
    
    if (l%2)
    {
         k=l/2;
 
    }
    else
    { 
        k=l/2+1;    
    }
   
    Center(a,l,k);

}

int main()
{
    int n;
    int b[1000],m=0;
    scanf("%d",&n);
    for(m=0;m<n;m++)
    {
        scanf("%d",&b[m]);

    }
    int i=0;
   
    sort(b,n);
    return 0;
}

【问题描述】有 n 个人围成一圈,顺序排号,从第 1 个人开始报数,从 1 报到 m,凡报到 m 的人退 出圈子,问最后留下的是原来第几号的人?下列函数完成上述处理,其中 m、n 的(m<n) 值由主调函数输入,函数返回值为所求结果。

【输入形式】n m 其中n>m
【输出形式】问最后留下的是原来第几号的人

【样例输入】99 3
【样例输出】88
【样例说明】
【评分标准】

循环转圈(淘汰制)

#include  <stdio.h> 
#include  <string.h> 
 
int main()
{
    int n,m,cout=0,num=0;
    scanf("%d%d",&n,&m);
    
    int c[1000];
    int i;
    for ( i = 0; i < n+1; i++)
    {
        c[i]=i;
    }
    while (cout!=n-1) 
    {
        for ( i = 1; i < n+1; i++)
        {
            if(c[i]!=0)
            {
            num++;
            if(num==m)
            {
                c[i]=0;
                num=0;
                cout++;
            }
            }
        }
        
    }
    for ( i = 0; i < n; i++)
    {
        if (c[i]!=0)
        {
            printf("%d",i);
            printf(" ");
        }
        
    }
    
    
    
    return 0;
}

【问题描述】从键盘上依次输入一个4行4列的二维整形数组的元素值,求其主对角线的元素和。
【输入形式】依次输入二维数组元素的值,用空格分开
【输出形式】主对角线元素和
【样例输入】

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
【样例输出】34

#include  <stdio.h> 
#include  <string.h> 
 
int main()
{
    int sum=0;
    int a[3][3];
    int i,j;
    for ( i = 0; i < 4; i++)
    {
       for ( j = 0; j < 4; j++)
       {
            scanf("%d",&a[i][j]);
       }
       
    }
    
    for ( i = 0; i < 4; i++)
    {
       for ( j = 0; j < 4; j++)
       {
        if (i==j)
        {
            sum+=a[i][j];
        }
        
           
       }
       
    }
     printf("%d",sum);
    return 0;
}

编写一函数int comb(int a,int b),将两个两位数的正整数a、b合并形成一个整数并返回。合并的方式是:将a的十位和个位数依次放在结果的十位和千位上, b的十位和个位数依次放在结果的个位和百位上。例如,当a=45,b=12。调用该函数后,返回5241。要求在main函数中调用该函数进行验证:从键盘输入两个整数,然后调用该函数进行合并,并输出合并后的结果。
【输入形式】
输入两个两位数的正整数,以空格隔开。

【输出形式】

输出合并后的正整数。

#include  <stdio.h> 
#include  <string.h> 
 int comb(int a,int b)
 {
    int sum,c,d;
    c=a%10;
    a=a/10*10;
    d=b%10;
    b=b/10;
    sum=c*1000+a+d*100+b;
   return sum;
    
    
 }
int main()
{
 int m,n;
 scanf("%d%d",&m,&n);

 printf("%d" ,comb(m,n));
    return 0;
}

【问题描述】一个数组A中存有N(>0)个整数,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。

【输入形式】每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

【输出形式】在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

#include  <stdio.h> 
#include  <string.h> 
void recursion(int b[],int l,int mov)
{
    int i,j,t;

    for ( i = 0; i <mov; i++)
    {
        t=b[l-1];
        for ( j = 1; j < l; j++)
        {
            b[l-j]=b[l-j-1];
        }
        b[0]=t;
    }

    for ( i = 0; i < l; i++)
    {
        printf("%d",b[i]);
        printf(" ");
    }
    
    

}
int main()
{
    int N,M;
    scanf("%d%d",&N,&M);
    int n=0,a[100];
    for(n=0;n<N;n++)
    {
        scanf("%d",&a[n]);
    }
    
    recursion(a,N,M);

    return 0;
}

【问题描述】
编写一个函数void  str_bin(char str1[ ], char str2[ ]), str1、str2是两个有序字符串(其中字符按ASCII码从小到大排序),将str2合并到字符串str1中,要求合并后的字符串仍是有序的,允许字符重复。在main函数中测试该函数:从键盘输入两个有序字符串,然后调用该函数,最后输出合并后的结果。
【输入形式】
分行从键盘输入两个有序字符串(不超过100个字符)
【输出形式】
输出合并后的有序字符串

还有一种思路时:有序合并,直接比较大小,但是...我一直报错,没找到错误,所以就没写了

#include  <stdio.h> 
#include  <string.h> 
 void  str_bin(char str1[ ], char str2[ ])
 {
    strcat(str1,str2);
    int l=strlen(str1);
    int i=0,j=0;
    char t;
    for ( i = 0; i < l; i++)
    {
        for ( j= i; j < l; j++)
        {
            if (str1[i]>str1[j])
            {
                t=str1[i];
                str1[i]=str1[j];
                str1[j]=t;
            }
            
        }
        
    }

    printf("%s",str1);
   
    
 }
int main()
{
    char a[100],b[100];
    scanf("%s",a);
    scanf("%s",b);
    str_bin(a,b);

    
    return 0;
}

问题描述】

求二维整型数组的"最大点"。二维数组的"最大点"定义为:某个数是所在行的最大值,并且是所在列的最大值。注意:某行或某列上可能有多个"最大点"。

【输入形式】

从控制台读入二维数组。

第一行只有以空格分隔的两个正整数n和m(n,m<=10),n代表二维数组的行数,m代表二维数组的列数。

然后在后续n行上输入二维数组的元素,每行有m个以若干空格分隔的整数,代表二维数组在该行上的所有元素。

【输出形式】

向控制台输出二维数组的"最大点",按行下标、列下标从小到大的顺序输出,每行一个,先输出"最大点"数值,再输出对应的行数、列数(行列都从1开始计数),以一个空格分隔。

解题思路:首先,我们可以发现Aij的i行j列的最大值都必须是他,才是驻点,且要考虑出现多个点的问题,用嵌套循环,去处理比较一行的最大值,再去处理最大值所在列的最大值是不是他,要记录列的下标,最后处理多个点的情况,用flag标记,判断情况输出即可

#include <stdio.h>
int main()
{
	int a[10][10], n, m, i, j, k;
	scanf("%d%d", &n, &m);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	int row, col, s,flag=1,col1,s1,t=0;
	for (i = 0; i < n; i++)
	{
		s = a[i][0];
		row = i, col = 0;
		for (j = 1; j < m; j++)
		{
			if (a[i][j] > s)
			{
				s = a[i][j];
				col = j;
			}
		}
		for(j=0;j<m;j++)
		{
			if (a[i][j] == s&&j!=col)
			{
				s1 = a[i][j];
				col1 = j;
				t=1;
			}
		}
		for (k = 0; k < n; k++)
		{
			if (a[k][col] > s){
				flag=0;
				break;
            }
		}
		row++,col++;
		if(flag)
		printf("%d %d %d\n", s, row, col);
		flag=1;
		if(t)
		{
			for (k = 0; k < n; k++)
			{
				if (a[k][col1] > s1)
					flag=0;
			if(flag==0)
				break;
			}
			col1++;
			if(flag==1)
			printf("%d %d %d\n", s1, row, col1);
			t=0; 
		}
	}
	return 0;
}

问题描述】

求二维整型数组的"最小点"。二维数组的"最小点"定义为:某个数是所在行的最小值,并且是所在列的最小值。注意:某行或某列上可能有多个"最小点"。

【输入形式】

从控制台读入二维数组。

第一行只有以空格分隔的两个正整数n和m(n,m<=10),n代表二维数组的行数,m代表二维数组的列数。

然后在后续n行上输入二维数组的元素,每行有m个以若干空格分隔的整数,代表二维数组在该行上的所有元素。

#include <stdio.h>
int main()
{
	int a[10][10], n, m, i, j, k;
	scanf("%d%d", &n, &m);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	int row, col, s,flag=1,col1,s1,t=0;
	for (i = 0; i < n; i++)
	{
		s = a[i][0];
		row = i, col = 0;
		for (j = 1; j < m; j++)
		{
			if (a[i][j] < s)
			{
				s = a[i][j];
				col = j;
			}
		}
		for(j=0;j<m;j++)
		{
			if (a[i][j] == s&&j!=col)
			{
				s1 = a[i][j];
				col1 = j;
				t=1;
			}
		}
		for (k = 0; k < n; k++)
		{
			if (a[k][col] < s){
				flag=0;
				break;
            }
		}
		row++,col++;
		if(flag)
		printf("%d %d %d\n", s, row, col);
		flag=1;
		if(t)
		{
			for (k = 0; k < n; k++)
			{
				if (a[k][col1] < s1)
					flag=0;
			if(flag==0)
				break;
			}
			col1++;
			if(flag==1)
			printf("%d %d %d\n", s1, row, col1);
			t=0; 
		}
	}
	return 0;
}

问题描述】
编写一个函数 int same_set(int a[],int b[],int len),
该函数检查相等长度的两个数组是否包含相同的元素,若包含相同的元素,
则返回1,否则返回0,其中参数len是数组a与与数组b的元素个数。
不考虑元素的顺序,如果元素重复,重复次数也相同。在main函数中读入两个整数数组,测试该函数。
【输入形式】
从键盘输入两个数组,第一行输入数组元素个数,第二行输入第一个数组的各个值,
第三行输入第二个数组的各个值。
【输出形式】
如果两个数组包含的元素相同,打印1,否则,打印0。

#include  <stdio.h> 
#include  <string.h> 
int same_set(int a[],int b[],int len)
{
    int t,flag=1;
    int i,j,k;
    for ( i = 0; i < len; i++)
    {
        for ( j = 0; j < len; j++)
        {
           if (a[i]>a[j])
           {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
           }
        }
        for ( k = 0; k < len; k++)
        {
           if (b[i]>b[k])
           {
            t=b[i];
            b[i]=b[k];
            b[k]=t;
           }
        }
        
    }
    for ( i = 0; i < len; i++)
    {
       if(a[i]!=b[i])
       {
        flag=0;
        break;
       }
    }
    if (flag)
    {
        return 1;
    }else{
        return 0;
    }  
}
int main()
{
    int n;
    int n1[100],n2[100];
    scanf("%d",&n);
    int i;
    for ( i = 0; i < n; i++)
    {
        scanf("%d",&n1[i]);
    }
    for ( i = 0; i < n; i++)
    {
        scanf("%d",&n2[i]);
    }
   printf("%d",same_set(n1,n2,n));
    
    
    return 0;
}

问题描述】

已知ex的近似值可由下面公式计算得出:

ex=1 + x/1! + x2/2! + x3/3! + ...... + xn/n!
给定x和n,利用上述公式求得ex的近似值。

【输入形式】

从控制台输入小数x,和整数n(n>=1),用空格隔开。

【输出形式】

向控制台输出求得的ex 的近似值(小数点后保留6位有效数据)。

#include  <stdio.h> 
#include  <string.h> 
 #include<math.h>
int main()
{
    double x,n,d,k=1;
    scanf("%lf%lf",&x,&n);
    double sum=1.0,X=x;
    int i,j;
    for ( i = 1; i < n+1; i++)
    {
         
        X=pow((double)x,(double)i);
        k=i*k;
       d=(double)X/k;
       sum+=d;
       
    }
    printf("%.6lf",sum);
    return 0;
}

问题描述】

输入两个正整数a和b(0<a,b<1000000),求出其最大公约数和最小公倍数并输出。
【输入文件】

从标准输入读取一行,是两个整数a和b,以空格分隔。
【输出文件】

向标准输出打印以空格分隔的两个整数,分别是a、b的最大公约数和最小公倍数。在输出末尾要有一个回车符。

#include  <stdio.h> 
#include  <string.h> 
int gy(int a,int b)
{
    int i;
    for ( i = a<b?a:b; i >0; i--)
    {
        if (a%i==0&&b%i==0)
        {
            return i;
            break;
        }
        
    }
    
}

int main()
{       
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d %d\r",gy(a,b),(a*b)/gy(a,b));
    return 0;
}

【问题描述】编写函数,实现将一个3×3的矩阵转置,矩阵转置在设计的函数内完成,输入输出在 main 中完成。

【输入形式】输入一个3×3的int型整数

【输出形式】输出转置矩阵

【样例输入】

23 42 44

16 35 81

25 14 45

【样例输出】

23 16 25

42 35 14

44 81 45

#include  <stdio.h> 
#include  <string.h> 

int main()
{
  int a[3][3];
  int i,j,t;

  for ( i = 0; i < 3; i++)
  {
    for ( j = 0; j < 3; j++)
    {
      scanf("%d",&a[i][j]);
    }
    
  }

    for ( i = 0; i < 3; i++)
  {
    for ( j = i; j < 3; j++)
    {
      t=a[i][j];
      a[i][j]=a[j][i];
      a[j][i]=t;
      }
  }
    for(i=0;i<3;i++)
    {
    printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
    }


  
  return 0;
}

问题描述】字符串的大小比较是编程语言里常用的功能,现试着编程运用指针实现两个字符串按字典序大小比较。要求将字符串比较大小的功能做成单独的函数,并在main函数里调用。
   编程提示:
(1)确定字符串比较函数的形式:int strcompare(const char * str1, const char * str), 当str1>str2时返回一个正整数,str1==str2时返回0,str1<str2时返回负整数;   
(2)strcompare的思路:定义两个char *指针p和q,分别指向str1,str2,开始循环,循环条件表达式为*p == *q && *q != ‘\0’ && *p != ‘\0’,循环体为 p++; q++;。当循环条件不满足时,跳出循环,这代表:
1)p,q指向了两个字符串第一个不相同的字符;
2)str1字符串或者str2字符串到达了字符串结束字符’\0’,此时返回判断p和q指向的字符的大小即可。
【输入形式】输入两个字符串,以回车作为分隔符
【输出形式】比较结果
【样例输入】
abcf
abed
【样例输出】-2

#include  <stdio.h> 
#include  <string.h> 
int strcompare(const char * str1, const char * str)
 {
    const char*p,*q;
    p=str1,q=str;
    while ( *p == *q &&*q != '\0' && *p != '\0')
    {
        p++;
        q++;
    }
   
      return *p-*q; 
 }
int main()
{   
    char a[100],b[100];
    scanf("%s",a);
    scanf("%s",b);
    printf("%d",strcompare(a,b));
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值