C 输入输出double值得处理
今天又做到一道题,在scanf()
和printf()
时对double
的处理再度纠结。
double a, b;
printf("Please input two numbers(use space to divide): ");
scanf("%lf%lf", &a, &b);
printf("1/(1/a+1/b)/2= %f\n", harmmean(a, b));
return 0;
今天又做到一道题,在scanf()
和printf()
时对double
的处理再度纠结。
double a, b;
printf("Please input two numbers(use space to divide): ");
scanf("%lf%lf", &a, &b);
printf("1/(1/a+1/b)/2= %f\n", harmmean(a, b));
return 0;
这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:$ip = $_SERVER["REMOTE_ADDR"];
搞定~
这里我们以get
与分页的结合为例,因为这点当时我纠结了很久,当然是在M-SHOW
时候纠结完的,这次拿来主义了一次,记录一下。
$this->load->library('pagination');
$id = $this->input->get('id');
/**
* pagination
*/
$config['base_url'] = base_url().'poster_admin/works/search';
$config['per_page'] = 5;
$config['num_links'] = 7;
$config['uri_segment'] = '4';
$config['use_page_numbers'] = TRUE;
$config['full_tag_open'] = '<ul class="pagination">';
$config['full_tag_close'] = '</ul>';
$config['cur_tag_open'] = '<li class="active"><a href="#">';
$config['cur_tag_close'] = '</a></li>';
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$config['prev_tag_open'] = '<li>';
$config['prev_tag_close'] = '</li>';
$config['next_tag_open'] = '<li>';
$config['next_tag_close'] = '</li>';
$config['first_link'] = FALSE;
$config['last_link'] = FALSE;
$config['total_rows'] = $this->works_model->searchNum($id);
$config['suffix'] = '?id='.$this->input->get('id');
$config['first_url'] = base_url().'poster_admin/works/search'.'?id='.$this->input->get('id');
$this->pagination->initialize($config);
因为有的时候我们会手贱在函数中传参导致修改数组值,所以就产生了这个东西,特点其实是让编译器报错,告诉你这里不应该被改变。
如:int sum(const int ar[], int n)
如果const int days[MONTHS] = {31, 28, 31}
,则数组内容就不能改变了。
如果:
double rates[5] = {88.9, 100.12, 59.45, 183.11, 340.5};
const double * pd = rates;
则不能用pc来修改他所指向的数值,可是我们还是能通过rates[0]
来修改,因为rates
并不是常量。
如果我们换个写法double * const pc = rates
那么就可以修改数据,却不能移动指针。
如果将上面两者结合使用,就相当于用了强力胶,怎么都动不了了:const double * const pc = rates
。
书上讲到函数正确的定义方法:void sum_cols(int ar[][COLS], int rows)
而void sum_cols(int ar[][], int rows)
则是不正确的,看了半天没明白,后来终于结合着看看懂了,编译器会把数组富豪转换为指针符号,如果是ar[1]
,则会变成ar+1
,可是对于多维数组而言,下一个元素地址在何处不仅取决于类型,还取决于有多少个具体的元素,比如oid sum_cols(int ar[][4], int rows)
,那么编译器就知道了,哦,int
值4个字节,有4个int
的元素,那么我跳到另一个就要走过16个字节,否则的话,就无法正确处理了。
于是诞生了变长数组……(形如:int sum2d(int rows, int cols, int ar[rows][cols])
,并非是可以任意改变长度,而是你的函数不用写死了,通过传入前两个参数来决定指针的情况)
注:rows,cols
与指针位置不可颠倒。
其实就是把书上的内容自己理解一番,做个连贯的笔记罢了。
#include <stdio.h>
#define SIZE 4
int main(void)
{
short dates[SIZE];
short * pti;
short index;
double bills[SIZE];
double * ptf;
pti = dates;
ptf = bills;
printf("%23s %10s\n", "short", "double");
for (index = 0; index < SIZE; index++)
printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
return 0;
}
关于++i与i++,我们这里纠结了不止一次,到了指针,还得接着纠结:
#include <stdio.h>
int data[2] = {100, 200};
int moredata[2] = {300, 400};
int main(void)
{
int * p1, * p2, * p3;
p1 = p2 = data;
p3 = moredata;
printf(" *p1 = %d, *p2 = %d, *p3 = %d\n", *p1, *p2, *p3);
printf(" *p1++ = %d, *++p2 = %d, (*p3)++ = %d\n", *p1++, *++p2, (*p3)++);
printf(" *p1 = %d, *p2 = %d, *p3 = %d\n", *p1, *p2, *p3);
return 0;
}
以前我们曾经在SQL 关联查找中说过JOIN,现在再次用到又学到了点新的东西。
首先还是这段代码(还是的理由是因为上一篇文章):
SELECT pr_rates.pid,count(pr_rates.ip),pr_works.title,pr_works.realname,pr_college.name FROM pr_works RIGHT JOIN pr_rates ON pr_rates.pid=pr_works.pid LEFT JOIN pr_college ON pr_works.college=pr_college.id GROUP BY pid ORDER BY count(pr_rates.ip) DESC
为什么会有Left Join Right Join,相当于一个人站在中间,左右手拉手,两个人自然是没有感觉的,其实中间一个人起到了连结的左右,他的左手连通着一个人的右手,右手连通着一个人的左手,建立了关联,于是乎因此我们选择一个与两个表都有共同项的表作为中间人,差不多就是这个意思。
GROUP BY
有种合并同类项的感觉,其实也就是那个效果,我在这次的POSTER里写了一串:
SELECT pr_rates.pid,count(pr_rates.ip),pr_works.title,pr_works.realname,pr_college.name FROM pr_works RIGHT JOIN pr_rates ON pr_rates.pid=pr_works.pid LEFT JOIN pr_college ON pr_works.college=pr_college.id GROUP BY pid ORDER BY count(pr_rates.ip) DESC
其中就用到了GROUP BY pid
相当于把相同的pid合并。
然后用count()
来统计就得出了得票数。
扩展阅读:
GROUP BY:http://www.w3school.com.cn/sql/sql_groupby.asp
count():http://www.w3school.com.cn/sql/sql_func_count.asp
题目:
用两分搜索策略来猜数字(1-100),比如程序最初猜50,让其询问用户该猜测是大还是小,如果猜测值小,那么下一次猜测值为50-100的中值。
两分法查找的思路+练习输入输出,为了作为一个游戏增强一下卖萌性所以……还是先来看看源码吧