MENU

C语言实验+应用作业 7

2017 年 11 月 23 日 • 日常作业

这是我的作业和我的答案,供将来自己检索,和大家参考之用。

1、已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。

#include <stdio.h>

void printa(int arr[],int leng){
    int i;
    for(i=0;i<leng;i++)
        printf("%d\t",arr[i]);
}
void insert(int arr[],int leng,int n,int order){
    int i;
    for(i=leng-1;i>=order;i--)
        arr[i+1]=arr[i];
    arr[order]=n;
}
int main()
{
    int arr[8]={-45,0,8,8,11,95,98749},leng=7; //以此为例
    printf("原数组为:\n");
    printa(arr,leng);
    int n,i;
    printf("\n请输入一个数:");
    scanf("%d",&n);
    if(leng==1){
        printf("抱歉,请使原数组多于一个数!");
    }else{
        if(arr[0]<arr[leng-1]){ //原数组从小到大排列
            for(i=0;i<=leng;i++){
                if(i==leng){
                    arr[i]=n;
                }else if(n<arr[i]){
                    insert(arr,leng,n,i);
                    break;
                }
            }
        }else if(arr[0]>arr[leng-1]){
            for(i=0;i<=leng;i++){
                if(i==leng){
                    arr[i]=n;
                }else if(n>arr[i]){
                    insert(arr,leng,n,i);
                    break;
                }
            }
        }else{
            printf("抱歉,原数组的数都一样大!");
        }
    }
    printf("新数组:\n");
    printa(arr,leng+1);
    printf("\n");
    return 0;
}

2、设计一个程序,从键盘输入指定个数的数据,按选择排序方法,将其按从小到大的顺序排列。(选择排序,首先找出值最小的数,然后把这个数与第一个数交换,这样值最小的数就放到了第一个位置;然后,在从剩下的数中找值最小的,把它和第二个数互换,使得第二小的数放在第二个位置上。以此类推,直到所有的值从小到大的顺序排列为止。)

输入/输出实例:
输入:32 45 7 21 12
输出:7 12 21 32 45
#include <stdio.h>

void cha(int which,int order,int arr[11]){ //which>=order
    int i,value=arr[which];
    for(i=which;i>order;i--) arr[i]=arr[i-1];
    arr[order]=value;
}
int findMin(int arr[],int from,int to){
    int i,min,minOrder;
    for(i=from;i<=to;i++){
        if(i==from){
            min=arr[from];
            minOrder=from;
        }else{
            if(arr[i]<min){
                min=arr[i];
                minOrder=i;
            }
        }
    }
    return minOrder;
}
int main()
{
    int arr[5],i;
    for(i=0;i<5;i++)
        scanf("%d",&arr[i]);
    for(i=0;i<5-1;i++)
        cha(findMin(arr,i,5-1),i,arr);
    for(i=0;i<5;i++)
        printf("%d ",arr[i]);
    printf("\n");
    return 0;
}

3、青年歌手参加歌曲大奖赛,有10个评委对她的进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。

输入/输出实例:
输入:8.5 9 9.8 6.5 8.7 8.5 9.3 9.6 8.9 8.2
输出:8.8
#include <stdio.h>

float findMin(float arr[],int leng){
    int i;
    float min;
    for(i=0;i<leng;i++){
        if(i==0){
            min=arr[0];
        }else{
            if(arr[i]<min){
                min=arr[i];
            }
        }
    }
    return min;
}
float findMax(float arr[],int leng){
    int i;
    float max;
    for(i=0;i<leng;i++){
        if(i==0){
            max=arr[0];
        }else{
            if(arr[i]>max){
                max=arr[i];
            }
        }
    }
    return max;
}
int main()
{
    float arr[10],sum=0;
    int i;
    for(i=0;i<10;i++){
        scanf("%f",&arr[i]);
        sum+=arr[i];
    }
    printf("%.1f\n",(sum-findMin(arr,10)-findMax(arr,10))/(10-2));
    return 0;
}

4、有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。

输入/输出实例:
输入:123,94,-10,218,3,9,10,-83,45,16,44,-99
输出:218 0 3
#include <stdio.h>

int main()
{
    int arr[3][4],i,j,max,iMax,jMax;
    for(i=0;i<3;i++){
        for(j=0;j<4;j++){
            scanf("%d",&arr[i][j]);
            getchar();
            if(i==0&&j==0){
                max=arr[0][0];
                iMax=0;jMax=0;
            }else if(arr[i][j]>max){
                max=arr[i][j];
                iMax=i;jMax=j;
            }
        }
    }
    printf("%d %d %d\n",max,iMax,jMax);
    return 0;
}

5、输入一串字符,计算其中字符、数字和空格的个数。
输入:sd234kj64jk mjk
输出:字符:9 数字:5 空格:1

#include <stdio.h>

