编程练习五

来源:互联网 发布:passport视频软件 编辑:程序博客网 时间:2024/05/01 13:41

第10 章数组和指针

1.定义一个二维数组,存入5个学生的数学、语文、英语、物理、化学5门课程的成绩,计算并输出每一门课程的平均成绩和每一位学生的平均成绩。

 

#include <stdio.h>#include <stdlib.h>int main(void){    int a[5][5]= {{10,20,30,40,50},{20,30,40,50,60},{30,40,50,60,70},{40,50,60,70,80},{50,60,70,80,90}};     int i,j,k,l;   /* printf("please input 5 students's scores:\n");    for( i=0; i<5; i++)        for( j=0; j<5; j++)        {            scanf("%lf", &a[i][j]);        }*/    int st_avg;    int sub_avg;    printf("序号\t数学\t语文\t英语\t物理\t化学\t平均分\n");//表格输出    for ( k=0; k<5; k++)    {        int sum_st=0;        printf("%d\t",k+1);//打印序号        for( l=0; l<5; l++)        {            sum_st+=a[k][l];            printf("%d\t",a[k][l]);//打印成绩        }        st_avg=sum_st/5;        printf("%d\n",st_avg);//打印每个学生的平均成绩    }    printf("平均分:\t");    for ( k=0; k<5; k++)    {        int sum_sub=0;        for( l=0; l<5; l++)        {            sum_sub+=a[l][k];        }        sub_avg=sum_sub/5;        printf("%d\t",sub_avg);//打印每科的平均分    }return 0;} 

 

2. 编写程序,把下面的数据输入一个二维数组中。

25 36 78 13 

12 26 88 93

75 18 22 32

56 44 36 58

然后执行以下操作:①输出矩阵两个对角线上的数;②分别输出各行和各列的和;

③交换第一行和第三行的位置;④交换第二列和第四列的位置;⑤输出处理后的数组。

//#include<iostream>#include <stdio.h>#include <stdlib.h>
void fun_diag(int a[4][4]);void fun_sum(int a[4][4]);void change_col(int a[4][4]);void change_row(int a[4][4]);int main(void){    int a[4][4]= {{25,36,78,13},{12,26,88,93},{75,18,22,32},{56,44,36,58}};    fun_diag(a);    fun_sum(a);    change_col(a);    change_row(a);    int i,j;    printf("\n");    printf("变换后的数组为:\n");    for(i=0; i<4; i++)    {        for(j=0; j<4; j++)            printf("%d\t",a[i][j]);        printf("\n");    }    return 0;} void fun_diag(int a[4][4]){    int i,j;    printf("对角线的数字为(-45度):");    for (i=0; i<4; i++)    {        printf("%d\t",a[i][i]);    }    printf("\n");    printf("对角线的数字为(45度):");    for(j=0; j<4; j++)    {        printf("%d\t",a[j][3-j]);    }     printf("\n");} void fun_sum(int a[4][4]){    int i,j;    printf("\n");    for (i=0; i<4; i++)    {        printf("第%d行的和为:",i+1);        int sum_row=0;        for (j=0; j<4; j++)        {             sum_row+=a[i][j];        }        printf("%d\n",sum_row);    }    printf("\n");    for (i=0; i<4; i++)    {        printf("第%d列的和为:",i+1);        int sum_col=0;        for (j=0; j<4; j++)        {             sum_col+=a[i][j];        }        printf("%d\n",sum_col);    }}void change_col(int a[4][4]){    int j;     for(j=0; j<4; j++)    {        int temp=0;        temp=a[j][1];        a[j][1]=a[j][3];        a[j][3]=temp;    }} void change_row(int a[4][4]){    int j;     for (j=0; j<4; j++)    {        int temp=0;        temp=a[0][j];        a[0][j]=a[2][j];        a[2][j]=temp;    } }


 

这里注意二维数组作为参数的使用,例子:

int sum( int (*arr) [4], int size);

//其中的括号是必不可少的,因为下面的声明将声明一个由四个指向int的指针组成的数组,而不是一个指向由4个int组成的数组的指针。

 

int *arr[4];   //声明了一个指针数组,这个数组包含4个int指针变量

