编程练习五
来源:互联网 发布: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;}
- 编程练习五
- 练习五
- C++面向对象编程<五>:小练习-Date类
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- hdu 5003 水题
- ZOJ 2476 Total Amount (字符串处理)
- AS3转到了cocos2d-x
- 第一个真正的Windows程序
- Python Generators(生成器)——yield关键字
- 编程练习五
- 测试计划的目的是什么?如何做好测试计划?
- 星火视频网-linux arm视频教程
- linux初学者12个命令
- 在项目SSH整合时,启动测试时报的警告!
- Python raw_input()和input() 函数 读取交互输入
- 第一个带界面的Windows程序
- 浅谈Python Web框架
- LA 6531 Go up the Ultras 单调栈+RMQ