高级语言习题1

1、设计一个C语言函数,将整数数组a[n]划分为左右两部分,使左边所有元素值为奇数,右边所有元素值为偶数。

#include <stdio.h>
#define MAXN 100

void divide(int a[],int n);

int main(){
    int a[MAXN];
    int i,n,j;
    printf("请输入数组大小:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("请输入a[%d]:",i);
        scanf("%d",&a[i]);
    }
    divide(a,n);
    for(j=0;j<n;j++){
        printf("a[%d]:%d\n",j,a[j]);
    }
    return 0;
}

void divide(int a[],int n){
    int i=0,j=n-1;
    int temp;
    while(i<j){
        while(a[i]%2!=0) i++;
        while(a[j]%2==0) j--;
        if(i<j){
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
        }
    }
}

2、设给定一个m行n列整型矩阵A,编写一个函数swapt,使得它对A的元素进行交换,具体如下:第一个元素和倒数第一个元素交换,第二个元素和倒数第二个元素交换……在具体实现时不允许另设矩阵。例如:假设有下面所示的3*4矩阵A,则经过交换后的矩阵应如矩阵B。
在这里插入图片描述

#include <stdio.h>
#define MAXM 100
#define MAXN 100

void swapt(int a[][MAXN],int m,int n);

int main(){
    int a[MAXM][MAXN];
    int m,n;
    int i,j;
    printf("请输入行数和列数");
    scanf("%d%d",&m,&n);
    printf("请输入数组元素");
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    swapt(a,m,n);
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            printf("a[%d][%d]:%d\t",i,j,a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

void swapt(int a[][MAXN],int m,int n){
    int i,j;
    int temp;
    for(i=0;i<(m/2);i++){
        for(j=0;j<n;j++){
            temp=a[i][j];
            a[i][j]=a[m-1-i][n-1-j];
            a[m-1-i][n-1-j]=temp;
        }
    }
    if(m%2!=0){
        for(j=0;j<n/2;j++)
        {
            temp=a[m/2][j];
            a[m/2][j]=a[m/2][n-1-j];
            a[m/2][n-1-j]=temp;
        }
    }
}

注:函数的参数可以是数组,参数中数组的第一维不需要填写长度(如果是二维数组,第二维需要填写长度),实际调用时也只需要填写数组名。
void swapt(int a[][MAXN],int m,int n);

3、已知在一维数组A[m+n]中,依次存放着两个变量(a1,a2,……,am),(b1,b2,……,bn)。编写一个函数将两个变量的位置交换。即把(b1,b2,……,bn)放到(a1,a2,……,am)前面,变为(b1,b2,……,bn,a1,a2,……,am)。

#include <stdio.h>
#define MAXM 100
#define MAXN 100
typedef int ElementType;

void rever(ElementType A[],int m);

int main(){
    ElementType A[MAXM+MAXN];
    int m,n;
    int i;
    printf("请输入向量a和b的个数:");
    scanf("%d%d",&m,&n);
    printf("请输入向量a:");
    for(i=0;i<m;i++){
        scanf("%d",&A[i]);
    }
    printf("请输入向量b:");
    for(i=m;i<m+n;i++){
        scanf("%d",&A[i]);
    }
    rever(A,m+n);
    rever(A,n);
    rever(A+n,m);
    for(i=0;i<m+n;i++){
        printf("%d ",A[i]);
    }
    return 0;
}

void rever(ElementType A[],int m){
    int i,temp;
    for(i=0;i<m/2;i++){
        temp=A[i];
        A[i]=A[m-1-i];
        A[m-1-i]=temp;
    }
}

注:typedef int ElementType;
4、有100个正整数存放在数组中,试编一函数,要求:
(1)把所有的偶数按从小到大的顺序存放在数组的前半部;
(2)把所有的奇数按从大到小的顺序存放在数组的后半部;
例如:1 4 3 2 5 9 7
输出:2 4 1 3 5 7 9

#include <stdio.h>
#define N 100

int divide(int a[],int n);

void sort(int a[],int n);

int main(){
    int a[N];
    int n,i,d;
    printf("请输入数组个数:");
    scanf("%d",&n);
    printf("请输入数组:");
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    d=divide(a,n);
    sort(a,d);
    sort(a+d,n);
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

int divide(int a[],int n){
    int i=0,j=n-1;
    int temp;
    while(i<j){
        while(a[i]%2==0) i++;
        while(a[j]%2!=0) j--;
        if(i<j){
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
        }
    }
    return i;
}

void sort(int a[],int n){
    int i,j,temp;
    for(i=0;i<n;i++){
        for(j=0;j<n-1-i;j++){
            if(a[j]>a[j+1]){
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}

5、设给定数组变量A和B,它们的值满足条件:A[i]<=A[i+1],B[j]<=B[j+1],其中i=0,1,……,m-1,j=0,2,……,n-1;试写一个程序,将A和B合并为一个有序数组C,使得C[k]<=[k+1],k=0,1,……,m+n-1。

#include <stdio.h>
#define N 100
#define M 200

void fun(int A[],int B[],int C[],int m,int n);

int main(){
    int A[N],B[N],C[M];
    int m,n;
    int i;
    printf("请输入数组A和B的长度:");
    scanf("%d%d",&m,&n);
    printf("请输入数组A:");
    for(i=0;i<m;i++){
        scanf("%d",&A[i]);
    }
    printf("请输入数组B:");
    for(i=0;i<n;i++){
        scanf("%d",&B[i]);
    }
    fun(A,B,C,m,n);
    for(i=0;i<m+n;i++){
        printf("%d ",C[i]);
    }
    return 0;
}

void fun(int A[],int B[],int C[],int m,int n){
    int i,p=0,q=0,k=0;
    while((p<m)&&(q<n)){
        if(A[p]<=B[q]){
            C[k]=A[p];
            p++;
        }
        else{
            C[k]=B[q];
            q++;
        }
        k++;
    }
    if(p==m){
        for(i=q;i<n;i++){
            C[k]=B[i];
            k++;
        }
    }
    if(q==n){
        for(i=p;i<m;i++){
            C[k]=A[i];
            k++;
        }
    }
}

6、设给定N个元素的一维整型数组变量A,若有下面条件:A[i-1]!=A[i],A[i]=A[i+1]=……=A[k],A[k]!=A[k+1]则称A[i],A[i+1],……,A[k]为饱和平台,并定义其长度为k+1-i,试写一个函数,使得它对任给的数组变量A求出最长平台的长度。例如:假如有序列(3,3,2,2,4,4,4),则(3,3)和(2,2)及(4,4,4)都是饱和平台,并且最长的平台的长度是3。

#include <stdio.h>
#define MAXN 100

int fun(int* A,int n);

int main(){
    int A[MAXN];
    int i,n;
    printf("请输入数组大小:");
    scanf("%d",&n);
    printf("请输入数组:");
    for(i=0;i<n;i++){
        scanf("%d",&A[i]);
    }
    printf("平台长度为:%d",fun(A,n));
    return 0;
}

int fun(int* A,int n){
    int length=1,count=1;
    int p=A[0];
    int i;
    for(i=1;i<n;i++){
        if(A[i]==p) count++;
        else{
             p=A[i];
             if(length<count) length=count;
             count=1;
        }
    }
    if(length<count) length=count;
    return length;
}

7、设有N个非负数存放于一维数组中,要求将其中的0移动到后面,非0的数保持原有次序。例如:当N=7时,原有序列7,0,0,3,0,5,0移动后称为7,3,5,0,0,0,0,请写出程序。

#include <stdio.h>
#define N 100

void fun(int* a,int n);

int main(){
    int a[N];
    int i,n;
    printf("请输入数组长度:");
    scanf("%d",&n);
    printf("请输入数组:");
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    fun(a,n);
    printf("移动后数组:");
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

void fun(int* a,int n){
    int i,j;
    for(i=0;i<n;i++){
        if(a[i]==0){
           for(j=i;j<n;j++){
                if(a[j]!=0){
                    a[i]=a[j];
                    a[j]=0;
                    break;
                }
           }
        }
        if(j==n) break;
    }
}

8、编写函数求整型数组a中存储的m个不重复整数的第k大的整数。其中,m>=1,1<=k<=m。

#include <stdio.h>
#include <algorithm>
#define N 100
using namespace std;

int fun(int* a,int n,int k);

int main(){
    int a[N];
    int i,m;
    int k;
    printf("请输入数组长度:");
    scanf("%d",&m);
    printf("请输入数组:");
    for(i=0;i<m;i++){
        scanf("%d",&a[i]);
    }
    printf("需要第几大的整数?");
    scanf("%d",&k);
    printf("第%d大的整数为:%d",k,fun(a,m,k));
    return 0;
}

int fun(int* a,int n,int k){
    sort(a,a+n);
    return a[k-1];
}

9、已知长度为n的线性表一算法A采用顺序存储结构,写一算法,删除该线性表中所有值为item的数据元素。
题中未要求元素间的相对位置不变,可设头尾两个指针(i=1,j=n),从两端向中间移动,若遇到值为item的数据元素时,直接将右端元素左移至值为item的位置。

#include <stdio.h>
#define N 100
typedef int ElementType;

int delete1(ElementType* a,int n,ElementType item);

int main(){
    int a[N],item;
    int n,i,length;
    printf("请输入数组长度和要删除的数值:");
    scanf("%d%d",&n,&item);
    printf("请输入数组:");
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    length=delete1(a,n,item);
    printf("删除item之后的数组:");
    for(i=0;i<length;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

int delete1(ElementType* a,int n,ElementType item){
    int i=0,j=n-1;
    while(i<j){
        while(i<j&&a[i]!=item) i++;
        if(i<j){
            while(i<j&&a[j]==item) j--;
        }
        if(i<j) a[i++]=a[j--];
    }
    return j+1;
}

10、编写一个函数,从给定的向量A中删除元素值在x到y(x<=y)之间的所有元素(向量要求各元素之间不能有间断)函数原型为:int del(int A,int n,int x,int y)。其中参数n为输入向量的维数,返回值为删除元素后的维数。

#include <stdio.h>
#define N 100

int del(int* A,int n,int x,int y);

int main(){
    int a[N],x,y;
    int n,i,length;
    printf("请输入数组长度和x、y的值:");
    scanf("%d%d%d",&n,&x,&y);
    printf("请输入数组:");
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    length=del(a,n,x,y);
    printf("删除后的数组:");
    for(i=0;i<length;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

int del(int* A,int n,int x,int y){
    int i=0,k=0;
    while(i<n){
        if((A[i]>=x)&&(A[i]<=y)){
            k++;
        }
        else A[i-k]=A[i];
        i++;
    }
    return n-k;
}

11、设整型数组 A[m+1][n+1],并且 A[i][j]<=A[i][j+1],A[i][j]<=A[i+1][j],0<=i<=m,0<=j<=n,整型变量 x 的值在A中存在。设计一个算法,找出满足 A[i][j]=x 的 i 和 j 的值,要求次数不超过 m+n。

#include <stdio.h>
#define MAXM 100
#define MAXN 100

void find(int a[][MAXN],int n,int x);

int main(){
    int a[MAXM][MAXN],x;
    int m,n;
    int i,j;
    printf("请输入行数和列数:");
    scanf("%d%d",&m,&n);
    printf("请输入数组元素:\n");
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    printf("请输入x:");
    scanf("%d",&x);
    find(a,n,x);
    return 0;
}

void find(int a[][MAXN],int n,int x){
    int i=0,j=n-1;
    while(a[i][j]!=x){
        if(a[i][j]>x) j--;
        else i++;
    }
    printf("i=%d,j=%d",i+1,j+1);
}

12、求一个3*3的整型矩阵对角线元素之和。

#include <stdio.h>

int main(){
    int a[3][3];
    int i,j;
    int sum=0;
    printf("请输入一个3*3整型矩阵:\n");
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<3;i++){
        sum+=a[i][i];
    }
    printf("sum=%d",sum);
    return 0;
}

13、设A为5 * 5的二维数组,编一函数,求A中出现频度最高的数。例如:5 * 5的矩阵如下:
在这里插入图片描述
出现频度最高的为3。

#include <stdio.h>
int a[5][5];
int MAXN();

int main(){
    int i,j;
    printf("请输入一个5*5整型矩阵:\n");
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            scanf("%d",&a[i][j]);
        }
    }
    printf("频度最高的数值为:%d",MAXN());
    return 0;
}

int MAXN(){
    int b[11]={0};	#如果想要给整个数组都赋初值,只需要把第一个元素赋为0,或者只用一个大括号来表示。
    int i,j;
    int maxn;
    for(i=0;i<5;i++){
        for(j=0;j<5;j++){
            b[a[i][j]]++;
        }
    }
    j=b[0];
    for(i=0;i<11;i++){
        if(j<b[i]){
            j=b[i];
            maxn=i;
        }
    }
    return maxn;
}

14、编写一个程序,统计输入的字符串中每一个小写英文字母出现的次数。

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

int main(){
    char a[100],c;
    int i=0,j=0,count,len;
    while((c=getchar())!='\n'){
        if(c>='a'&&c<='z')
            a[i++]=c;
    }
    a[i]='\0';
    len=strlen(a);  //计算字符串长度
    for(i=0;i<len;i++){
        if(a[i]==' ') continue;
        c=a[i];
        count=1;
        for(j=i+1;j<len;j++){
            if(a[j]==c){
                a[j]=' ';
                count++;
            }
        }
        printf("%c=%d\n",c,count);
    }
    return 0}

15、螺旋矩阵是整数的一种排列方式。例如55的螺旋矩阵如下:
在这里插入图片描述
编写程序生成并输出10
10的螺旋矩阵。

#include <stdio.h>
#define MAXN 100

int main(){
    int a[MAXN][MAXN];
    int i,j,number=1;
    int n;
    printf("n=:");
    scanf("%d",&n);
    for(i=0;i<=n/2;i++){
        for(j=i;j<n-i;j++) a[i][j]=number++;
        for(j=i+1;j<n-i;j++) a[j][n-1-i]=number++;
        for(j=n-2-i;j>i;j--) a[n-1-i][j]=number++;
        for(j=n-1-i;j>i;j--) a[j][i]=number++;
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d\t",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

16、将整数的各个位数保存到数组A[ ]中。

#include <stdio.h>

int main(){
    int a[50];
    int n,length=0,i=0,m;
    printf("please input a number:");
    scanf("%d",&n);
    m=n;
    while(m!=0){
        a[i]=m%10;
        m/=10;
        length++;
        i++;
    }
    printf("output array:");
    for(i=0;i<length;i++)
        printf("%d ",a[i]);
    return 0;
}

17、设有正整数N=d1d2……dn,编写一程序,对于输入的N求d1+d2+……+dn。

#include <stdio.h>

int fun(int n);

int main(){
    int n;
    printf("please input a number:");
    scanf("%d",&n);
    printf("sum=%d",fun(n));
    return 0;
}

int fun(int n){
    int sum=0,m;
    while(n!=0){
        m=n%10;
        sum+=m;
        n/=10;
    }
    return sum;
}

18、写一个函数,判断给定的整数是否由1、3、7、9组成。

#include <stdio.h>

void fun(int n);

int main(){
    int n;
    printf("please input a number:");
    scanf("%d",&n);
    fun(n);
    return 0;
}

void fun(int n){
    int m,flag=1;
    while(n!=0){
        m=n%10;
        n/=10;
        if(!(m==1||m==3||m==7||m==9)){
            flag=0;
            break;
        }
    }
    if(flag) printf("Yes!");
    else printf("No!");
}

19、设m是一个正整数,m=a1a2……an,编写一个程序,求m的反序数m’,m’=an……a2a1。假设不考虑溢出。

#include <stdio.h>

int fun(int n);

int main(){
    int n;
    printf("please input m:");
    scanf("%d",&n);
    printf("m'=%d",fun(n));
    return 0;
}
int fun(int n){
    int m,s=0;
    while(n!=0){
        m=n%10;
        n/=10;
        s=s*10+m;
    }
    return s;
}

20、某公司采用公用电话传递数据,数据是四位整数,在传递过程中,为了安全,进行了加密,加密规则如下:每位数字加6,然后用和除以9的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。编写程序,将输入的数据加密。例如,输入的传递数据为3726,输出的加密数据为3840。

#include <stdio.h>

int fun(int n);

int main(){
    int n;
    printf("传递数据:");
    scanf("%d",&n);
    printf("加密数据:%d",fun(n));
    return 0;
}

int fun(int n){
    int a[4];
    int i,temp,s=0;
    for(i=0;i<4;i++){
        a[i]=((n%10)+6)%9;
        n/=10;
    }
    for(i=0;i<4;i++){
        s=s*10+a[i];
    }
    return s;
}

21、设集合M的定义如下:
a)整数1属于M;
b)如果n属于M,则y=2n+1和z=3n+1也属于M;
c)再没有别的整数属于M,(M={1,3,4,7,9,10……})
试编写一个程序,使得它打印出M的前面100个最小数。

#include <stdio.h>
#include <algorithm>
using namespace std;

int main(){
    int a[100],i=1,j=0;
    a[0]=1;
    while(i<100){
        a[i++]=a[j]*2+1;
        a[i++]=a[j]*3+1;
        j++;
    }
    sort(a,a+100);
    printf("M={");
    for(i=0;i<100;i++){
        printf("%d ",a[i]);
    }
    printf("}");
    return 0;
}

22、试写一个函数f,使得它计算sin(x)的近似值。其计算过程是i从1开始计算Si(x),直至|Si(x)-Si-1(x)|<0.00005,并把Si的值作为sin(x)的近似值返回。其中:Si(x)=x-(x ^ 3/3!)…+(-1) ^ (i-1)(x ^ (2i-1)/(2i-1)!。

#include <stdio.h>
#include <math.h>

double Si(double x);

int main(){
    double x;
    printf("please input x:");
    scanf("%lf",&x);
    printf("sin(%f)=%f",x,Si(x));
    return 0;
}

double Si(double x){
    double taylor=x,s=x;
    int i=0;
    while(fabs(taylor)>0.00005){
        i++;
        taylor=-taylor*x*x/(2*i*(2*i+1));
        s+=taylor;
    }
    return s;

21、编写一个函数,计算X-(X ^ 2/2!)+(X ^ 3/3!)-(X ^ 4/4!)+……当第k项tk满足|tk<=e^-3|,计算结束。

#include <stdio.h>
#include <math.h>

double fun(double x);

int main(){
    double x;
    printf("please input x:");
    scanf("%lf",&x);
    printf("sum=%f",fun(x));
    return 0;
}

double fun(double x){
    double s=x,sum=x;
    int i=1;
    while(fabs(s)>exp(-3)){
        i++;
        s=-s*x/i;
        sum+=s;
    }
    return sum;
}

22、用二分法求方程:2x ^ 3-4x ^ 2 + 3x -6=0位于(-10,10)之间的一个根。

#include <stdio.h>
#include <math.h>

double fun(double x);

int main(){
    double m=-10,n=10;
    double k;
    while(fabs(m-n)>1e-8){
        k=(m+n)/2;
        if((fun(m)*fun(k))<0){
            n=k;
        }
        else{
            m=k;
        }
    }
    k=(m+n)/2;
    printf("%f",k);
    return 0;
}

double fun(double x){
    return 2*pow(x,3)-4*pow(x,2)+3*x-6;
}

23、写一个程序,用牛顿迭代法求方程:2x ^ 3-4x ^ 2 + 3x -6=0在x=1附近的根。

#include <stdio.h>
#include <math.h>

double fun1(double x);

double fun2(double x);

int main(){
    double x1=1,x2;
    x2=x1-fun1(x1)/fun2(x2);
    while(fabs(x1-x2)>1e-8){
        x1=x2;
        x2=x1-fun1(x1)/fun2(x2);
    }
    printf("x=%f",x2);
    return x2;
}

double fun1(double x){
    return 2*pow(x,3)-4*pow(x,2)+3*x-6;
}

double fun2(double x){
    return 6*pow(x,2)-8*x+3;
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值