int (*arr)[4] //声明了一个指针变量,这个指针指向由4个int组成的数组

 

还有另外一种声明格式,含义与上述正确原型完全相同,但是可读性更强:

int sum(int arr[][4], int size);  

 

除此之外,还可以利用C++的引用格式:

  int   sum(int (&arr)[4][4]) // 引用作形参,数组作引用形参,必须指清所有维数

 

3. 已知数组a中的元素已按由小到大顺序排列,编写程序将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列。

#include<stdio.h>int main(){    int a[10] = {1,2,3,4,6,7,8,9,10}; //数组长度10,初始化9个元素.    printf("原本的数列为:");    int m,j,i;    for(i=0; i<10; i++)        printf("%4d",a[i]);    printf("\n");    printf("请插入一个数\n");    scanf("%d",&m);    for (i=0; a[i]<= m; ++i); //找出要插入的位置    for( j=10-1; j>i; --j) //将该位置往后的数依次后移    {        a[j]=a[j-1];    }    a[j] = m; //将该数插入到数组中    printf("\n");    printf("插入数字后的数列为:");    for(i=0; i<10; ++i ) //输出    {        printf("%4d",a[i]);    }} 


4. 编程打印直角杨辉三角形前六行。

 

//打印直角杨辉三角形前六行/*方法一:利用二维数组,如果j == 0 或 j == i,则p[i][j] = 1 ;否则,p[i][j] = p[i - 1][j] + p[i - 1][j - 1] ;*/ #include<stdio.h>void yangtrianle(int n);int main(){    int n;    printf("请输入要输出的杨辉三角形的行数:");    scanf("%d",&n);    yangtrianle(n);    return 0;} void yangtrianle(int n){    int a[n][n];    int i,j;    //初始化二维数组    for(i=0; i<n; i++)        for(j=0; j<n; j++)            a[i][j]=0;    printf("\n");     //计算系数并输出    for (i=0; i<n; i++)    {        for(j=0; j<=i; j++)        {             if (j==0||j==i) a[i][j]=1;            else a[i][j]=a[i-1][j]+a[i-1][j-1];            printf("%3d",a[i][j]) ;            printf(" ");        }        printf("\n");    }}  //打印直角杨辉三角形前六行/*方法二:直接建立一维数组,*/ #include<stdio.h>void yangtrianle(int n);int main(){    int n;    printf("请输入要输出的杨辉三角形的行数:");    scanf("%d",&n);    yangtrianle(n);    return 0;} void yangtrianle(int n){    int a[n];    //初始化数组    for(int i=0;i<n;i++)        a[i]=0;    a[0]=1;    printf("\n");    for (int i=0;i<n;++i)    {        // 计算当前行的数字,注意要从后向前计算,否则会覆盖以前的值        for (int j=i; j>0;--j)            a[j]+=a[j-1];        // 打印空格        for (int j=0;j<n-i;++j)            printf(" ");        // 打印数字        for (int j=0;j<i+1;++j)        {            printf("%3d",a[j]);            printf(" ");        }        printf("\n");    }} 

5. 计算字符串中子串出现的次数。要求:用一个子函数subString()实现,参数为指向字符串和要查找的子串的指针,返回次数。

 

#include<stdio.h>int subString(char *str,char*str1);#define M 200#define N 100int main(){    char a[M],b[N];    printf("Enter a string(<200)...\n str=");    gets(a);    printf("input a subString(<100) of string...\n str1=");    gets(b);    printf("There are %d.\n",subString(a,b));    return 0;} int subString(char *str,char*str1){    int n;    char *ptmp;     /*strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。       找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;       如果未找到所搜索的字符串,则返回NULL。*/    for(n=0; *str; str++)        if(ptmp=strstr(str,str1))         {            n++;            str=ptmp;        }    return n;}

 

6. 加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。算法:明文中的字母转换成其后的第4个字母,例如,A变成E(a变成e),Z变成D,非字母字符不变;同时将密文每两个字符之间插入一个空格。例如,China转换成密文为Glmre。要求:在函数change中完成字母转换,在函数insert中完成增加空格,用指针传递参数。

