用C语言编写一个判断关系矩阵的程序。(离散数学额有关问题)
用C语言编写一个判断关系矩阵的程序。(离散数学额问题)
我遇到了一个小问题,希望有人可以帮帮我。
这个程序是很简单的,可是,我们老师要求我们用int main(int argc, char *argv[])
我不懂,希望大家帮我下。
下面是我的程序。
int main(int argc, char *argv[])
{
FILE *fp;
fp = ("argv[1]", "r");
}
是这样写的吗??
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void Reflexive(int a[100][100], int n)
{
int i;
for(i = 0; i < n; i++)
if(a[i][i] == 0)
{
printf("not reflexive, ");/*主对角线有一个为0即输出不是自反,跳出循环*/
break;
}
if(i == n)
printf("reflexive, ");/*如果循环全作一遍,则为自反*/
}
/*判断自反*/
void Reflexiveness(int a[100][100], int n)
{
int i;
for(i = 0; i < n; i++)
if(a[i][i] == 1)
{
printf("not reflexiveness, ");/*主对角线有一个为q即输出不是反自反,跳出循环*/
break;
}
if(i == n)
printf("reflexiveness, ");/*如果循环全作一遍,则为反自反*/
}
/*判断反自反*/
void Symmetry(int a[100][100], int n)
{
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(a[i][j] == a[j][i])/*如果关于主对角线对称的元素相等,则跳过下面的语句,继续循环*/
continue;
printf("not symmetry, ");/*上面的条件不符,即关于主对角线对称的元素不等,则输出不是对称,跳出循环*/
break;
}
if(j != n)
break;/*不是对称,跳出循环*/
else if(i == n-1 && j == n)
printf("symmetry, ");/*所有的元素都遍历了,没有不合对称条件的,输出对称*/
}
}
/*判断是否对称*/
void Antisymmetry(int a[100][100], int n)
{
int i, j, s = 1;/*用s作为不合条件时的标记*/
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if((a[i][j] == 1 && a[j][i] == 1) && (i != j))
{
s = 0;/*s = 0 时,不是反对称,跳出循环*/
break;
}
}
if(s == 0)
{
printf("not antisymmetry, ");/*判断s的值,为0,则输出不是反对称*/
break;
}
}
if(s == 1)/*s = 1时,输出反对称*/
printf("antisymmetry, ");
}
/*判断是否反对称*/
void Transitive(int a[100][100], int n)
{
int i, j, k;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
if(a[i][j] == 0)/*对所有元素一一遍历,等于0时作下面的工作*/
{
for(k = 1; k < n; k++)
if(a[i][k] == 1 && a[k][j] == 1)/*不是传递的判断,输出不是传递,推出整个程序*/
{
printf("not transitive.\n");
exit(0);
}
}
}
printf("transitive.\n");/*否则,输出传递*/
}
/*判断是否传递*/
void main()
{
FILE *fp;
int i = 0, j, n, k, s = 0;
int b[10000], a[100][100];
fp = fopen("a.txt", "r");
if(!fp)
{
printf("Can not open !");
exit(0);
}
while(!feof(fp))
{
b[i] = fscanf(fp, "%d", &k);
i = i + 1;
}
n = (int)sqrt(i);
fclose(fp);
fp = fopen("a.txt", "r");
while(!feof(fp))
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
fscanf(fp, "%d", &a[i][j]);
}
printf("The relation is:\n");
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
printf("%-3d", a[i][j]);
printf("\n");
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
if(a[i][j] == 1)
{
s = 1;
break;
}
if(j != n)
break;
}
if(!s)
printf("reflexive, ");
else
Reflexive(a, n);
Reflexiveness(a, n);
Symmetry(a, n);
Antisymmetry(a, n);
Transitive(a, n);
}
其中a.txt为一个矩阵
例如:
1 0 1
0 1 0
0 0 0
输出:
not reflexive, not reflexiveness, not symmentry, antisymmetry, transitive.
我遇到了一个小问题,希望有人可以帮帮我。
这个程序是很简单的,可是,我们老师要求我们用int main(int argc, char *argv[])
我不懂,希望大家帮我下。
下面是我的程序。
int main(int argc, char *argv[])
{
FILE *fp;
fp = ("argv[1]", "r");
}
是这样写的吗??
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void Reflexive(int a[100][100], int n)
{
int i;
for(i = 0; i < n; i++)
if(a[i][i] == 0)
{
printf("not reflexive, ");/*主对角线有一个为0即输出不是自反,跳出循环*/
break;
}
if(i == n)
printf("reflexive, ");/*如果循环全作一遍,则为自反*/
}
/*判断自反*/
void Reflexiveness(int a[100][100], int n)
{
int i;
for(i = 0; i < n; i++)
if(a[i][i] == 1)
{
printf("not reflexiveness, ");/*主对角线有一个为q即输出不是反自反,跳出循环*/
break;
}
if(i == n)
printf("reflexiveness, ");/*如果循环全作一遍,则为反自反*/
}
/*判断反自反*/
void Symmetry(int a[100][100], int n)
{
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(a[i][j] == a[j][i])/*如果关于主对角线对称的元素相等,则跳过下面的语句,继续循环*/
continue;
printf("not symmetry, ");/*上面的条件不符,即关于主对角线对称的元素不等,则输出不是对称,跳出循环*/
break;
}
if(j != n)
break;/*不是对称,跳出循环*/
else if(i == n-1 && j == n)
printf("symmetry, ");/*所有的元素都遍历了,没有不合对称条件的,输出对称*/
}
}
/*判断是否对称*/
void Antisymmetry(int a[100][100], int n)
{
int i, j, s = 1;/*用s作为不合条件时的标记*/
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if((a[i][j] == 1 && a[j][i] == 1) && (i != j))
{
s = 0;/*s = 0 时,不是反对称,跳出循环*/
break;
}
}
if(s == 0)
{
printf("not antisymmetry, ");/*判断s的值,为0,则输出不是反对称*/
break;
}
}
if(s == 1)/*s = 1时,输出反对称*/
printf("antisymmetry, ");
}
/*判断是否反对称*/
void Transitive(int a[100][100], int n)
{
int i, j, k;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
if(a[i][j] == 0)/*对所有元素一一遍历,等于0时作下面的工作*/
{
for(k = 1; k < n; k++)
if(a[i][k] == 1 && a[k][j] == 1)/*不是传递的判断,输出不是传递,推出整个程序*/
{
printf("not transitive.\n");
exit(0);
}
}
}
printf("transitive.\n");/*否则,输出传递*/
}
/*判断是否传递*/
void main()
{
FILE *fp;
int i = 0, j, n, k, s = 0;
int b[10000], a[100][100];
fp = fopen("a.txt", "r");
if(!fp)
{
printf("Can not open !");
exit(0);
}
while(!feof(fp))
{
b[i] = fscanf(fp, "%d", &k);
i = i + 1;
}
n = (int)sqrt(i);
fclose(fp);
fp = fopen("a.txt", "r");
while(!feof(fp))
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
fscanf(fp, "%d", &a[i][j]);
}
printf("The relation is:\n");
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
printf("%-3d", a[i][j]);
printf("\n");
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
if(a[i][j] == 1)
{
s = 1;
break;
}
if(j != n)
break;
}
if(!s)
printf("reflexive, ");
else
Reflexive(a, n);
Reflexiveness(a, n);
Symmetry(a, n);
Antisymmetry(a, n);
Transitive(a, n);
}
其中a.txt为一个矩阵
例如:
1 0 1
0 1 0
0 0 0
输出:
not reflexive, not reflexiveness, not symmentry, antisymmetry, transitive.