1.
//编程实现找出字符串中最大字符元素并输出该元素及其对应的ASCII值. //****要求输入提示信息为: //"Input a string:\n" //****输出格式要求为: //"The largest character of \"%s\" is \'%c\' ,The ASCII is %d." #define N 100 #include<stdio.h> #include<string.h> main() { printf("Input a string:\n"); char c[N]; gets(c); char d=c[0]; int i; for(i=1;i<=strlen(c);i++) { if(d<c[i]) d=c[i]; } printf("The largest character of \"%s\" is \'%c\' ,The ASCII is %d.",c,d,d); }
2.
按如下函数原型编程计算并输出n×n阶矩阵的转置矩阵。其中,n由用户从键盘输入。已知n值不超过10。
void Transpose(int (*a)[N], int n);
void Swap(int *x, int *y);
void InputMatrix(int (*a)[N], int n);
void PrintMatrix(int (*a)[N], int n);
输入提示信息:"Input n:"
输入格式:"%d"
输入提示信息:"Input %d*%d matrix:\n"
输出提示信息:"The transposed matrix is:\n"
输出格式:"%d\t"
#include <stdio.h> #define N 10 void Swap(int *x, int *y); void Transpose(int (*a)[N], int n); void InputMatrix(int (*a)[N], int n); void PrintMatrix(int (*a)[N], int n); int main() { int s[N][N], n; printf("Input n:"); scanf("%d", &n); InputMatrix(s, n); Transpose(s, n); printf("The transposed matrix is:\n"); PrintMatrix(s, n); return 0; } /* 函数功能:交换两个整型数的值 */ void Swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } /* 函数功能:计算n*n矩阵的转置矩阵 */ void Transpose(int (*a)[N], int n) { int i, j; for (i = 0; i < n; i++) { for (j = i; j < n; j++) { Swap(*(a + i) + j, *(a + j) + i); } } } /* 函数功能:输入n*n矩阵的值 */ void InputMatrix(int (*a)[N], int n) { int i, j; printf("Input %d*%d matrix:\n", n, n); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", *(a + i) + j); } } } /* 函数功能:输出n*n矩阵的值 */ void PrintMatrix(int (*a)[N], int n) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d\t", *(*(a + i) + j)); } printf("\n"); } }
我的代码
#include<stdio.h> #define N 10 void Transpose(int (*a)[N], int n) { int i,j; for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { Swap(*(a+i)+j,*(a+j)+i); } } } void Swap(int *x, int *y) { int temp; temp=*x; *x=*y; *y=temp; } void InputMatrix(int (*a)[N], int n) { printf("Input %d*%d matrix:\n",n,n); int i,j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%d",*(a+i)+j); } } } void PrintMatrix(int (*a)[N], int n) { int i,j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { printf("%d\t",*(*(a+i)+j)); } printf("\n"); } } main() { int n=100,s[N][N]= {0}; printf("Input n:"); do { scanf("%d",&n); } while(n>10); InputMatrix(s,n); Transpose(s,n); printf("The transposed matrix is:\n"); PrintMatrix(s,n); return 0; }
我个人认为,我的代码比答案还要简单,因为减少了一步不必要的计算,因此,运算时间会短一些。效率会高些!
for(j=i; j<n; j++)
其实如果要直接输出转置矩阵,还有更简便的做法:
即:输出先j后i!无论是代码量还是计算量,都少了一大截!!!
#include<stdio.h> #define N 10 void InputMatrix(int (*a)[N], int n) { printf("Input %d*%d matrix:\n",n,n); int i,j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%d",*(a+i)+j); } } } void PrintMatrix(int (*a)[N], int n) { int i,j; for(i=0; i<n; i++) { for(j=0; j<n; j++) { printf("%d\t",*(*(a+j)+i)); } printf("\n"); } } main() { int n=100,s[N][N]= {0}; printf("Input n:"); do { scanf("%d",&n); } while(n>10); InputMatrix(s,n); printf("The transposed matrix is:\n"); PrintMatrix(s,n); return 0; }
题外话:
有句mmp今天一定要讲。这种题出的简直就是多此一举
因为
我们可以认为: int (*a)[]=int a [][]
int b[4][4]={0}; int (*a)[4]=b; int b[4][4]={0}; int *a[4]; a[0]=b[0]; 就是说 int *a[n]是指针数组(也就是说其本质上是数组,但里面存放的都是指针) int (*a)[n]是数组指针(本质上是一个指针,而且是一个指向数组的指针)
第一部分:
a的类型是int[4],a[0]的类型是int;a是指向int[4]的指针
int (*a)[4]=b;指的是a指向的是int [4],然后把b的第一行地址赋给他
就是直接拷贝了首元素地址
第二部分很好理解
就是把b[0]的首行地址给a[4];
其实这种题完全可以用数组的方法做,看起来更加简洁,效率也几乎一样
#include<stdio.h> #include<string.h> #define N 4 int convertmatrix(int m[N][N]) { int i,j,temp; for(i=0;i<N;i++) { for(j=i+1;j<N;j++) { temp=m[i][j]; m[i][j]=m[j][i]; m[j][i]=temp; } } return 0; } int main() { int matrix[N][N]; int i,j; printf("请输入一个%d*%d的矩阵:\n",N,N); for(i=0;i<N;i++) { for(j=0;j<N;j++) { scanf("%d",&matrix[i][j]); } } convertmatrix(matrix); for(i=0;i<N;i++) { for(j=0;j<N;j++) { printf("%-3d",matrix[i][j]); } printf("\n"); } return 0; }
用指针编简直就是在浪费时间
所以。。。。
还有一种做法:
#include<stdio.h> #include<string.h> #define N 4 int convertmatrix(int m[N][N]) { int i,j,temp; for(i=0;i<N;i++) { for(j=i+1;j<N;j++) { temp=m[i][j]; m[i][j]=m[j][i]; m[j][i]=temp; } } return 0; } int main() { int matrix[N][N]; int i,j; printf("请输入一个%d*%d的矩阵:\n",N,N); for(i=0;i<N;i++) { for(j=0;j<N;j++) { scanf("%d",&matrix[i][j]); } } convertmatrix(matrix); for(i=0;i<N;i++) { for(j=0;j<N;j++) { printf("%-3d",matrix[i][j]); } printf("\n"); } return 0; }
另外一个比较类似的问题:
用指向一维数组的指针变量即二维数组的行指针作为函数参数,实现矩阵转置。按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。
void Transpose(int (*a)[N], int (*at)[M], int m, int n);
void InputMatrix(int (*a)[N], int m, int n);
void PrintMatrix(int (*at)[M], int n, int m);
输入提示信息:"Input m, n:"
输入格式:"%d,%d"
输入提示信息:"Input %d*%d matrix:\n"
输出提示信息和格式:"The transposed matrix is:\n"
输出格式:"%d\t"
#include<stdio.h> #define M 10 #define N 10 void Transpose(int (*a)[N], int (*at)[M], int m, int n); void InputMatrix(int (*a)[N], int m, int n); void PrintMatrix(int (*at)[M], int n, int m); int main() { int s[M][N],st[N][M],m,n; printf("Input m, n:"); scanf("%d,%d",&m,&n); InputMatrix(s,m,n); Transpose(s,st,m,n); printf("The transposed matrix is:\n"); PrintMatrix(st,n,m); return 0; } void Transpose(int (*a)[N], int (*at)[M], int m, int n) { int i,j; for(i=0;i<m;i++) { for(j=0;j<n;j++) { *(*(at+j)+i)=*(*(a+i)+j); } } } void InputMatrix(int (*a)[N], int m, int n) { int i,j; printf("Input %d*%d matrix:\n",m,n); for(i=0;i<m;i++) { for(j=0;j<n;j++) { scanf("%d",*(a+i)+j); } } } void PrintMatrix(int (*at)[M], int n, int m) { int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("%d\t",*(*(at+i)+j)); } printf("\n"); } }
3.
从键盘任意输入一个整型表示的月份值,用指针数组编程输出该月份的英文表示,若输入的月份值不在1~12之间,则输出“Illegal month”。
**输入格式要求:"%d" 提示信息:"Input month number:"
**输出格式要求:"month %d is %s\n"
"Illegal month", "January", "February", "March", "April", "May", "June", "July", August", "September", "October", "November", "December"
程序运行示例1如下:
Input month number:5
month 5 is May
程序运行示例2如下:
Input month number:13
Illegal month
#include<stdio.h> int main() { int n; static char*monthName[]={"Illegal month", "January", "February", "March", "April", "May", "June", "July", “August", "September", "October", "November", "December"}; printf("Input month number:"); scanf("%d",&n); if((n<=12)&&(n>=1)) printf("month %d is %s\n",n,monthName[n]); else printf("%s\n",monthName[0]); return 0; }
4.
#include <stdio.h> #define ROW 2 #define COL 3 void main() { int a[ROW][COL], b[COL][ROW], c[ROW][ROW], i, j,k; printf("Input 2*3 matrix a:\n"); for (i=0; i<ROW ;i++) { for (j=0; j<COL; j++) { scanf("%d", &a[i][j]); } } printf("Input 3*2 matrix b:\n"); for (i=0; i<COL; i++) { for (j=0; j<ROW; j++) { scanf("%d", &b[i][j]); } } for (i=0; i<ROW; i++) { for (j=0; j<ROW; j++) { c[i][j] = 0 ; for (k=0; k<COL; k++) { c[i][j] = c[i][j]+a[i][k]*b[k][j] ; } } } printf("Results:\n"); for (i=0; i<ROW; i++) { for (j=0; j<ROW; j++) { printf("%6d", c[i][j]); } printf("\n") ; } }
本次内容到此全部结束
十一月 | ||||||
---|---|---|---|---|---|---|
日 | 一 | 二 | 三 | 四 | 五 | 六 |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |