Тема: Заміна індексів покажчиками
Вітаю форумчан!
Маю наступний код із книги КіР
#include <stdio.h>
int day_of_year(int year, int month, int day, int leap);
void month_day(int year, int yearday, int leap);
static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int main(int argc, char *argv[])
{
int c, leap, y, m, d, yearday;
// c - correct flag
// leap - leap year flag
// y - year, m - month, d - day
input:
scanf("%d %d %d", &y, &m, &d);
c = 0;
if(y < 0){
printf("Year couldn't be negative\n");
c = 1;
}
if(m <= 0 || m >= 12){
printf("Month got to be 1-12\n");
c = 1;
}
leap = y%4 == 0 && y%100 != 0 || y%400 == 0;
if(d > daytab[leap][m] || d <= 0){
printf("Day got to be more than 0 and not exceed days per month maximum\n");
c = 1;
}
if(c == 1)
goto input;
yearday = day_of_year(y, m, d, leap);
month_day(y, yearday, leap);
return 0;
}
int day_of_year(int year, int month, int day, int leap){
int i;
printf("%d.", day);
for(i = 1; i < month; i++)
day += daytab[leap][i];
printf("%d is the %d's day of %d year\n", month, day, year);
return day;
}
void month_day(int year, int yearday, int leap){
int i, m, d;
for(i = 1; yearday > daytab[leap][i]; i++)
yearday -= daytab[leap][i];
m = i;
d = yearday;
printf("Full date: %d/%d/%d\n", m, d, year);
}
Завдання полягає в тому, щоб запис
daytab[leap][i]
замінити на запис із покажчиками, рішення не важке, але додуматись до нього самотужки я не зміг:
#include <stdio.h>
int day_of_year(int year, int month, int day, int leap);
void month_day(int year, int yearday, int leap);
static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int main(int argc, char *argv[])
{
int c, leap, y, m, d, yearday;
// c - correct flag
// leap - leap year flag
// y - year, m - month, d - day
input:
scanf("%d %d %d", &y, &m, &d);
c = 0;
if(y < 0){
printf("Year couldn't be negative\n");
c = 1;
}
if(m <= 0 || m >= 12){
printf("Month got to be 1-12\n");
c = 1;
}
leap = y%4 == 0 && y%100 != 0 || y%400 == 0;
if(d > (int) daytab[leap][m] || d <= 0){
printf("Day got to be more than 0 and not exceed days per month maximum\n");
c = 1;
}
if(c == 1)
goto input;
yearday = day_of_year(y, m, d, leap);
month_day(y, yearday, leap);
return 0;
}
int day_of_year(int year, int month, int day, int leap){
int i;
printf("%d.", day);
for(i = 1; i < month; i++)
day += *(*(daytab+leap)+i);
printf("%d is the %d's day of %d year\n", month, day, year);
return day;
}
void month_day(int year, int yearday, int leap){
int i, m, d;
for(i = 1; yearday > *(*(daytab+leap)+i); i++)
yearday -= *(*(daytab+leap)+i);
m = i;
d = yearday;
printf("Full date: %d/%d/%d\n", m, d, year);
}
Зрозуміло, що daytab+leap - це індекс елемента першого виміру daytab+leap+i - це індекс елемента в другому вимірі, але не зрозуміла ситуація із операторами розйменування, чому ми виставляємо зірочки саме в такому порядку, як це зазначено вище?