no puedo hacer esta parte
la diagonal principal debe estar vacía o con caracteres especiales (*,/,+,-,%,&,$)
y lo único que puedo es llenarla de ceros
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
//generar una matriz de 16x16 con números aleatorios
//y la diagonal principal debe estar vacía o con cualquiera de los siguientes caracteres (*,/,+,-,%,&,$)
int main()
{
int i,j,a;
int m[16][16];
int w=16+1;
srand (time(NULL));
for(i=0;i<=15;i++)
{
for(j=0;j<=15;j++)
{
if(i==j)
{
m[i][j]=0;
}
else
if(i==w-j)
{
m[i][j]=0;
}
else
{
m[i][j]=1+rand()%(9);
}
}
}
printf(" e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 e12 e13 e14 e15 \n");
for(i=0;i<=15;i++)
{
printf(" e %d",i);
for(j=0;j<=15;j++)
{
printf(" %d ",m[i][j]);
}
printf("\n\n");
}
}
Sinceramente, no comprendo el problema. Primero, si quieres que la matriz tenga caracteres, ¿por qué guardas los valores en un arreglo bidimensional de enteros? ¿No sería mejor usar char m[16][16]? Entonces en la asignación podrías hacer m[ i][j] = '&' o el carácter especial que quieras.
Por otra parte, no comprendo tampoco el 'else if' del código. No entiendo su función.
Si lo que quieres hacer es que la diagonal principal tenga uno de los caracteres mencionados o el elemento esté vacío, podrías crear un arreglo de caracteres como este:
const char caracteres[] = {'\0', '*', '/', '+', '-', '%', '&', '$'};
y cuando vayas a asignar algo a un elemento de la diagonal, podrías generar un número aleatorio entre 0 y el número de caracteres especiales:
matriz[i][j] = caracteres[rand()%8];
Una posible solución
int main()
{
int i, j, n = 16;
char array[n][n];
srand (time(NULL));
for( i = 0; i < n; i++ )
for( j = 0; j < n; j++ )
array[i][j] = i==j ? "*/+-%&$"[rand()%7] : 1+rand()%9+'0';
//Imprimir aqui
return 0;
}