int main()
{
    char ch;
    int character=0,number=0,space=0;
    while(ch=getchar(),ch!='\n'){
        if(ch>='0'&&ch<='9') number++;
        else if(ch==' ') space++;
        else character++;
    }
    printf("字符:%d\t数字:%d\t空格:%d\n",character,number,space);
    return 0;
}

6、有15个数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。
输入:-12 -8 12 24 45 46 56 58 68 78
输入要查找的数据:58
输出:58的下标为7
输入要查找的数据:21
输出:”无此数”

#include <stdio.h>

int main()
{
    int arr[15],i,j,mid,findValue;
    for(i=0;i<15;i++)
        scanf("%d",&arr[i]);
    while(1){
        printf("输入要查找的数据:");
        scanf("%d",&findValue);
        i=0;j=14;
        do{
            if(i!=j){
                mid=i+(j-i)/2;
                //printf("[%d,%d;%d] ",i,j,mid); //debug
                if(arr[mid]<findValue){
                    i=mid+1;
                }else if(arr[mid]>findValue){
                    j=mid-1;
                }else{
                    printf("%d的下标为%d\n",findValue,mid);
                    break;
                }
            }else{
                if(arr[i]==findValue)
                    printf("%d的下标为%d\n",findValue,i);
                else
                    printf("无此数\n");
                break;
            }
        }while(1);
    }
    return 0;
}

1、假定在一维数组a[10]中保存着10个整数42,55,73,28,48,66,30,65,94,72,编译程序从中顺序查找出具有给定值x的元素,若查找成功则返回该元素的下标位置,否则表明查找失败返回-1。

#include <stdio.h>

int main()
{
    int a[10]={42,55,73,28,48,66,30,65,94,72},x,i;
    scanf("%d",&x);
    for(i=0;i<10;i++){
        if(a[i]==x){
            return i;
            break;
        }
    }
    return -1;
}

2、假如一维数组a[N]中的元素是一个从小到大顺序排列的有序表,编一程序从a 中二分查找出其值等于给定值x的元素。

#include <stdio.h>
#define N 5
int main()
{
    int a[N]={-8,-5,0,1,2},i,j,mid,x;
    printf("输入要查找的数据:");
    scanf("%d",&x);
    i=0;j=N-1;
    do{
        if(i!=j){
            mid=i+(j-i)/2;
            //printf("[%d,%d;%d] ",i,j,mid); //debug
            if(a[mid]<x){
                i=mid+1;
            }else if(a[mid]>x){
                j=mid-1;
            }else{
                printf("%d的下标为%d\n",x,mid);
                break;
            }
        }else{
            if(a[i]==x)
                printf("%d的下标为%d\n",x,i);
            else
                printf("无此数\n");
            break;
        }
    }while(1);
    return 0;
}

3、从键盘上依次输入10个字符串到二维字符数组w中保存起来,输入的每个字符串的长度不得超过29。

include <stdio.h>

int main()
{
    char arr[10][30],ch;
    int i,j;
    for(i=0;i<10;i++){
        printf("请输入第%d个字符串:",i+1);
        for(j=0;j<30;j++){
            ch=getchar();
            if(j==30-1&&ch!='\n'){
                printf("字符串长度超过29,将要求您重新输入!\n");
                fflush(stdin);
                i--;break;
            }
            if(ch=='\n'){
                arr[i][j]=0;
                if(j==0)
                    printf("警告:您刚输入了空字符串!\n");
                break;
            }else{
                arr[i][j]=ch;
            }
        }
    }
    return 0;
}

4、设计一个字符串比较函数,用来比较两个字符串s1和s2的大小,若s1大于s2,则返回1,若s1等于s2,则返回0,否则返回-1。在主函数中调用该函数,验证其正确性。

#include <stdio.h>

int strCpm(char a[],char b[]){
    int i;
    for(i=0;a[i]&&b[i];i++){
        if(a[i]>b[i]) return 1;
        else if(a[i]<b[i]) return -1;
    }
    if(!a[i]&&!b[i]) return 0;
    else if(!a[i]) return -1;
    else return 1;
}
int main()
{
    char s1[]="a",s2[]="aa";
    if(strCpm(s1,s2)>0) printf("s1>s2\n");
    else if(strCpm(s1,s2)<0) printf("s1<s2\n");
    else printf("s1=s2\n");
    return 0;
}

5、编写一个程序,首先从键盘上输入一个字符串,接着输入一个字符,然后分别统计出字符串中的大于、等于、小于该字符的字符个数。

#include <stdio.h>
#include <string.h>
int main()
{
    char s[101],ch;
    int more=0,less=0,same=0,i;
    printf("输入字符串:");
    gets(s);
    printf("输入一个字符:");
    ch=getchar();
    for(i=0;s[i];i++){
        if(s[i]>ch) more++;
        else if(s[i]<ch) less++;
        else same++;
    }
    printf("%d\t%d\t%d\n",more,same,less);
    return 0;
}

原发于 2016-12-02 17:29