标题:[求助]用C语言编的求规范正交基,已实现,但有个小的容错搞不定
只看楼主
khejing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-1-3
 问题点数:0 回复次数:9 
[求助]用C语言编的求规范正交基,已实现,但有个小的容错搞不定

线性代数老师布置的求规范正交基,明天就要交了.实在是没办法,高手帮忙呀!我已经编出来了,感觉逻辑上是没有错误的,但不知道为什么无法实现.
以下是代码:
/*guifanzhengjiaoji*/
#include<stdio.h>
#include<math.h>
float a[10][10];
float b[10][10];
int m,n;

float vemulti(int g,int l) /*vector multiply*/
{
int i;
float r=0;
if(g>=0&&g<n&&l>=0&&l<n){
for(i=0;i<m;i++)
r+=a[i][g]*a[i][l];
return r;}
else printf("liehaocuowu!");
}

int xishuc(int h,int f)
{
float q;
float sh,xia;
int i;
sh=vemulti(h,f);
xia=vemulti(h,h);
q=sh/xia;
q=q*(-1);
for(i=0;i<m;i++)
b[i][h]=a[i][h]*q;
return 0;
}

void schmidt(int g) /*正交化函数*/
{
int i,q,j;
q=0;
while(q<g){
if(xishuc(q,g)==0);
q++;}
for(j=0;j<g;j++){
for(i=0;j<m;i++)
a[i][g]=a[i][g]+b[i][j];
}
}

void biaozhun(int g)
{
float w;
float y;
int i;
w=vemulti(g,g);
y=sqrt(w);
y=1/y;
for(i=0;i<m;i++)
a[i][g]*=y;
}

main()
{
int i,j;
printf("put in the number of every vector:\n");
scanf("%d",&m); /*1*/
printf("how many vectors do you want:\n");
scanf("%d",&n);
if(m<10&&m>=0&&n<10&&n>=0)
{
for(j=0;j<n;++j)
{
for (i=0;i<m;++i)
{
printf("input the %dth number of vector %d:",i+1,j+1);
scanf("%f",&a[i][j]);/*2*/
}
}
}
else
printf("too many you want!");
for(j=1;j<n;j++){
schmidt(j);
}
for(j=0;j<n;j++)
biaozhun(j);
printf("the result is:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%f ",a[i][j]);}
printf("\n");}
}

高手帮忙呀!

[此贴子已经被作者于2007-1-3 21:50:17编辑过]

搜索更多相关主题的帖子: 正交基 C语言 线性代数 int float 
2007-01-03 14:12
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
得分:0 
这个应该不是C语言的事情,而是你对算法的理解。

坚决不跟用TC的人打交道!
2007-01-03 14:20
ffaannggqq
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2006-12-23
得分:0 

不太懂规范正交基


2007-01-03 16:01
khejing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-1-3
得分:0 

谢谢,我感觉我的算法是正确的.
而且我无意中实现了,我把xishuc函数合并到了schmidt函数里,居然就可以正常运算了!我也不知道为什么。我一直以为Turbo C是莫名其妙的。但不管它了。
我还有一个问题,和线性代数无关的。我现在已经可以算出规范正交基了,但还想搞个小的容错.就是我想在用scanf函数输入了m后,加一个对m不是数字的容错,用printf输出Please input a number!
我原本打算用isdigit,但发现它是测试字符型数据的。对我的int型的m变量的测试结果根本是乱七八糟。我在网上查到有用字符串数组测试的,但如果那样,那就无法使用变量m了。所以现在可以用束手无策来形容我了。
所以我想请教高手,如何加这样的一个容错。给我指个方向好吗?提示一下,谢谢了!
以下是我改好的代码:
/*guifanzhengjiaoji*/
#include<stdio.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
float a[10][10];
float b[10][10];
int m,n;

float vemulti(int g,int l) /*vector multiply*/
{
int i;
float r=0;
if(g>=0&&g<n&&l>=0&&l<n){
for(i=0;i<m;i++)
r+=a[i][g]*a[i][l];
return r;}
else printf("Row number is wrong!");
}

void schmidt(int g)
{
float w,sh,xia;
int i,j;
for(j=0;j<g;j++){
sh=vemulti(j,g);
xia=vemulti(j,j);
if(xia!=0){
w=sh/xia;
w=w*(-1);
for(i=0;i<m;i++)
b[i][j]=a[i][j]*w;}
else{
printf("Vectors like these is prohibited!\n");
exit(0);}
}
for(j=0;j<g;j++){
for(i=0;i<m;i++)
a[i][g]=a[i][g]+b[i][j];}
}

void biaozhun(int g)
{
float w;
float y;
int i;
w=vemulti(g,g);
y=sqrt(w);
if(y!=0){
y=1/y;
for(i=0;i<m;i++)
a[i][g]*=y;
}
else{
printf("Vectors like these is prohibited!\n");
exit(0);}
}

main()
{
int i,j;
printf("put in the number of every vector:\n");
scanf("%d",&m);

printf("how many vectors do you want:\n");
scanf("%d",&n);

if(m<=10&&m>=1&&n<=10&&n>1)
{
for(j=0;j<n;++j)
{
for (i=0;i<m;++i)
{
printf("input %d number of vector %d:",i+1,j+1);
scanf("%f",&a[i][j]);/*2*/
}
}
}
else if (n=1) {
printf("Vectors like this is prohibited!");
exit(0);}
else{
printf("Please input a number which is less than 11 and more than 0!");
exit(0);}
for(j=1;j<n;j++){
schmidt(j);
}
for(j=0;j<n;j++)
biaozhun(j);
printf("the result is:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%-6.3f ",a[i][j]);}
printf("\n");}
}