#include<stdio.h>#include <string.h> void change(char *str);void fun_insert(char *str, int len);#define M 200 int main(){    char a[M];    printf("Enter a string(<200)...\n str=");    gets(a);    int len=strlen(a);    change(a);    fun_insert(a,len);    printf("after change, the string is: %s",a);    return 0;} void change(char *str){    int i=0;    while(str[i])    {        /* 小写字母 */        if(str[i]<='z' && str[i]>='a') str[i] =(str[i]-'a'+4)%26+'a';        /* 大写字母 */        else if(str[i]<='Z' && str[i]>='A') str[i]=(str[i]-'A'+4)%26+'A';        i++;    }}void fun_insert(char *str, int len){    int i = 2*len-1, j=len-1;  //插入空格时从后往前    while(i > 0)    {        str[i] = ' ';        str[i-1] = str[j];        i -= 2;        j--;    }    str[2*len-1] = '\0';} 


 

7. 字符替换。要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E),并返回替换字符的个数。

 

#include<stdio.h>#include <string.h> void replacefun(char *str);#define M 200 int main(){    char a[M];    printf("Enter a string(<200)...\n str=");    gets(a);    replacefun(a);    printf("after change, the string is: %s",a);    return 0;} void replacefun(char *str){    int i=0;    while(str[i])    {        if(str[i]=='t') str[i]='e';        if(str[i]=='T') str[i]='E';        //if(str[i]=='t'||str[i]== 'T')  str[i] =str[i]-15;        i++;    }} 

 

8. 编写一个程序,输入星期,输出该星期的英文名。用指针数组处理。

 

#include<stdio.h>#include <string.h> int main(){    char *week[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};/*这是个指针数组,其中每一个元素都相当于一个指针变量,指向字符串的首字母*/    int a;    printf("请输入星期,以数字形式:");    scanf("%d",&a);    printf("it's %s",week[a-1]);    return 0;}  

 

9. 有5个字符串,首先将它们按照字符串中的字符个数由小到大排列,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。

 

<pre name="code" class="html">#include<string.h>void fun(char (*a)[100], int *b, char *c){    int i = 0;    int j = 0;    char temp[100];    for(i = 0; i<5; i++)    {        b[i] = strlen(a[i]);    }    for(i = 0; i<4; i++)    {        for(j = i+1; j<5; j++)        {            if(b[i]>b[j])            {                strcpy(temp, a[i]);                strcpy(a[i], a[j]);                strcpy(a[j], temp);            }        }    }    for(i = 0; i<5; i++)    {        if(strlen(a[i])<3)        {            strcat(c, " ");        }        else        {            c[i] = a[i][2];        }    }} int main(){    char a[100][100];    int i = 0;    int b[100];    char c[100] = "";    for(i = 1; i<6; i++)    {        printf("请输入字符串%d:", i);        gets(a[i-1]);    }    fun(a, b, c);    for(i = 0; i<5; i++)    {        printf("%s\n", a[i]);    }    printf("%s\n", c);    return 0;}


 

10. 定义一个动态数组,长度为变量n,用随机数给数组各元素赋值,然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。

 

#include<stdio.h>#include<stdlib.h>#include<time.h>int funswap(int *a,int n); int main(){    int n,i;    int *arr;    printf("请输入所要创建的一维动态数组的长度:");    scanf("%d",&n);    arr=(int*)calloc(n,sizeof(int));    srand((int)time(0));    printf("排序前的数组:");    for(i=0; i<n; i++)    {        arr[i]=1+(int)(100*rand()/(RAND_MAX+1.0));        printf("%3d\t",arr[i]);    }    printf("\n");    funswap(arr,n);    printf("排序后的数组:");    for(i=0; i<n; i++)    {        printf("%3d\t",arr[i]);    }    free(arr);//释放第一维指针    return 0;} int funswap(int *a,int n){    int i = 0;    int j = 0;    int temp;    for(i = 0; i<n-1; i++)    {        for(j = i+1; j<n; j++)        {            if(a[i] > a[j])            {                temp = a[i];                a[i] = a[j];                a[j] = temp;            }        }    }    return 0;}

0 0
原创粉丝点击