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") ;
}
}
本次内容到此全部结束
| 二月 | ||||||
|---|---|---|---|---|---|---|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
| 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 |