[此贴子已经被作者于2007-1-3 21:09:08编辑过]


Never Say Never! Nothing is impossible!
2007-01-03 21:06
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
以下是引用khejing在2007-1-3 21:06:34的发言:

谢谢,我感觉我的算法是正确的.
而且我无意中实现了,我把xishuc函数合并到了schmidt函数里,居然就可以正常运算了!我也不知道为什么。我一直以为Turbo C是莫名其妙的。但不管它了。
我还有一个问题,和线性代数无关的。我现在已经可以算出规范正交基了,但还想搞个小的容错.就是我想在用scanf函数输入了m后,加一个对m不是数字的容错,用printf输出Please input a number!
我原本打算用isdigit,但发现它是测试字符型数据的。对我的int型的m变量的测试结果根本是乱七八糟。我在网上查到有用字符串数组测试的,但如果那样,那就无法使用变量m了。所以现在可以用束手无策来形容我了。
所以我想请教高手,如何加这样的一个容错。给我指个方向好吗?提示一下,谢谢了!
以下是我改好的代码:
/*guifanzhengjiaoji*/
#include<stdio.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
float a[10][10];
float b[10][10];
int m,n;

float vemulti(int g,int l) /*vector multiply*/
{
int i;
float r=0;
if(g>=0&&g<n&&l>=0&&l<n){
for(i=0;i<m;i++)
r+=a[i][g]*a[i][l];
return r;}
else printf("Row number is wrong!");
}

void schmidt(int g)
{
float w,sh,xia;
int i,j;
for(j=0;j<g;j++){
sh=vemulti(j,g);
xia=vemulti(j,j);
if(xia!=0){
w=sh/xia;
w=w*(-1);
for(i=0;i<m;i++)
b[i][j]=a[i][j]*w;}
else{
printf("Vectors like these is prohibited!\n");
exit(0);}
}
for(j=0;j<g;j++){
for(i=0;i<m;i++)
a[i][g]=a[i][g]+b[i][j];}
}

void biaozhun(int g)
{
float w;
float y;
int i;
w=vemulti(g,g);
y=sqrt(w);
if(y!=0){
y=1/y;
for(i=0;i<m;i++)
a[i][g]*=y;
}
else{
printf("Vectors like these is prohibited!\n");
exit(0);}
}

main()
{
int i,j;
printf("put in the number of every vector:\n");
scanf("%d",&m);

printf("how many vectors do you want:\n");
scanf("%d",&n);

if(m<=10&&m>=1&&n<=10&&n>1)
{
for(j=0;j<n;++j)
{
for (i=0;i<m;++i)
{
printf("input %d number of vector %d:",i+1,j+1);
scanf("%f",&a[i][j]);/*2*/
}
}
}
else if (n=1) {
printf("Vectors like this is prohibited!");
exit(0);}
else{
printf("Please input a number which is less than 11 and more than 0!");
exit(0);}
for(j=1;j<n;j++){
schmidt(j);
}
for(j=0;j<n;j++)
biaozhun(j);
printf("the result is:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%-6.3f ",a[i][j]);}
printf("\n");}
}


还是没弄明白容错.


倚天照海花无数,流水高山心自知。
2007-01-03 21:33
khejing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-1-3
得分:0 
容错就是如果错误地输入了不该输的东西,可以正确的返回提示信息,而不是错误的继续运行。
就像我上边说的我想输入数字给m变量,但如果打入了一个字母,比如f,应该是程序运行中断,屏幕上显示Please input a number!而不是继续运行,得到乱七八糟的错误结果。
谢谢帮忙!

Never Say Never! Nothing is impossible!
2007-01-03 21:43
海蓝啸
Rank: 5Rank: 5
来 自:安徽
等 级:贵宾
威 望:17
帖 子:1611
专家分:0
注 册:2006-4-3
得分:0 
把输入的放入一个字符数组中,判断每个字符的ASCII码,正的话确把这个字符串转换成数值放入变量中。。。若包含非数字字符,输出错误信息,并重新输入。。。LZ看这个方法可行?

[此贴子已经被作者于2007-1-4 15:30:45编辑过]



这个社会太复杂。。。
2007-01-04 14:58
hao0716
Rank: 4
等 级:业余侠客
威 望:1
帖 子:353
专家分:222
注 册:2006-4-11
得分:0 
LS的算法我觉得不错 先判断一下就可以了

2007-01-04 16:04
khejing
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-1-3
得分:0 

这两天太忙了,现在终于有空了.我把作业已经交上了,没提这个容错
谢谢7楼海蓝啸了!
逻辑上是个不错的解决方案.我的思路没发展到能把字符串再转化成数值.
在过两天,我先编一下试试.等OK了,我再把我的全部正常的代码贴上来.


Never Say Never! Nothing is impossible!
2007-01-06 14:54
海蓝啸
Rank: 5Rank: 5
来 自:安徽
等 级:贵宾
威 望:17
帖 子:1611
专家分:0
注 册:2006-4-3
得分:0 
把数字字符串转换成数值应该很好做的。。。写个函数做这个就可以了。。。先去掉字符左边的0(若要有的话),然后判断字符串有多长记录长度,比如长度要是3,就可以取出第一个数转换成数值×100再加上第二个数转换成数值×10再加上转换成数值的第三个数就可以了

这个社会太复杂。。。
2007-01-06 15:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-113924-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.184354 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved