㈠ C语言一维数组转二维数组
1、我们先是定义一个二级指针和行列变量【int **array,row,column;】。
㈡ 利用C语言完成课程设计:矩阵的基本运算,如何完成
匿名2010-04-27 矩阵是线性代数和矩阵论研究的主要对象,失求解微分方程组的重要工具,也是计算机图形学和计算机游戏开发的重要数学基础。矩阵的主要运算有数乘矩阵、两矩阵相加、相减、相乘和相除以及矩阵的转置,由于矩阵的除法涉及奇异值分解的问题,比较复杂,本课程设计暂不要求,紧要求完成矩阵最大维数不大于五维的矩阵数乘、加法、减法、乘法以及转置运算。 数学模型或问题分析: MA={ a00 a01 a02 ….. a0n a10 a11 a12 …... a1n . . . . . . . . am0 am1 am2 …… amn }= [ aij]i=1,2,3...m,j=1,2,3....n. MB= { b00 b01 b02 ….. b0q b10 b11 b12 …... b1q . . . . . . . . bp0 bp1 bp2 …… apq }=[brc]r=0,1,2...p,c=0,1,2...n。 利用实数k 相乘 。 我来回答匿名
㈢ C语言写俄罗斯方块旋转算法
线性代数、不就是矩阵转置么?
㈣ 如何用c#窗体做五子棋小游戏,求开始的按钮到对应的代码能整个实现
用c#窗体做五子棋小游戏:
首先是界面设计,控件一共有4个,1个PictureBox ;1个开始按钮,命名为btnStart;1个重置按钮,命名为btnReset;1个文本框Label,用于显示游戏状态;
2. 新建一个MainSize类用于存放界面上的可能用到的参数,主框体大小520*460,棋盘是一个PictureBox控件,大小401*401,棋盘20行20列,每个格子边长20,棋子直径16。
3. 新建一个ChessBoard类表示棋盘,有一个静态函数DrawBoard,函数代码如下:
class ChessBoard
{
static readonly Color color = Color.Black;
static readonly float penWid = 1.0f;
static readonly Pen pen = new Pen(color, penWid);
public static void DrawCB(Graphics gra,PictureBox pic)
{
//每排数量
int horC = MainSize.CBWid / MainSize.CBGap;
//间隔
int gap = MainSize.CBGap;
Image img = new Bitmap(MainSize.CBWid, MainSize.CBHei);
gra = Graphics.FromImage(img);
gra.Clear(Color.White);
gra.DrawRectangle(pen, 0, 0, MainSize.CBWid, MainSize.CBHei);
//画棋盘
for (int i = 0; i < horC; i++)
{
gra.DrawLine(pen, 0, i * gap, MainSize.CBWid, i * gap);
gra.DrawLine(pen, i * gap, 0, i * gap, MainSize.CBHei);
}
gra.DrawLine(pen, 0, horC * gap, MainSize.CBWid, horC * gap - 1);
gra.DrawLine(pen, horC * gap - 1, 0, horC * gap, MainSize.CBHei);
pic.Image = img;
}
}
4. 新建一个基本类Chess,用来表示棋子,有一个静态函数DrawChess,代码如下:
class Chess
{ public static void DrawChess(bool type,PictureBox pic,Graphics graphic,MouseEventArgs e)
//bool型变量用于表示下棋的双方
{
graphic = pic.CreateGraphics();
Pen pen1 = new Pen(Color.Red, 1);
Brush bru1 = new SolidBrush(Color.Red);
Pen pen2 = new Pen(Color.Blue, 1);
Brush bru2 = new SolidBrush(Color.Blue);
int newX = (int)((e.X + MainSize.CBGap / 2) / MainSize.CBGap) * MainSize.CBGap - MainSize.ChessRadious / 2;
int newY = (int)((e.Y + MainSize.CBGap / 2) / MainSize.CBGap) * MainSize.CBGap - MainSize.ChessRadious / 2;
//pen1和pen2用于绘制双方的棋子,颜色设置为红蓝
if (type)
{ graphic.DrawEllipse(pen1, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);
graphic.FillEllipse(bru1, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);}
if (!type)
{ graphic.DrawEllipse(pen2, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);
graphic.FillEllipse(bru2, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious); }
//整型变量nexX和newY用于表示棋子在棋盘上的坐标,根据四舍五入就近原则落点 graphic.Dispose();
}
}
5. 主程序,一共设置了4个全局变量,Graphics graphic用于画图,bool type用于表示下棋双方,bool start表示游戏是否开始,二维数组ChessBack用于模拟下棋场景并进行计算。主程序的构造函数对主框体和PictureBox的大小进行初始化,在Form1_Load函数中添加函数InitializeThis()对游戏进行初始化,包括将ChessBack数组全部置0,type设为true,start设为false,绘制棋盘,按键开始的Enabled属性设为true,按键重置设为false。按键开始和重置的功能较为简单,代码如下:
private void btnStart_Click(object sender, EventArgs e)
{
start = true;
label1.Text = "游戏开始!";
btnStart.Enabled = false;
btnReset.Enabled = true;
}
private void btnReset_Click(object sender, EventArgs e)
{if (MessageBox.Show("确定要重新开始?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{ InitializeThis();
}
}
6. picturebox的函数,先判断游戏是否开始,否则不会有反应。游戏开始后点击即可落子,并修改ChessBack矩阵,红色为1,蓝色为2,如果已经有棋子则返回,即落子失败。如果棋盘已满但没有分出胜负则弹出平局的提示框并给出提示。之后判断是否分出胜负,添加函数bool Victory(int bx,int by),分出胜负后提示胜利,如果没有则返回。最后换人,type=!type即可,然后修改label的文字表面到哪一方落子了。代码如下。
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
if (start)
{
//在计算矩阵中的位置
int bX = (int)((e.X + MainSize.CBGap / 2) / MainSize.CBGap);
int bY = (int)((e.Y + MainSize.CBGap / 2) / MainSize.CBGap);
//防止在同一个位置落子
if (ChessBack[bX, bY] != 0)
return;
Chess.DrawChess(type, pictureBox1, graphic, e);
ChessBack[bX,bY] = type?1:2;
//判断棋盘是否满了
if (IsFull() && !Victory(bX,bY))
{
if (MessageBox.Show("游戏结束,平局") == DialogResult.OK)
InitializeThis();
return;
}
//判断胜利
if (Victory(bX,bY))
{
string Vic = type ? "红" : "蓝";
if (MessageBox.Show(Vic + "方胜利!") == DialogResult.OK)
InitializeThis();
return;
}
//换人
type = !type;
label1.Text = type ? "红方's trun!" : "蓝方's turn!";
}
else
return;
}
7. 判断胜负的函数,先写了一个横向的进行测试,如果横向两端的值与当前值相同则变量count++,最后返回count的值,如果>4则表示胜利。但是这个函数运行出错,显示为stackoverflow,但我不知道错误在哪,只好换一种判断方法。后来才想明白两端的值都是0则会溢出,应该判断两端的值是否为1或2而不是当前值。此处借鉴了实验楼网站上的C语言版五子棋的判断胜负方式,从当前落子的矩阵中,横竖斜4个方向任意一个方向有连续5个数的值与当前的值相同则胜利,实现也不复杂,细分为三个函数实现。代码如下:
#region 判断胜利
private bool Victory(int bx,int by)
{
if (HorVic(bx, by))
return true;
if (VerVic(bx, by))
return true;
if (Vic45(bx, by))
return true;
else
return false;
}
private bool Vic45(int bx, int by)
{
int b1 = (bx - 4) > 0 ? bx - 4 : 0;
int b2 = (by - 4) > 0 ? by - 4 : 0;
//int buttom = b1 > b2 ? b2 : b1;
int val = ChessBack[bx, by];
for (int i = b1,j=b2; i < 16&&j<16; i++,j++)
{
if (ChessBack[i, j] == val && ChessBack[i + 1, j + 1] == val &&
ChessBack[i + 2, j + 2] == val && ChessBack[i + 3, j + 3] == val
&& ChessBack[i + 4, j + 4] == val)
return true;
}
for (int i = b1, j = b2; i < 16 && j < 16; i++, j++)
{
if (ChessBack[i, j] == val && ChessBack[i + 1, j - 1] == val &&
ChessBack[i + 2, j - 2] == val && ChessBack[i + 3, j - 3] == val
&& ChessBack[i - 4, j - 4] == val)
return true;
}
return false;
}
private bool VerVic(int bx, int by)
{
int buttom = (by - 4) > 0 ? by - 4 : 0;
int val = ChessBack[bx, by];
for (int i = buttom; i < 16; i++)
{
if (ChessBack[bx, i] == val && ChessBack[bx, i+1] == val &&
ChessBack[bx, i+2] == val && ChessBack[bx ,i+3] == val
&& ChessBack[bx, i+4] == val)
return true;
}
return false;
}
private bool HorVic(int bx, int by)
{
int left = (bx-4)>0?bx-4:0;
int val = ChessBack[bx,by];
for (int i = left; i < 16; i++)
{
if (ChessBack[i, by] == val && ChessBack[i + 1, by] == val &&
ChessBack[i + 2, by] == val && ChessBack[i + 3, by] == val
&& ChessBack[i + 4, by] == val)
return true;
}
return false;
}
#endregion
8 .经过测试,没有问题大功告成
楼主要及时采纳加分哦
㈤ 求C语言习题解答
1、
#include <stdio.h>#define STU 30#define COURSE 3void Input(long num[ ],int score[ ][COURSE],int n);void GetSumAver(int score[ ][COURSE],int n,int sum[ ],float aver[ ]);void Sort(long num[ ],int score[ ][COURSE],int n,int sum[ ],float aver[ ]);void Print(long num[ ],int score[ ][COURSE],int n,int sum[ ],float aver[ ]);int Search(long num[ ], int n, long x);main(){int n, score[STU][COURSE], sum[STU], pos;long num[STU], x;float aver[STU];printf("Please enter the total number of the students(n<=30):");scanf("%d", &n); /*输入参加考试的学生人数*/printf("Enter No. and score as: MT EN PH\n");Input(num, score, n); /*输入学生成绩*/GetSumAver(score, n, sum, aver); /*计算总分和平均分*/printf("Before sort:\n");Print(num, score, n, sum, aver);Sort(num, score, n, sum, aver); /*排名次*/printf("After sort:\n");Print(num, score, n, sum, aver);printf("Please enter searching number:");scanf("%ld", &x); /*以长整型格式输入待查找学生的学号*/pos = Search(num, n, x); /*名次查询*/if (pos != -1){printf("position:\t NO \t MT \t EN \t PH \t SUM \t AVER\n");printf("%8d\t%4ld\t%4d\t%4d\t%4d\t%5d\t%5.0f\n", pos+1,num[pos], score[pos][0],score[pos][1], score[pos][2], sum[pos],aver[pos]);}else{printf("Not found!\n");}}/* 函数功能:输入某班学生学号及期末考试三门课程成绩 函数参数:长整型数组num,存放学生学号 整型数组score,存放学生成绩 整型变量n,存放学生人数 函数返回值:无*/void Input(long num[ ], int score[ ][COURSE], int n){int i, j;for (i=0; i<n; i++){scanf("%ld", &num[i]);for (j=0; j<COURSE; j++){scanf("%d", &score[i][j]);}}}/* 函数功能:计算每个学生的总分和平均分 函数参数:整型数组score,存放学生成绩 整型变量n,存放学生人数 整型数组sum,计算得到的每个学生的总分 实型数组aver,计算得到的每个学生的平均分 函数返回值:无*/void GetSumAver(int score[ ][COURSE], int n, int sum[ ], float aver[ ]){int i, j;for (i=0; i<n; i++){sum[i] = 0;for (j=0; j<COURSE; j++){sum[i] = sum[i] + score[i][j];}aver[i] = (float)sum[i] / COURSE;}}/* 函数功能:按总分成绩由高到低排出成绩的名次 函数参数:长整型数组num,存放学生学号 整型数组score,存放学生成绩 整型变量n,存放学生人数 整型数组sum,存放每个学生的总分实型数组aver,存放每个学生的平均分 函数返回值:无*/void Sort(long num[ ],int score[ ][COURSE], int n, int sum[ ], float aver[ ]){int i, j, k, m;int temp1;long temp2;float temp3;for (i=0; i<n-1; i++){k = i;for (j=i+1; j<n; j++){if (sum[j] > sum[k]) k = j;}if (k != i){temp1 = sum[k]; sum[k] = sum[i]; sum[i] = temp1;temp2 = num[k]; num[k] = num[i]; num[i] = temp2;temp3 = aver[k]; aver[k] = aver[i]; aver[i] = temp3;for (m=0; m<COURSE; m++){temp1 = score[k][m];score[k][m] = score[i][m];score[i][m] = temp1;}}}}/* 函数功能: 打印名次表,表格内包括学生编号、各科分数、总分和平均分 函数参数: 长整型数组num,存放学生学号 整型数组score,存放学生成绩 整型变量n,存放学生人数 整型数组sum,存放每个学生的总分 实型数组aver,存放每个学生的平均分 函数返回值:无*/void Print(long num[ ], int score[ ][COURSE], int n,int sum[ ], float aver[ ]){int i, j;printf(" NO \t| MT \t EN \t PH \t SUM \t AVER\n");printf("----------------------------------------------------\n");for (i=0; i<n; i++){printf("%ld\t| ", num[i]);for (j=0; j<COURSE; j++){printf("%4d\t", score[i][j]);}printf("%5d\t%5.0f\n", sum[i], aver[i]);}}/* 函数功能:在学号数组中顺序查找学生的学号 函数参数:长整型数组num,存放学生学号 整型变量n,存放学生人数长整型变量x,存放待查找学生的学号 函数返回值:找到时,返回学生学号在学号数组中的下标位置,否则返回值-1*/int Search(long num[ ], int n, long x){int i;for (i=0; i<n; i++){if (num[i] == x) return(i);}return (-1);}
4、答案:#include <stdio.h>
void main()
{ int i , j;
double a[3][4], b[4][3];
printf("请输入原始矩阵:\n");
for(i=0;i<3; i++)
for( j=0; j<4 ; j++)
scanf ("%lf", &a[i][j]);
printf("计算转置矩阵:\n");
for(i=0;i<3; i++)
for( j=0; j<4 ; j++) b[j][i]=a[i][j];
printf("输出原始矩阵:\n");
for(i=0;i<3; i++)
{
for( j=0; j<4 ; j++) printf(" %10.2f ",a[i][j]);
printf("\n");
}
printf("输出转置矩阵:\n");
for(i=0;i<4; i++)
{
for( j=0; j<3 ; j++) printf(" %10.2f ",b[i][j]);
printf("\n");
}
}