搜档网
当前位置:搜档网 › SIFT C#基于Emgu cv的程序实现

SIFT C#基于Emgu cv的程序实现

SIFT C#基于Emgu cv的程序实现
SIFT C#基于Emgu cv的程序实现

//SIFT LICENSE CONDITIONS

//Copyright (2005), University of British Columbia.

//This software for the detection of invariant keypoints is being made //available for individual research use only. Any commercial use or any //redistribution of this software requires a license from the University //of British Columbia.

//The following patent has been issued for methods embodied in this

//software: "Method and apparatus for identifying scale invariant

//features in an image and use of same for locating an object in an

//image," David G. Lowe, US Patent 6,711,293 (March 23,

//2004). Provisional application filed March 8, 1999. Asignee: The

//University of British Columbia.

//For further details on obtaining a commercial license, contact David //Lowe (lowe@cs.ubc.ca) or the University-Industry Liaison Office of the //University of British Columbia.

//THE UNIVERSITY OF BRITISH COLUMBIA MAKES NO REPRESENTATIONS OR

//WARRANTIES OF ANY KIND CONCERNING THIS SOFTWARE.

//This license file must be retained with all copies of the software,

//including any modified or derivative versions.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Emgu.CV;

using Emgu.CV.Structure;

using Emgu.Util;

using System.Drawing;

namespace SiftLib

{

publicclass Sift

{

publicint num;

constdouble SIFT_INIT_SIGMA = .5;//高斯模糊度

constint SIFT_IMG_BORDER = 5;//初始图像像素边界

constint SIFT_MAX_INTERP_STEPS = 5;//精确定位像素位置,进行像素插值时的收敛迭代次数

constint SIFT_ORI_HIST_BINS = 36;//梯度方向直方图等分数

constdouble SIFT_ORI_RADIUS = 3 * SIFT_ORI_SIG_FCTR;//尺度的采样半径:3*SIG

constdouble SIFT_ORI_SIG_FCTR = 1.5;//高斯分布加权值

constint SIFT_ORI_SMOOTH_PASSES = 2;

constdouble SIFT_ORI_PEAK_RATIO = .8;//保留峰值大于主方向峰值80%的方向作为该关键点的辅方向constdouble SIFT_DESCR_SCL_FCTR = 3.0;

constdouble SIFT_DESCR_MAG_THR = .2;//1*128矩阵归一化后通过设定门限去除关照影响

constdouble SIFT_INT_DESCR_FCTR = 512.0;

constint SIFT_INTVLS = 3;//每一组尺度空间尺度采样间隔数S,默认为3,高斯金字塔组内空间层数:S+3,DOC金字塔组内空间层数:S+2

constdouble SIFT_SIGMA = 1.6;//高斯平滑数:1.6

constdouble SIFT_CONTR_THR = 0.04;//判定特征点是否稳定,取值(0,1),默认为0.04,这个值越大,被剔除的特征点就越多。

constint SIFT_CURV_THR = 10;//判定特征点是否边缘点,默认为6.

constint SIFT_IMG_DBL = 1;//在建立尺度空间前如果图像被放大了1倍则取值为1,否则为0

constint SIFT_DESCR_WIDTH = 4;//计算特征描述符时邻域子块的宽度,默认为4.

constint SIFT_DESCR_HIST_BINS = 8; //计算特征描述符时将特征点邻域进行投影的方向数,默认为8,分别是0,45,90,135,180,215,270,315共8个方向。

public List sift_features(Image img)

{

return _sift_features(img, SIFT_INTVLS, SIFT_SIGMA, SIFT_CONTR_THR,

SIFT_CURV_THR, SIFT_IMG_DBL, SIFT_DESCR_WIDTH,

SIFT_DESCR_HIST_BINS);

}

public List _sift_features(Image img, int intvls,

double sigma, double contr_thr, int curv_thr,

int img_dbl, int descr_width, int descr_hist_bins)

{

Image init_img;

Image[,] gauss_pyr, dog_pyr;//定义高斯金字塔以及差分金字塔

List features;//特征点

//SIFT算法第一步,预滤波除噪声,建立金字塔底层

init_img = create_init_img(img, img_dbl, sigma);//生成初始影像(进行高斯平滑)

List feat = new List();

int octvs = (int)(Math.Log(Math.Min(init_img.Width, init_img.Height)) / Math.Log(2) - 2);//计算空间尺度(金字塔介数)最大层数

//SIFT算法第二步,建立Guassian金字塔和DOG金字塔

gauss_pyr = build_gauss_pyr(init_img, octvs, intvls, sigma);//创建高斯金字塔

dog_pyr = build_dog_pyr(gauss_pyr, octvs, intvls);//基于高斯金字塔差分

//SIFT算法第三步:基于空间尺度的特征点位置初步检测,再通过有限差分求导的方法基于离散点内插像素,精确定位特征点

//初步检测是通过进行较待检测点的灰度值与领域(2*9)以及图像域(8)共26个像素比较来确定改点是否合格

//若改点像素值为0,则检测该点是否为26个检测点的最小点,反之则检测该点是否为最大点,若都不成立则舍弃

//精确定位基于用离散点模拟连续函数的远离,寻求特征点更加准确的位置,求得的结果包括像素行r、列偏移量c以及尺度空间偏移量s,期间设定了偏移量计算的迭代次数:5,以及偏移量阈值:0.5

features = scale_space_extrema(dog_pyr, octvs, intvls, contr_thr, curv_thr);//查找特征点,进行边缘以及的对比度特征点处理

//特征点尺度空间坐标重新分配、计算

calc_feature_scales(ref features, sigma, intvls);//特征点精确定位后,由于特征点移动,使得特征点尺度空间发生变化,因此需要重新计算

if (img_dbl != 0)//若img_dbl=1,图像被扩大了一倍,需对图像二等分

adjust_for_img_dbl(ref features);

//SIFT算法第四步:关键点方向分配,计算高斯图像的梯度方向和幅值,计算各个特征点的主方向(目的:旋转不变性)

//通过计算高斯图像的方向以及幅值确定直方图

//根据直方图进行比较,确定关键点主方向

//确定辅方向,同时分配给复制的新的特征点

calc_feature_oris(ref features,gauss_pyr);

//SIFT算法第五步:抽取各个特征点处的特征描述字

compute_descriptors(ref features, gauss_pyr, descr_width, descr_hist_bins);//特征点128个唯一性描述

features.Sort(new Comparison(delegate(Feature a, Feature b) { if (a.scl < b.scl)return 1; if (a.scl > b.scl) return -1; return 0; }));

int n = features.Count;//特征点数

num = n;

feat = features;

return feat;

}

/*

Computes feature descriptors for features in an array. Based on Section 6

of Lowe's paper.

@param features array of features

@param gauss_pyr Gaussian scale space pyramid

@param d width of 2D array of orientation histograms

@param n number of bins per orientation histogram

*/

void compute_descriptors(ref List features, Image[,] gauss_pyr, int d, int n)//d=4:特征描述符时邻域子块的宽度,n=8:计算特征描述符时将特征点邻域进行投影的方向数

{

Feature feat;

detection_data ddata;

float[, ,] hist;

int i, k = features.Count;

for (i = 0; i < k; i++)

{

feat = features[i];

ddata = feat.feature_data;

//将领域内的采样点分配到对应的子区域内,将子区域内的梯度值分配到8个方向上,三维矩阵前两维记录字区域位置,后一维记录方向

hist = descr_hist(gauss_pyr[ddata.octv, ddata.intvl], ddata.r,

ddata.c, feat.ori, ddata.scl_octv, d, n);

//为了去除光照变化的影响,需要对直方图进行归一化处理,对于图像灰度值整体漂移

hist_to_descr(hist, d, n, ref feat);

//release_descr_hist(&hist, d);

}

}

void hist_to_descr(float[, ,] hist, int d, int n, ref Feature feat)

{

int int_val, i, r, c, o, k = 0;

feat.descr = newdouble[d * d * n];

for (r = 0; r < d; r++)

for (c = 0; c < d; c++)

for (o = 0; o < n; o++)

feat.descr[k++] = hist[r, c, o];//为特征点128个描述子赋值,首先为方向信息,后为列信息,最后为行信息

feat.d = k;

normalize_descr(feat);//1*128矩阵归一化

//描述子向量门限

//非线性光照,相机饱和度变化会造成某些方向的梯度值过大,而对方向的影响微弱,因此设置门限值(向量归一化后,一般取0.2)截断较大的梯度值

for (i = 0; i < k; i++)

if (feat.descr[i] > SIFT_DESCR_MAG_THR)

feat.descr[i] = SIFT_DESCR_MAG_THR;//大于门限值,进行截断

//再次进行归一化处理

normalize_descr(feat);

/* convert floating-point descriptor to integer valued descriptor */

//将归一化后大于0.5的描述子取值为255

for (i = 0; i < k; i++)

{

int_val = (int)(SIFT_INT_DESCR_FCTR * feat.descr[i]);//SIFT_INT_DESCR_FCTR=512 feat.descr[i] = Math.Min(255, int_val);

}

}

//为了去除光照变化的影响,进行归一化处理,提升特征点,描述子匹配精度

void normalize_descr(Feature feat)

{

double cur, len_inv, len_sq = 0.0;

int i, d = feat.d;

//下位归一化计算公式

for (i = 0; i < d; i++)

{

cur = feat.descr[i];

len_sq += cur * cur;

}

len_inv = 1.0 / Math.Sqrt(len_sq);

for (i = 0; i < d; i++)

feat.descr[i] *= len_inv;

}

/*

Computes the 2D array of orientation histograms that form the feature

descriptor. Based on Section 6.1 of Lowe's paper.

@param img image used in descriptor computation

@param r row coord of center of orientation histogram array

@param c column coord of center of orientation histogram array

@param ori canonical orientation of feature whose descr is being computed

@param scl scale relative to img of feature whose descr is being computed

@param d width of 2d array of orientation histograms

@param n bins per orientation histogram

@return Returns a d x d array of n-bin orientation histograms.

*/

float[, ,] descr_hist(Image img, int r, int c, double ori,

double scl, int d, int n)//d=4,n=8

{

float[, ,] hist;

double cos_t, sin_t, hist_width, exp_denom, r_rot, c_rot, grad_mag,

grad_ori, w, rbin, cbin, obin, bins_per_rad, PI2 = 2.0 * Math.PI;

int radius, i, j;

hist = newfloat[d, d, n];

//对邻域采样点进行坐标旋转

cos_t = Math.Cos(ori);

sin_t = Math.Sin(ori);

bins_per_rad = n / PI2;

exp_denom = d * d * 0.5;

hist_width = SIFT_DESCR_SCL_FCTR * scl;//SIFT_DESCR_SCL_FCTR=3

radius = (int)(hist_width * Math.Sqrt(2) * (d + 1.0) * 0.5 + 0.5);//计算描述子所需的图像区域,Math.Sqrt(2)是用来克服旋转效应

for (i = -radius; i <= radius; i++)

for (j = -radius; j <= radius; j++)

{

/*

Calculate sample's histogram array coords rotated relative to ori.

Subtract 0.5 so samples that fall e.g. in the center of row 1 (i.e.

r_rot = 1.5) have full weight placed in row 1 after interpolation.

*/

c_rot = (j * cos_t - i * sin_t) / hist_width;

r_rot = (j * sin_t + i * cos_t) / hist_width;

//进行坐标移动

//首先将坐标原点移动到收索矩阵的左上角(+d/2)

//再将坐标原点斜向下移动0.5各单位(-0.5),这样做是为了下一步的双线性内插

rbin = r_rot + d / 2 - 0.5;

cbin = c_rot + d / 2 - 0.5;

if (rbin > -1.0 && rbin < d && cbin > -1.0 && cbin < d)

if (calc_grad_mag_ori(img, r + i, c + j, out grad_mag, out grad_ori) != 0)//计算搜索区域内的各像素梯度幅值以及梯度方向

{

grad_ori -= ori;//求取相对于特征点的梯度方向

while (grad_ori < 0.0)

grad_ori += PI2;

while (grad_ori >= PI2)

grad_ori -= PI2;

obin = grad_ori * bins_per_rad;

w = Math.Exp(-(c_rot * c_rot + r_rot * r_rot) / exp_denom);

interp_hist_entry(ref hist, rbin, cbin, obin, grad_mag * w, d, n); }

}

return hist;

}

/*

Interpolates an entry into the array of orientation histograms that form

the feature descriptor.

@param hist 2D array of orientation histograms

@param rbin sub-bin row coordinate of entry

@param cbin sub-bin column coordinate of entry

@param obin sub-bin orientation coordinate of entry

@param mag size of entry

@param d width of 2D array of orientation histograms

@param n number of bins per orientation histogram

*/

//插值计算每个种子点八个方向的梯度

void interp_hist_entry(reffloat[, ,] hist, double rbin, double cbin,

double obin, double mag, int d, int n)

{

float d_r, d_c, d_o, v_r, v_c, v_o;

int r0, c0, o0, rb, cb, ob, r, c, o;

r0 = (int)Math.Floor(rbin);

c0 = (int)Math.Floor(cbin);

o0 = (int)Math.Floor(obin);

d_r = (float)rbin - r0;//点对上一行种子点贡献,反之1-d_r即是点对同一列下一行种子点贡献

d_c = (float)cbin - c0;//种子点列贡献

d_o = (float)obin - o0;//种子点方向贡献

/*

The entry is distributed into up to 8 bins. Each entry into a bin

is multiplied by a weight of 1 - d for each dimension, where d is the

distance from the center value of the bin measured in bin units.

*/

for (r = 0; r <= 1; r++)

{

rb = r0 + r;

if (rb >= 0 && rb < d)

{

v_r = (float)mag * ((r == 0) ? 1.0F - d_r : d_r);

for (c = 0; c <= 1; c++)

{

cb = c0 + c;

if (cb >= 0 && cb < d)

{

v_c = v_r * ((c == 0) ? 1.0F - d_c : d_c);

for (o = 0; o <= 1; o++)

{

ob = (o0 + o) % n;

v_o = v_c * ((o == 0) ? 1.0F - d_o : d_o);

hist[rb, cb, ob] += v_o;

}

}

}

}

}

}

/*

Computes a canonical orientation for each image feature in an array. Based

on Section 5 of Lowe's paper. This function adds features to the array when

there is more than one dominant orientation at a given feature location.

@param features an array of image features

@param gauss_pyr Gaussian scale space pyramid

*/

//为图像计算主方向,当在同一个特征点处有多个方向时,通过赋值特征点并给特征点赋予方向来实现

void calc_feature_oris(ref List features, Image[,] gauss_pyr)

{

Feature feat;

detection_data ddata;

double[] hist;

double omax;

int i, j, n = features.Count;

for (i = 0; i < n; i++)

{

feat = features[0];

features.RemoveAt(0);

ddata = feat.feature_data;

//创建方向直方图,SIFT_ORI_HIST_BINS为36,表示一个圆周所分等级(

//int)Math.Round(SIFT_ORI_RADIUS * ddata.scl_octv):基于组内不同层(不同尺度空间)图像计算不同高斯加权半径,尺度空间越大,高斯加权半径越大

//SIFT_ORI_SIG_FCTR * ddata.scl_octv:组内不同层数图像计算不同的sigma值

hist = ori_hist(gauss_pyr[ddata.octv, ddata.intvl],ddata.r, ddata.c,

SIFT_ORI_HIST_BINS,(int)Math.Round(SIFT_ORI_RADIUS * ddata.scl_octv),SIFT_ORI_SIG_FCTR *

ddata.scl_octv);

for (j = 0; j < SIFT_ORI_SMOOTH_PASSES; j++)//SIFT_ORI_SMOOTH_PASSES=2

smooth_ori_hist(ref hist, SIFT_ORI_HIST_BINS);//离散的梯度方向直方图要进行插值拟合(平滑)处理,来求得更精确的方向角度值

omax = dominant_ori(ref hist, SIFT_ORI_HIST_BINS);//确定主方向

add_good_ori_features(ref features, hist, SIFT_ORI_HIST_BINS,//确定辅方向,规则:保留峰值大于主方向峰值80%的方向作为该关键点的辅方向

omax * SIFT_ORI_PEAK_RATIO,

feat);//SIFT_ORI_PEAK_RATIO=80%

//free( ddata );

//free( feat );

//free( hist );

}

}

/*

Adds features to an array for every orientation in a histogram greater than

a specified threshold.

@param features new features are added to the end of this array

@param hist orientation histogram

@param n number of bins in hist

@param mag_thr new features are added for entries in hist greater than this

@param feat new features are clones of this with different orientations

*/

//添加新特征点,并分配辅方向

void add_good_ori_features(ref List features, double[] hist, int n,

double mag_thr, Feature feat)//mag_thr:0.8*主方向

{

Feature new_feat;

double bin, PI2 = Math.PI * 2.0;

int l, r, i;

//

for (i = 0; i < n; i++)

{

l = (i == 0) ? n - 1 : i - 1;//补前:若是第一个,前一个为最后一个

r = (i + 1) % n;//补后:若是最后一个,下一个为第一个

//判断是否大于邻近直方图值以及是否大于主方向的80%

if (hist[i] > hist[l] && hist[i] > hist[r] && hist[i] >= mag_thr)

{

bin = i + interp_hist_peak(hist[l], hist[i], hist[r]);

bin = (bin < 0) ? n + bin : (bin >= n) ? bin - n : bin;

new_feat = (Feature)feat.Clone();//复制特征点生成新的特征点

new_feat.ori = ((PI2 * bin) / n) - Math.PI;//为新特征点分配方向

features.Add(new_feat);//添加到特征点列表中

//free( new_feat );

}

}

}

/*

Interpolates a histogram peak from left, center, and right values

*/

//内插获得辅方向所处扇区位置(在【1,36】中)

double interp_hist_peak(double l, double c, double r) { return 0.5 * ((l) - (r)) / ((l) - 2.0 * (c) + (r)); }

/*

Finds the magnitude of the dominant orientation in a histogram

@param hist an orientation histogram

@param n number of bins

@return Returns the value of the largest bin in hist

*/

double dominant_ori(refdouble[] hist, int n)

{

double omax;

int maxbin, i;

omax = hist[0];

maxbin = 0;

for (i = 1; i < n; i++)

if (hist[i] > omax)

{

omax = hist[i];

maxbin = i;

}

return omax;

}

/*

Gaussian smooths an orientation histogram.

@param hist an orientation histogram

@param n number of bins

*/

//对离散的梯度方向直方图进行插值拟合处理,来求得更精确的方向角度值

void smooth_ori_hist(refdouble[] hist, int n)//n=36

{

double prev, tmp, h0 = hist[0];

int i;

//直方图平滑处理方法:hist[i]=0.25 * hist[i-1] + 0.5 * hist[i] +0.25 * hist[i + 1])

prev = hist[n - 1];

for (i = 0; i < n; i++)

{

tmp = hist[i];

hist[i] = 0.25 * prev + 0.5 * hist[i] +

0.25 * ((i + 1 == n) ? h0 : hist[i + 1]);

prev = tmp;

}

}

/*

Computes a gradient orientation histogram at a specified pixel.

@param img image

@param r pixel row

@param c pixel col

@param n number of histogram bins

@param rad radius of region over which histogram is computed

@param sigma std for Gaussian weighting of histogram entries

@return Returns an n-element array containing an orientation histogram

representing orientations between 0 and 2 PI.

*/

double[] ori_hist(Image img, int r, int c, int n, int rad, double sigma)//n=36 {

double[] hist;

double mag, ori, w, exp_denom, PI2 = Math.PI * 2.0;// mag:梯度幅值,ori:梯度方向

int bin, i, j;

hist = newdouble[n];

exp_denom = 2.0 * sigma * sigma;

for (i = -rad; i <= rad; i++)//高斯加权窗口

for (j = -rad; j <= rad; j++)

if (calc_grad_mag_ori(img, r + i, c + j, out mag, out ori) == 1)//计算梯度幅值以及梯度方向

{

w = Math.Exp(-(i * i + j * j) / exp_denom);//高斯加权公式

bin = (int)Math.Round(n * (ori + Math.PI) / PI2);//将[-pi/2,pi/2]变换到[pi/2,3*pi/2],

bin = (bin < n) ? bin : 0;

hist[bin] += w * mag;//bin记录梯度方向,hist值记录梯度方向

}

return hist;

}

/*

Calculates the gradient magnitude and orientation at a given pixel.

@param img image

@param r pixel row

@param c pixel col

@param mag output as gradient magnitude at pixel (r,c)

@param ori output as gradient orientation at pixel (r,c)

@return Returns 1 if the specified pixel is a valid one and sets mag and ori accordingly; otherwise returns 0

*/

//计算梯度幅值以及方向

int calc_grad_mag_ori(Image img, int r, int c, outdouble mag, outdouble ori) {

double dx, dy;

if (r > 0 && r < img.Height - 1 && c > 0 && c < img.Width - 1)

{

dx = img[r, c + 1].Intensity - img[r, c - 1].Intensity;

dy = img[r - 1, c].Intensity - img[r + 1, c].Intensity;

mag = Math.Sqrt(dx * dx + dy * dy);//梯度幅值

ori = Math.Atan2(dy, dx);//梯度方向,范围为:[-pi/2,pi/2]

return 1;//计算完成

}

else

{

mag = 0;

ori = 0;

return 0;

}

}

/*

Halves feature coordinates and scale in case the input image was doubled

prior to scale space construction.

@param features array of features

*/

//将x,y,s二等分

void adjust_for_img_dbl(ref List features)

{

Feature feat;

int i, n;

n = features.Count;

for (i = 0; i < n; i++)

{

feat = features[i];

feat.x /= 2.0;

feat.y /= 2.0;

feat.scl /= 2.0;

feat.img_pt.X /= 2.0F;

feat.img_pt.Y /= 2.0F;

}

}

/*

Calculates characteristic scale for each feature in an array.

@param features array of features

@param sigma amount of Gaussian smoothing per octave of scale space

@param intvls intervals per octave of scale space

*/

//为内插得到的精确的特征点(极值点)重新计算尺度空间坐标

void calc_feature_scales(ref List features, double sigma, int intvls)

{

Feature feat;

detection_data ddata;

double intvl;

int i, n;

n = features.Count;

for (i = 0; i < n; i++)

{

feat = features[i];

intvl = feat.feature_data.intvl + feat.feature_data.subintvl;//subintvl为尺度空间偏移量,这一行对尺度空间坐标进行纠正

feat.scl = sigma * Math.Pow(2.0, feat.feature_data.octv + intvl / intvls);//关键点的尺度空间坐标

feat.feature_data.scl_octv = sigma * Math.Pow(2.0, intvl / intvls);//组内某层图像尺度计算

}

}

/*

Converts an image to 8-bit grayscale and Gaussian-smooths it. The image is

optionally doubled in size prior to smoothing.

@param img input image

@param img_dbl if true, image is doubled in size prior to smoothing

@param sigma total std of Gaussian smoothing

*/

Image create_init_img(Image img, int img_dbl, double sigma)

{

Image gray;

Image dbl;

float sig_diff;

gray = convert_to_gray32(img);//将8-bit的RGB图像转化为32-bit灰度图像

if (img_dbl != 0)//将图像放大两倍,在进行高斯模糊,生成初始影像

{

sig_diff = (float)Math.Sqrt(sigma * sigma - SIFT_INIT_SIGMA * SIFT_INIT_SIGMA * 4);//sigma=1.6,SIFT_INIT_SIGMA =0.5

dbl = new Image(new Size(img.Width * 2, img.Height * 2));//img_dbl=1,将图像放大两倍

dbl = gray.Resize(dbl.Width, dbl.Height, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);//对扩大二倍后的图像进行三次样条插值重采样

dbl = dbl.SmoothGaussian(0, 0, sig_diff, sig_diff);//高斯模糊,前两位参数为用于高斯模糊的卷积核长宽,后两位参数是水平与竖直方向标准差

return dbl;

}

else

{

sig_diff = (float)Math.Sqrt(sigma * sigma - SIFT_INIT_SIGMA * SIFT_INIT_SIGMA); gray.SmoothGaussian(0, 0, sig_diff, sig_diff);

return gray;

}

}

/*

Converts an image to 32-bit grayscale

@param img a 3-channel 8-bit color (BGR) or 8-bit gray image

@return Returns a 32-bit grayscale image

*/

Image convert_to_gray32(Image img)

{

Image gray8;

Image gray32;

gray32 = new Image(img.Width, img.Height);

using (gray8 = img.Convert())

{

gray32 = gray8.ConvertScale(1.0 / 255.0, 0);//图像归一化

}

return gray32;

}

Image[,] build_gauss_pyr(Image basepic, int octvs,

int intvls, double sigma)//octvs:空间尺度层数,intvls:一组空间尺度内采样间隔数

{

Image[,] gauss_pyr = new Image[octvs, intvls + 3];//定义高斯金字塔图像数组,intvls+2为高斯差分金字塔每组(octvs)内层数,intvls + 3为高斯金字塔每组内层数

double[] sig = newdouble[intvls + 3];//记录高斯模糊度

double sig_total, sig_prev, k;//sig_total为当前图像空间尺度坐标,sig_prev前一层图像空间尺度坐标int i, o;

/*

precompute Gaussian sigmas using the following formula:

\sigma_{total}^2 = \sigma_{i}^2 + \sigma_{i-1}^2

*/

sig[0] = sigma;//sigma=1.6

k = Math.Pow(2.0, 1.0 / intvls);//k值计算公式

for (i = 1; i < intvls + 3; i++)//对高斯金字塔每层遍历计算高斯模糊度

{

sig_prev = Math.Pow(k, i - 1) * sigma;//前一幅图像空间尺度坐标

sig_total = sig_prev * k;//当前图像空间尺度坐标

sig[i] = Math.Sqrt(sig_total * sig_total - sig_prev * sig_prev);//通过尺度空间计算高斯模糊度(高斯标准差)

}

for (o = 0; o < octvs; o++)

for (i = 0; i < intvls + 3; i++)

{

if (o == 0 && i == 0)

gauss_pyr[o, i] = basepic.Clone();//第一幅图像,直接复制

/* base of new octvave is halved image from end of previous octave */

elseif (i == 0)

gauss_pyr[o, i] = downsample(gauss_pyr[o - 1, intvls]);//每一组第一幅图像,去上一组第intvls(采样间隔)层图像进行降采样(将图像缩小一半)

/* blur the current octave's last image to create the next one */

else

{

gauss_pyr[o, i] = gauss_pyr[o, i - 1].SmoothGaussian(0, 0, sig[i],

sig[i]);//高斯平滑,构建每一组内不同层图像

}

}

return gauss_pyr;

}

Image downsample(Image img)

{

Image smaller;

smaller = img.Resize(img.Width / 2, img.Height / 2, Emgu.CV.CvEnum.INTER.CV_INTER_NN);

return smaller;

}

Image[,] build_dog_pyr(Image[,] gauss_pyr, int octvs, int intvls)

{

Image[,] dog_pyr;

int i, o;

dog_pyr = new Image[octvs, intvls + 2];//高斯差分图像每组具有intvls+2个图像,采样间隔去除了DOG首尾图像,因为不能提供特征点不同尺度空间的领域比较

for (o = 0; o < octvs; o++)

for (i = 0; i < intvls + 2; i++)

{

dog_pyr[o, i] = gauss_pyr[o, i + 1].Sub(gauss_pyr[o, i]);//高斯金字塔同一组临近层差分相减

}

return dog_pyr;

}

/*

Detects features at extrema in DoG scale space. Bad features are discarded

based on contrast and ratio of principal curvatures.

@param dog_pyr DoG scale space pyramid

@param octvs octaves of scale space represented by dog_pyr

@param intvls intervals per octave

@param contr_thr low threshold on feature contrast

@param curv_thr high threshold on feature ratio of principal curvatures

@param storage memory storage in which to store detected features

@return Returns an array of detected features whose scales, orientations,

and descriptors are yet to be determined.

*/

List scale_space_extrema(Image[,] dog_pyr, int octvs, int intvls,

double contr_thr, int curv_thr)

{

List features = new List();

double prelim_contr_thr = 0.5 * contr_thr / intvls;//像素点稳定度初始值,0.5*0.4/S

Feature feat;

detection_data ddata;

int o, i, r, c;

for (o = 0; o < octvs; o++)

for (i = 1; i <= intvls; i++)

for (r = SIFT_IMG_BORDER; r < dog_pyr[o, 0].Height - SIFT_IMG_BORDER; r++)

for (c = SIFT_IMG_BORDER; c < dog_pyr[o, 0].Width - SIFT_IMG_BORDER; c++)

/* perform preliminary check on contrast */

if (Math.Abs(dog_pyr[o, i][r, c].Intensity) > prelim_contr_thr)//消除低对比度特征,提升特征点稳定性,值过小的点易受噪声干扰而不稳定

if (is_extremum(dog_pyr, o, i, r, c) == 1)//判断当前像素是否是极点(关键点,特征点),该步骤为极值点初步检测

{

feat = interp_extremum(dog_pyr, o, i, r, c, intvls,

contr_thr);//基于有限差分求导的方法精确定位像素点

if (feat != null)

{

ddata = feat.feature_data;

if ((is_too_edge_like(dog_pyr[ddata.octv, ddata.intvl],//消除边缘点

ddata.r, ddata.c, curv_thr) == 0))

{

features.Insert(0, feat);//cvSeqPush( features,

feat );

}

}

}

return features;

}

/*

Determines whether a pixel is a scale-space extremum by comparing it to it's

3x3x3 pixel neighborhood.

@param dog_pyr DoG scale space pyramid

@param octv pixel's scale space octave

@param intvl pixel's within-octave interval

@param r pixel's image row

@param c pixel's image col

@return Returns 1 if the specified pixel is an extremum (max or min) among it's 3x3x3 pixel neighborhood.

*/

int is_extremum(Image[,] dog_pyr, int octv, int intvl, int r, int c) {

float val = (float)dog_pyr[octv, intvl][r, c].Intensity;

int i, j, k;

/* check for maximum */

if (val > 0)

{

for (i = -1; i <= 1; i++)//上下层图像(9*9个像素)以及领域像素(8个),共比较26个像素for (j = -1; j <= 1; j++)

for (k = -1; k <= 1; k++)

if (val < dog_pyr[octv, intvl + i][r + j, c + k].Intensity)

return 0;//不是极值点,返回0

}

/* check for minimum */

else

{

for (i = -1; i <= 1; i++)

for (j = -1; j <= 1; j++)

for (k = -1; k <= 1; k++)

if (val > dog_pyr[octv, intvl + i][r + j, c + k].Intensity)

return 0;//不是极值点

}

return 1;//与领域26个像素比较完成,为最大或最小点

}

/*

Interpolates a scale-space extremum's location and scale to subpixel

accuracy to form an image feature. Rejects features with low contrast.

Based on Section 4 of Lowe's paper.

@param dog_pyr DoG scale space pyramid

@param octv feature's octave of scale space

@param intvl feature's within-octave interval

@param r feature's image row

@param c feature's image column

@param intvls total intervals per octave

@param contr_thr threshold on feature contrast

@return Returns the feature resulting from interpolation of the given

parameters or NULL if the given location could not be interpolated or

if contrast at the interpolated loation was too low. If a feature is

returned, its scale, orientation, and descriptor are yet to be determined.

*/

Feature interp_extremum(Image[,] dog_pyr, int octv, int intvl,

int r, int c, int intvls, double contr_thr)

{

Feature feat;

detection_data ddata;

double xi = 0, xr = 0, xc = 0, contr;

int i = 0;

while (i < SIFT_MAX_INTERP_STEPS)//5次收敛迭代,移动关键点或极值点位置

{

interp_step(dog_pyr, octv, intvl, r, c, out xi, out xr, out xc);//计算插值中心点与当前点的偏移量xi,xr,xc

if (Math.Abs(xi) < 0.5 &&Math.Abs(xr) < 0.5 &&Math.Abs(xc) < 0.5)//在任一维度上的偏移量大于0.5时(即x或y或),意味着插值中心已经偏移到它的邻近点上,所以必须改变当前关键点的位置

break;

c += (int)Math.Round(xc);//移动极值点行位置

r += (int)Math.Round(xr);//移动极值点行位置

intvl += (int)Math.Round(xi);//移动尺度空间位置

//下面的程序用于判断迭代期间特征点是否被移动到边界外,若移动到边界外,剔除这一特征点或极值点

if (intvl < 1 ||

intvl > intvls ||

c < SIFT_IMG_BORDER ||

r < SIFT_IMG_BORDER ||

c >= dog_pyr[octv, 0].Width - SIFT_IMG_BORDER ||

r >= dog_pyr[octv, 0].Height - SIFT_IMG_BORDER)

{

returnnull;

}

i++;

}

/* ensure convergence of interpolation */

//判断迭代是否收敛

if (i >= SIFT_MAX_INTERP_STEPS)

returnnull;

contr = interp_contr(dog_pyr, octv, intvl, r, c, xi, xr, xc);//计算经过偏移量纠正后的极点灰度值

if (Math.Abs(contr) < contr_thr / intvls)//若灰度值小于0.4/S(SIFT算法推荐的阈值),说明该点极易受噪声干扰而变得不稳定,该极值点应当舍去

returnnull;

//为feature_data成员赋值

feat = new_feature();

ddata = feat.feature_data;

feat.img_pt.X = (float)(feat.x = (c + xc) * Math.Pow(2.0, octv));

feat.img_pt.Y = (float)(feat.y = (double)((r + xr) * Math.Pow(2.0, octv)));

ddata.r = r;

ddata.c = c;

ddata.octv = octv;

ddata.intvl = intvl;

ddata.subintvl = xi;

feat.feature_data = ddata;

return feat;

}

Feature new_feature()

{

Feature feat = new Feature();

detection_data ddata = new detection_data();

feat.feature_data = ddata;

feat.type = feature_type.FEATURE_LOWE;

return feat;

}

/*

Performs one step of extremum interpolation. Based on Eqn. (3) in Lowe's

paper.

@param dog_pyr difference of Gaussians scale space pyramid

@param octv octave of scale space

@param intvl interval being interpolated

@param r row being interpolated

@param c column being interpolated

@param xi output as interpolated subpixel increment to interval

@param xr output as interpolated subpixel increment to row

@param xc output as interpolated subpixel increment to col

*/

void interp_step(Image[,] dog_pyr, int octv, int intvl, int r, int c,

outdouble xi, outdouble xr, outdouble xc)

{

Matrix dD, H, H_inv, X = new Matrix(3, 1);

double[] x = newdouble[] { 0, 0, 0 };

dD = deriv_3D(dog_pyr, octv, intvl, r, c);//求解三个量,像素x,y微分,即像素x,y方向的导数dx,dy,以及尺度空间的导数ds

H = hessian_3D(dog_pyr, octv, intvl, r, c);//创建Hessian矩阵,求解x,y,s方向二阶微分dxx,dyy,dss,以及dsx,dsy,dxy,求解它是为了剔除不稳定的边缘响应点

H_inv = H.Clone();

//下面进行x,y,s方向的插值增量计算

CvInvoke.cvInvert(H, H_inv.Ptr, Emgu.CV.CvEnum.INVERT_METHOD.CV_SVD);//求解矩阵H的你矩阵,并将求解结果保存到H_inv.Ptr中

unsafe

{

fixed (double* a = &x[0])

{

CvInvoke.cvInitMatHeader(X.Ptr, 3, 1, Emgu.CV.CvEnum.MAT_DEPTH.CV_64F, new IntPtr(a), 0x7fffffff);

}

}

CvInvoke.cvGEMM(H_inv.Ptr, dD.Ptr, -1, IntPtr.Zero, 0, X.Ptr, 0);//运用通用矩阵乘法对H_inv,dD进行运算,运行公式:X=-1*H_inv*dD

//cvReleaseMat( &dD );

//cvReleaseMat( &H );

//cvReleaseMat( &H_inv );

xi = x[2];

xr = x[1];

xc = x[0];

}

/*

Computes the partial derivatives in x, y, and scale of a pixel in the DoG

scale space pyramid.

@param dog_pyr DoG scale space pyramid

@param octv pixel's octave in dog_pyr

@param intvl pixel's interval in octv

@param r pixel's image row

@param c pixel's image col

@return Returns the vector of partial derivatives for pixel I

{ dI/dx, dI/dy, dI/ds }^T as a CvMat*

*/

Matrix deriv_3D(Image[,] dog_pyr, int octv, int intvl, int r, int c)

{

Matrix dI;

double dx, dy, ds;

dx = (dog_pyr[octv, intvl][r, c + 1].Intensity -

dog_pyr[octv, intvl][r, c - 1].Intensity) / 2.0;

dy = (dog_pyr[octv, intvl][r + 1, c].Intensity -

dog_pyr[octv, intvl][r - 1, c].Intensity) / 2.0;

ds = (dog_pyr[octv, intvl + 1][r, c].Intensity -

dog_pyr[octv, intvl - 1][r, c].Intensity) / 2.0;

dI = new Matrix(3, 1);

dI[0, 0] = dx;

dI[1, 0] = dy;

dI[2, 0] = ds;

return dI;

}

/*

Computes the 3D Hessian matrix for a pixel in the DoG scale space pyramid.

@param dog_pyr DoG scale space pyramid

@param octv pixel's octave in dog_pyr

@param r pixel's image row

@param c pixel's image col

@return Returns the Hessian matrix (below) for pixel H

/ Ixx Ixy Ixs \

| Ixy Iyy Iys |

\ Ixs Iys Iss /

*/

Matrix hessian_3D(Image[,] dog_pyr, int octv, int intvl, int r, int c)

{

Matrix H;

double v, dxx, dyy, dss, dxy, dxs, dys;

v = dog_pyr[octv, intvl][r, c].Intensity;

dxx = dog_pyr[octv, intvl][r, c + 1].Intensity + dog_pyr[octv, intvl][r, c - 1].Intensity - 2 * v;

dyy = dog_pyr[octv, intvl][r + 1, c].Intensity +

dog_pyr[octv, intvl][r - 1, c].Intensity - 2 * v;

dss = dog_pyr[octv, intvl + 1][r, c].Intensity +

dog_pyr[octv, intvl - 1][r, c].Intensity - 2 * v;

dxy = (dog_pyr[octv, intvl][r + 1, c + 1].Intensity -

dog_pyr[octv, intvl][r + 1, c - 1].Intensity -

dog_pyr[octv, intvl][r - 1, c + 1].Intensity +

dog_pyr[octv, intvl][r - 1, c - 1].Intensity) / 4.0;

dxs = (dog_pyr[octv, intvl + 1][r, c + 1].Intensity -

dog_pyr[octv, intvl + 1][r, c - 1].Intensity -

dog_pyr[octv, intvl - 1][r, c + 1].Intensity +

dog_pyr[octv, intvl - 1][r, c - 1].Intensity) / 4.0;

dys = (dog_pyr[octv, intvl + 1][r + 1, c].Intensity -

dog_pyr[octv, intvl + 1][r - 1, c].Intensity -

dog_pyr[octv, intvl - 1][r + 1, c].Intensity +

dog_pyr[octv, intvl - 1][r - 1, c].Intensity) / 4.0;

H = new Matrix(3, 3);

H[0, 0] = dxx;

H[0, 1] = dxy;

H[0, 2] = dxs;

H[1, 0] = dxy;

H[1, 1] = dyy;

H[1, 2] = dys;

H[2, 0] = dxs;

H[2, 1] = dys;

H[2, 2] = dss;

return H;

}

/*

Calculates interpolated pixel contrast. Based on Eqn. (3) in Lowe's paper.

@param dog_pyr difference of Gaussians scale space pyramid

@param octv octave of scale space

c语言程序设计课程计算器设计报告

课程设计说明书 题目计算器程序设计 起讫日期 2006 年 7月 3日至 2006 年 8月 6日 所在院系软件学院 专业机械+软件班级 04-2 学生姓名偶偶哦学号 指导教师 2006年 8 月日

摘要 当今社会是信息社会,科技经济高速发展的社会!为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。由于它体积小巧,携带方便,价格便宜,构造简单等诸多的优点成为人们生活中的必备品! 随着科技的发展计算器的种类变得更多,功能变得更强大,体积变得更小!电脑的出现改变人们的生活习惯,很多事情都可以电脑来完成!电脑的更大一个优点就是可以通过软件的应用无限的延伸电脑功能的外延!下面我们将用我们学习的c语言编写一个简易的计算器程序!实现简单的初步的计算功能! 本程序的编写基础是Tubro 汉化版,它在tubro c的原有基础上实现了多汉字的支持方便了我们的使用。生成的程序可移植性强兼容性好稳定!现在只实现了加、减、乘、除、求幂、求模,求平方根,求Sin,求Cos,求Log10,以及一个时钟原代码。这个系统是基于软件发展的生命周期来研制的,它可以直接输入数学表达式,不需要任何转换,就可以直接输出数学四则运算的结果。但是,每次只能运算一个表达式。不能运算多个表达式。在程序里面在添加一组选择函数即可。本论文主要介绍了本课题的开发背景,开发的过程和所要完成的功能。重点的说明了系统设计思想,设计的步骤、难点技术和解决方案。 关键词:C语言 Tubro c 汉化版计算器时钟

目录 第一章综述 (1) 1.1 课题的现实意义 (1) 1.2 软件环境 (1) 1.3 硬件环境 (1) 第二章系统设计流程图 (2) 2.1 系统流程图 (2) 2.2 主要功能表 (2) 第三章系统分析和设计 (3) 3.1 图形的绘制和输出 (3) 3.2 文本的输出显示 (3) 3.3 计算函数的调用 (4) 3.4 程序的运行和退出 (5) 第四章系统测试 (6) 4.1 系统测试 (6) 4.2 调试 (6) 4.3 错误原因分析一 (6) 4.4 错误原因分析二 (6) 第五章用户使用说明书 (8)

C语言程序设计试题及答案

C语言程序设计 一、选择题(共40分,每小题2分) 1、以下叙述不正确的是(D) A、一个C源程序可由一个或多个函数组成 B、一个C源程序必须包含一个main函数 C、C程序的基本组成单位是函数 D、在C程序中,注释说明只能位于一条语句的后面 2、下列四个选项中,是不合法的用户标识符的选项是(B) A、abc B、12AC C、sun D、A 3、设有语句inta=4;则执行了语句a+=a-=a*a后,变量a的值是(A) A、-24 B、0 C、4 D、16 4、下列运算符中优先级最高的是(B) A、< B、+ C、&& D、== 5、在C语言中,运算对象必须是整型数的运算符是(A) A、% B、/ C、%和/ D、+ 6、以下关于运算符的优先顺序的描述正确的是(C) A、关系运算符<算术运算符<赋值运算符<逻辑与运算符 B、逻辑与运算符<关系运算符<算术运算符<赋值运算符 C、赋值运算符<逻辑与运算符<关系运算符<算术运算符 D、算术运算符<关系运算符<赋值运算符<逻辑与运算符 7、在C语言中,如果下面的变量都是int类型,则输出的结果是(C) sum=pad=5;pAd=sum++,pAd++,++pAd; printf(“%d\n”,pad); A、7 B、6 C、5 D、4 8、x、y、z被定义为int型变量,若从键盘给x、y、z输入数据,正确的输入语句是(B)

A、INPUTx、y、z; B、scanf(“%d%d%d”,&x,&y,&z); C、scanf(“%d%d%d”,x,y,z); D、read(“%d%d%d”,&x,&y,&z); 9、假定从键盘输入23456<回车>,下面程序的输出结果是:(C)voidmain() {intm,n; scanf(“%2d%3d”,&m,&n); printf(“m=%dn=%d\n”,m,n); } A、m=23n=45 B、m=234n=56 C、m=23n=456 D、语句有错误 10、若运行时,给变量x输入12,则以下程序的运行结果是(A)main() {intx,y; scanf(“%d”,&x); y=x>12?x+10:x-12; printf(“%d\n”,y); } A、0B、22C、12D、10 11、C语言中while和do-while循环的主要区别(A) A、do-while的循环体至少执行一次 B、while的循环控制条件比do-while的循环控制条件严格 C、do-while允许从外部转到循环体内 D、do-while的循环体不能是复合语句 12、以下对二维数组的正确说明的语句是(C) A、inta[3][] B、floata(3,4) C、doublea[3][4] D、floata(3)(4) 13、以下程序的输出结果是(C) main()

c语言课程设计论文

《C语言程序设计》 项目设计报告 项目名称:学生成绩信息管理系统 2016年 1月 13日

目录 1 项目分析 0 1.1 问题描述 0 1.2 功能需求分析 0 2 系统设计 (1) 2.1 数据结构设计 (1) 2.3部分功能设计 (2) 3 系统实现源程序 (2) 3.1 主函数设计 (2) 3.2 添加学生信息 (5) 3.3 姓名学号查询 (18) 3.4 成绩查询 (22) 3.5 删除学生成绩信息 (24) 3.6 修改学生成绩信息 (29) 4 功能测试 (33) 4.1 菜单测试 (33) 4.2 系统功能测试 (33)

5 系统设计遇到的问题及解决方法 (35) 6 项目设计总结 (37)

1 项目分析 1.1 问题描述 信息储存与查询是计算机处理数据的优势之一,目前,学生信息的管理系统已经完全走进了校园,其中成绩信息的储存是主要部分,本课题使用C语言实现学生成绩的储存,查询,修改,以及删除等操作。程序中涉及到数据块和文件指针的操作,包括结构体数据定义,使用及文件的读写,定位,修改等。 1.2 功能需求分析 学生成绩信息管理系统的主要功能如下: ①添加学生信息:录入学生的基本信息,如姓名,学号,成绩。 ②显示所有学生成绩信息:直接显示已经全部录入学生的成绩信息。 ③学号或姓名查询:可以根据学生的姓名和学号直接查询该名学生的成绩。 ④成绩查询:可以根据一个特定的分数来查询学生的信息。 ⑤删除学生成绩信息:可以直接根据学号确定是否删除对应学生的成绩信息。 ⑥修改学生成绩信息:直接根据学生学号来修改学生的姓名,学号,成绩。

C语言程序设计期末考试试题(含答案)

C语言程序设计 期末考试试题及其答案 一、单项选择题(本大题共20题,每题2 分,共40分) 1、以下不是C语言的特点的是( ) A、C语言简洁、紧凑 B、能够编制出功能复杂的程序 C、C语言可以直接对硬件进行操作 D、C语言移植性好 2、以下不正确的C语言标识符是( ) A、ABC B、abc C、a_bc D、ab.c 3、一个C语言程序是由( ) A、一个主程序和若干子程序组成 B、函数组成 C、若干过程组成 D、若干子程序组成 4、一个算法应该具有“确定性”等5个特性,对另外4个特性的描述中错误的是( ) A、有零个或多个输入 B、有零个或多个输出 C、有穷性 D、可行性 5、设变量a是整型,f是实型,i是双精度型,则表达式10+‘a’+i*f值的数据类型为( ) A、int B、float C、double D、不确定 6、在C语言中,char型数据在内存中的存储形式是( ) A、补码 B、反码 C、源码 D、ASCII码 7、有如下程序,输入数据:12345M678<cR>后(表示回车),x的值是( ) 。 #include main(){ int x; float y; scanf("%3d%f",&x,&y); } A、12345 B、123 C、45 D、345 8、若有以下定义int a,b; float x,则正确的赋值语句是( ) A、a=1,b=2 B、b++; C、a=b=5 D、b=int(x); 9、以下程序的执行结果是( )

#include { int i=10,j=10; printf("%d,%d\n",++i,j--); } A、11,10 B、9,10 C、11,9 D、10,9 10、巳知字母A的ASCII码是65,以下程序的执行结果是( ) #include main() { char c1='A',c2='Y'; printf("%d,%d\n",c1,c2); A、A,Y B、65,65 C、65,90 D、65,89 11、下列运算符中优先级最高的是( ) A、< B、十 C、% D、!= 12、设x、y和z是int型变量,且x=3,y=4,z=5,则下面表达式中值为0是( ) 。 A、’x’&&’y’ B、x<=y C、x||y+z&&y-z D、!((x<y)&&!z ||1) 13、判断char型变量cl是否为小写字母的正确表达式为( ) A、’a’<=c1<=f’z’ B、(c1>=a)&&(c1<=z) C、(‘a’>=c1) (‘z’<=c1) D、(c1>=’a’)&&(c1<=’z’) 14、字符串"a"在内存中占据的字节个数为( ) A、0 B、 1 C、 2 D、 3 15、下面有关for循环的正确描述是( ) A、for循环只能用于循环次数已经确定的情况 B、for循环是先执行循环体语句,后判定表达式 C、在for循环中,不能用break语句跳出循环体 D、for循环体语句中,可以包含多条语句,但要用花括号括起来 16、下面程序的运行结果是( ) #include main() {int num=0; while(num<=2) {num++; printf(“%d ,num); } } A、 1 B、 1 2 C、 1 2 3

程序设计大赛试题及答案

试题 1、数学黑洞(程序文件名maths.c/maths.cpp) 【问题描述】 任给一个4位正整数,其各位数位上的数字不全相同,将数字重新组合成一个最大的数与最小的数相减,重复这个过程,最多7步,必得6174。对任给的4位正整数(各位数位上的数字不全相同),编程输出掉进黑洞的步数。 【输入】 一行,一个4位正整数n(1000< n<9999) 【输出】 掉进黑洞的步数 输入 1234 输出 3 2、进制转换(程序文件名conver.c/conver.cpp) 【问题描述】 任给一个十进制整数n,及正整数m(m<=16且m≠10), 将n转换成m进制并输出。 【输入】 一行,两个整数n,m(0 ≤ n ≤ 500000,2 ≤ m ≤ 16,且m≠10),中间用一个空格隔开,其中n 表示十进制数。 【输出】 转换后的数 【输入输出样例】 输入 255 8 输出 377 3、分数线划定(程序文件名score.c/score.cpp) 【问题描述】 公务员选拔工作正在 A 市如火如荼的进行。为了选拔优秀人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名公务员,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。 【输入】 第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的人数。输入数据保证m*150%向下取整后小于等于n。 第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。数据保证选手的报名号各不相同。 【输出】 第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。 从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。 【输入输出样例】 输入 6 3 1000 90 3239 88 2390 95 7231 84 1005 95 1001 88

C语言程序设计论文

C语言程序设计论文 鸡西大学 08电气与信息工程系 班级:软件2班 姓名:范孝龙

设计题目:贪吃蛇 正文: 一、引言: 贪吃蛇这一游戏实训中初次接触,通过操作熟悉,觉知此游戏简单易行,操作方便,而且娱乐性较强,应该吸引了不少游戏的钟爱者人。这一款游戏紧紧地抓住了人们的心理,虽然简单,却起乐无穷,在人们不断追求更多的欲望下,该游戏给人们带来了追逐的快感,以及成功后的满足感,对于一直处于高压下的现代人是很好的放松工具,令人百玩不厌。 二、系统分析: 1)可行性分析:首先,贪吃蛇用C语言编程,有很好的技术可行性,在MYTC下也能顺利运行,可以说在技术方面,只要掌握代码编写知识,就不会有多大的问题。其次,贪吃蛇这类小游戏,还能够下载到手机上玩,所以,更容易为人们所接受,这就展现它的经济可行性也会不赖。再次,无论是电脑还是手机或游戏机,在操作上它都很简单,一学就懂,又证实了它的操作可行性。 2)需求分析:游戏是人们生活中不可或缺的,是一个人从小到大,真正伴随他成长的东西。游戏在娱乐中占有着很重要的地位,不论是一个玩具,还是一个能和伙伴一起开心的小游戏,都是能给我们留下很多美好的回忆。所以不论是什么样的游戏,只要它能迎合人们内心的某种需求,它的市场总会是好的。贪吃蛇,是个简单的小游戏,但却能给人以放松,让我们从繁重的日常生活中解脱出来,得到身心

的放松,现在的人,不管是已经工作的,还是还未进入社会的学生,都面临着很大的压力,而这样一款能让我们随时随地都能享受的游戏,其魅力还是不可估量的。 贪吃蛇,之所以取这样的名字,去用意还是很明显的。贪吃蛇其实并不贪,它只是人不断向前追求的象征。就像现代的人只有不断努力向前才能得到自己想要的。而食物也是随机出现的,就像现在社会存在的机会,而我们只有找好自己的目标才能成功。虽然现在市面上存在着各种各样的游戏版本,可是贪吃蛇其市场还是相当大的。因为它的特殊在于它能吸引人更深入,爱不释手。随着游戏速度不断加快,其刺激性也更强。 我觉得该游戏的优势在于它的简单易行,不论是手机,还是小游戏机,都能很快顺利的运行,对于在外忙碌的人,不可能花费大量时间在娱乐上,大型游戏是行不通的,这样的小游戏刚好迎合了他们的需求。 三、设计目的: 进一步培养结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解;针对C语言中的重点和难点内容进行训练,能够独立完成有一定工作量的程序设计任务,同时培养好的程序设计风格;掌握C语言的编程技巧和上机调试程序的方法;掌握程序设计的常用算法;加强对所学知识的巩固。 四、设计思想及其编码过程概述: 1)这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩

04737c程序设计试题及答案20200_图文

全国2009年10月高等教育自学考试 C++程序设计试题 课程代码:04737 一、单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.对C++中主函数描述正确的是( ) A.名称为main,可为多个 B.名称不限,可为多个 C.名称为main,必须有且只能有一个 D.名称不限,必须有且只能有一个 2.调用声明为int result(int a,int b)的函数时,正确的方法是( ) A.result(1,2) B.result(1) C.result(0.1,0.3) D.result(1,2,3) 3.用于包含C++标准库iostream的预处理指令是( ) A.#define B.#include C.#define ‘iostream’ D.#include‘iostream’ 4.无类型标识符是指( ) A.void B.bool C.short D.long 5.从本质上看,引用是被引用变量的( ) A.拷贝 B.别名 C.复制 D.克隆 6.下面关于数组的初始化正确的是( ) A.char str[ ]={'a','b','c'}; B.char str[2]={'a','b','c'}; C.char str[1][2]={{'a','b'},{'e','d'}}; D.char str[ ][ ]={'a','b','c'}; 7.C++类中定义的成员默认访问属性为( ) A.public B.private C.protected D.friend 1文档来源为:从网络收集整理.word版本可编辑.

C++程序设计试题及答案

C++程序设计试题 一、单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 ++源程序文件扩展名为( A ) A..cpp B..h C..1ib D..obj 2.在C++中使用流进行输入输出,其中专用于从键盘进行输入的流是( B ) 3.包含自定义头文件的预处理指令是( D ) A.#define<> B.#include C.#define D.#include"" 4.用于标识十六进制前缀或后缀是( D ) A.元 B.后缀L或e C.前缀零 D.前缀0x 5.设存在整型变量int x,则下列句与其它三项含义不同的是( A ) * p=&x; & p=x; & p=x; &p=x; 6.在定义类成员时,为产生封装性,则需使用哪个关键字( D ) 7.设函数void swap(int&,int&)将交换两形参的值,如两整型变量int a=10;int b=15; 则执行swap(a,b)后,a、b值分别为( C ) ,10 ,15

,10 ,15 8.函数默认参数在函数原型中说明,默认参数必须放在参数序列的( C) A.前部 B.中部 C.后部 D.两端 9.设存在函数int min(int,int)返回两参数中较小值,若求15,26,47三者中最小值,下列表达式中错误的是( B ) m=min(min(15,26),min(15,47)); m=min(15,26,47); m=min(15,min(47,26)); m =min(min(47,26),16); 10.下列函数不能和函数void print(char)构成重载的是(C ) print(int); print(char,char); print(char); print(int,int); 11.在下列成对的表达式中,运算结果类型相同的一对是( D ) /2和/ /和7/2 0和/2 l2.内联函数的特点是( D ) A.减少代码量,加快访问速度 B.减少代码量,减缓访问速度 C.增加代码量,减缓访问速度 D.增加代码量,加快访问速度

《C语言程序设计》课程设计报告

《C语言程序设计》课程设计报告 (2013— 2014学年第 3 学期) 题目:C语言课程设计 专业:软件工程 班级:软件工程技术2班 姓名学号: 1 林燕萍 指导教师:吴芸 成绩: 计算机科学与技术系 2014 年6月23日

目录 一、课程设计的目的与要求 (1) 二、方案实现与调试 (3) 2.1 掷骰子游戏 (5) 2.2 射击游戏 (7) 2.3 计算存款本息之和 (8) 2.4肇事逃逸 (10) 2.5 礼炮 (12) 2.6 汽车加油 (14) 2.7 大优惠 (16) 2.8 金币 (19) 三、课程设计分析与总结 (23) 附录程序清单 (25) 一、课程设计的目的与要求(含设计指标) C语言是一种编程灵活,特色鲜明的程序设计语言。C语言除了基知识,如概念,方法和语法规则之外更重要的是进行实训,以提高学习者的动手和编程能力,从应试课程转变为实践工具。 这是学习语言的最终目的。结合多年来的教学经验,根据学生的学习情况,为配合教学过程,使“项目教学法”能在本质上促使学生有更大进步,特编写了该《C语言程序设计任务书》,以在实训过程中给学生提供帮助。达到如下目的: 1.在课程结束之前,让学生进一步了解C程序设计语言的编程功能; 2.让学生扎实掌握C程序设计语言的相关知识; 3.通过一些有实际意义的程序设计,使学生体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。 编写程序要求遵循如下基本要求: ①模块化程序设计 ②锯齿型书写格式

③必须上机调试通过 二、方案实现与调试 2.1掷骰子游戏 2.1.1 题目内容的描述 1) 两人轮流掷骰子,每次掷两个,每人最多掷10次。 2) 将每人每次的分值累加计分 3) 当两个骰子点数都为6时,计8分;当两个点数相等且不为两个6时,计7分;当两个点数不一样时,计其中点数较小的骰子的点数。 4) 结束条件:当双方都掷10次或经过5次后一方累计分数多出另一方的30%及以上。最后显示双方分数并判定优胜者。 2.1.2输入数据类型、格式和内容限制和输出数据的说明 数据类型:整型;内容限制:随机数的产生;输入数据结果:胜利的一方 2.1.3主要模块的算法描述 本算法的思路过程:首先要随机产生随机数,然后进行算法输出数值,执行条件判断输入结果,最后比较结果,判断胜利的一方。 程序流程图 图1 掷骰子游戏 2.1.4调试过程及实验结果

C语言程序设计试题集及其答案

第一章基础知识 一.填空 1. 每个C程序都必须有且仅有一个________ 函数。 2. C语言程序开发到执行通常要经过6个阶段即编辑、预处理、________、链接、加载和执行。 3. 软件是程序,以及______、使用和维护所需要的所有文档。 4. 国标中规定:“计算机程序是按照具体要求产生的适合于计算机处理的_________”。 5. 程序设计语言按照书写形式,以及思维方式的不同一般分为低级语言和________两大类。 6. C语言是由________组成的。 7. C语言的函数可分为主函数main、标准库函数和_________。 8. 一个函数是由两部分组成的,即:________和函数体。 9. 编译是将C语言所编写的源程序________成机器代码,也称为建立目标代码程序的过程。 10. 程序是由某种程序设计语言编制出来,体现了编程者的控制思想和对计算机执行操作 的要求。不同的任务功能,就会需求不同的软件程序,如:控制计算机本身软硬件协调工作,并使其设备充分发挥效力,方便用户使用的系统软件程序,称为操作系统;而为办公自动化(OA)、管理信息系统(MIS)、人工智能、电子商务、网络互联等等应用而开发的软件程序,统称为_________。 11. 机器语言是以__________形式表示的机器基本指令的集合,是计算机系统唯一不需要翻译可以直接识别和执行的程序设计语言。 12. 与机器语言相比,使用汇编语言来编写程序可以用_______来表示指令的操作码和操作对 象,也可以用标号和符号来代替地址、常量和变量。 13. 在编译程序之前,凡以____开头的代码行都先由预处理程序预处理。 14. C程序的执行均是由执行_________开始。 15. 函数体即为包含在{}内的部分。它分为________和为完成功能任务由若干个C 语句 组成的执行部分。 16. C语言程序中一条简单语句是以________字符作为结束符的。 17. C语言是结构化、________的程序设计语言。 18. 由于计算机硬件不能直接识别高级语言中的语句,因此,必须经过“_______程序”,将用高级语言编写的程序翻译成计算机硬件所能识别的机器语言程序方可执行。 19. 用高级语言编写的程序需翻译成计算机硬件所能识别的机器语言程序方可执行。所以 说,用高级语言进行程序设计,其编程效率高,方便易用,但_______没有低级语言高。

C.语言程序设计试题试题及答案

C 语言程序设计试卷 ,C++语言程序设计试题及答案 一、单项选择题(每题1分,共20分) 1. C语言规定:在一个源程序中,main函数的位置( C )。 A. 必须在最开始 B. 必须在系统调用的库函数的后面 C. 可以任意 D. 必须在最后 2. 下面四个选项中,均是合法浮点数的选项是( B )。 A. +1e+1 5e-9.4 03e2 B. -.60 12e-4 -8e5 C. 123e 1.2e-.4 +2e-1 D. -e3 .8e-4 5.e-0 3. 若a=-14,b=3,则条件表达式 a

C语言程序设计论文

C语言程序设计论文学校:天津电子信息职业技术学院 系别:电子技术系 专业:通信技术 班级:通信S13-26 学号:89757 姓名:王磊

C语言课程设计报告 一、设计题目:计算器 二、设计目标:进一步加深、巩固学生所学专业课程(《C语言》)的基本理论知识,理论 联系实际,进一步培养学生综合分析问题和解决问题的能力。掌握运用C语言独立地编写、调试应用程序和进行其它相关设计的技能,充分发挥广大同学的潜力,使他们通过本次课程设计而得到全面的锻炼。 三、设计内容: 1.设计系统的功能框图、流程图; 2.编写计算器的源程序代码; 3.上机调试; 4.答辩; 5.书写实习报告。 四、课程设计所用设备:每人一台计算机。 五、课程设计系统组成及模块功能: (1)主函数模块 (2)设置系统进入图形模块 (3)初始化图形系统模块 (4)计算器计算函数模块 (5)窗口函数模块 (6)设计鼠标图形函数模块 (7)获取特殊键函数模块 六、软件环境:Visual c++6.0 七、课程设计要求:在计算机上操作,通过Visual c++6.0,设计出“计算器”程序。 八、应提交的材料:实习报告一份,内容包含“计算器”程序代码。 设计报告: 程序代码:#include #include #include #include #include #include #include

#include #include #define UP 0x48 #define DOWN 0x50 #define LEFT 0x4b #define RIGHT 0x4d #define ENTER 0x0d void *rar; struct palettetype palette; int GraphDriver; int GraphMode; int ErrorCode; int MaxColors; int MaxX, MaxY; double AspectRatio; void drawboder(void); void initialize(void); void computer(void); void changetextstyle(int font, int direction, int charsize); void mwindow(char *header); int specialkey(void) ; int arrow(); int main() { initialize(); computer(); closegraph(); return(0); }

C语言程序设计试题集及答案

单项选择题 (002) 阅读程序题 (018) 程序填空题 (039) 编写程序题 (070) 一、单项选择题 导读:单项选择题要求从给出的四个备选答案中,选出一个最符合题意的答案。本类习题主要检查对C语言基本概念的掌握情况,读者可根据学习进度选做部分习题。在完成习题的过程中,不但要选出正确的答案,而且要清楚不正确的选项错在何处,以加深对概念的理解。对于掌握不准的问题,应该通过上机实验来检验。 【1.1】以下不正确的C语言标识符是____。 A) int B) a_1_2 C) ab1exe D) _x 【1.2】以下是正确的C语言标识符是____。 A) #define B) _123C) %d D) \n

【1.3】下列四组字符串中都可以用作C语言程序标识符的一组是。 ??? A) print B) i\am C) Pxq D) str_l ??? _3d one_half My->book Cpp ??? oodbs tart$it line# pow ??? aBc 3pai His.age while 【1.4】下面各选项组中,均是C语言关键字的组是。 A) auto,enum,include B) switch,typedef,continue C) signed,union,scanf D) if,struct,type 【1.5】下列不属于C语言关键字的是。 A) default B) register C) enum D) external 【1.6】C语言程序从main()函数开始执行,所以这个函数要写在____。 A) 程序文件的开始B) 程序文件的最后 C) 它所调用的函数的前面D) 程序文件的任何位置 【1.7】下列关于C语言的叙述错误的是____ A) 大写字母和小写字母的意义相同 B) 不同类型的变量可以在一个表达式中 C) 在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型 D) 同一个运算符号在不同的场合可以有不同的含义 【1.8】在C语言中,错误的int类型的常数是。 A) 32768 (超过了范围) B) 0 C) 037 D) 0xAF 【1.9】执行语句printf("%x",-1);屏幕显示____。 A) -1 B) 1 C) –ffff D) ffff 【1.10】已知long i=32768;执行语句printf("%d",i);屏幕显示____。 A) -1 B) -32768C) 1 D) 32768 【1.11】已知long i=65539; 执行语句printf("%d",i);屏幕显示____。 A) 65539 B) -3 C) 3D) 程序不能执行 【1.12】在C语言中,整数-8在内存中的存储形式是。 A) 1111 1111 1111 1000B) 1000 0000 0000 1000 C) 0000 0000 0000 1000 D) 1111 1111 1111 0111 【1.13】C语言中字符型(char)数据在内存中的存储形式是____。

C语言程序设计期末考试试题及答案

C 语言程序设计 试 题 (2008 /2009 学年 第 二 学期) 一. 选择题(满分30分,每题2分) 1.若a 、b 、c 都定义为int 类型且初值为0,则以下不正确的赋值语句是 D 。 A. a=b=c+8; B. a+=y+3; C. c++; D. a+b+c 2. 已知int j ,i=1;执行语句“j=i++;”后,变量i 的值是 B 。 A. 1 B. 2 C. –1 D. -2 3.执行下面程序: #include "stdio.h" void main() { int a=1,b=2,c=3; c=(a+=a+2),(a=b,b+3); printf(“%d,%d,%d ”,a,b,c); } 则输出结果是: A 。 A. 2,2,4 B. 4,2,3 C. 5,5,3 D. 4,2,5 4.若要求在if 后一对圆括号中表示a 不等于0的关系,则能正确表示这一关系的表达式为 D 。 A. a< >0 B. !a C. a=0 D. a 5. for (j=0;j<11;j++);循环结束后,j 的值是 B 。 A. 12 B. 11 C. 10 D. 9 6. C 语言中函数返回值的类型由 D 决定的。 A. return 语句中的表达式类型 B. 调用该函数的主调函数的类型 C. 调用函数时临时决定 D. 定义函数时所指定的函数类型 7. 下列说法中正确的是 B 。 A 在调用用户自定义函数时,必须对其进行声明。 B 函数可以返回一个值,也可以什么值也不返回。 C 说明函数时,必须明确参数的类型和返回值。 D 在程序设计中空函数没有什么作用。 8. 若int i=10;执行下列程序后,变量i 的正确结果是 D 。 switch ( i ) {case 0: i+=1; case 10: i+=1; case 11: i+=1; default: i+=1; } A. 10 B. 11 C. 12 D. 13 9. 下列语句中不正确的字符串赋值或初始化的是 C 。 A . char str[10]={"strings"}; B.char str[8]={'s','t','r','i','n ','g','s','\0'}; C. char str[10]; str= "strings"; D. char str[]= "strings"; 10. 有如下程序: #include void main() { int a=1,b=0,c=0; if (a

VB程序设计试题及答案一

V B程序设计试题及答案(一) 一、单选题 1. VB6.0是一种面向B 的编程环境。 (A) 机器(B) 对象 (C) 过程(D) 应用 2. 要使FormI窗体的标题栏显示"欢迎使用VB",以下D 语句是正确的。 (A) Forml.Caption=“欢迎使用VB” (B) Forml.Caption='欢迎使用VB' (C) Forml.Caption=欢迎使用VB (D) Forml.Caption="欢迎使用VB" 3. 若要使命令按钮不可操作,要对A 属性进行设置。 (A) EnabIed (B)Visible (C) Backcolor (D)Caption 4. 如果在窗体上已经创建了一个文本框对象TextI,可以通过C 事件获得输入键值的ASCII码。 (A) Change (B) LostFocus (C) KeyPress (D) GotFocus 5. 下面A 是合法的变量名。 (A) X_yz (B) 123ab。(C) integer (D) X-Y 6. 以下关系表达式中,其值为False的是A 。 (A) "ABC">"AbC" (B) "女">"男" (C) "BASIC"=UCase("basic) (D) "123"<"23" 7. 为了给x、y、z三个变量赋初值1,下面正确的赋值语句是A 。 (A) x=1:y=1:z=1 (B) x=1,y=1,z=1 (C) x=y=z=1 (D) xyz=1 8. VB提供了结构化程序设计的三种基本结构,三种基本结构是D 。 (A)递归结构、选择结构、循环结构 (B)选择结构、过程结构、顺序结构 (C)过程结构、输入输出结构、转向结构 (D)选择结构、循环结构、顺序结构 9. 下面If语句统计满足性别为男、职称为副教授以上、年龄小于40岁条件的人数,不正确的语句是 D 。 (A) If sex="男" And age=4O And InStr(duty,"教授")>O Then n=n+l (B) If sex="男" And age=4O And (duty="教授" Or duty="副教授") Then n=n+l (C) If sex="男" And age=4O And Right(duty,2)="教授" Then n=n+l (D) If sex="男" And age=4O And duty="教授" And duty="副教授" Then n=n+l 10.下列关于Do…Loop循环结构执行循环次数的描述正确的是D 。 (A) Do While…Loop循环和Do…Loop Until循环至少都执行一次 (B) Do While…Loop循环和Do…Loop Until循环可能都不执行 (C) Do While…Loop循环至少执行一次和Do…Loop Until循环可能不执行 (D) Do While…Loop循环可能不执行和Do…Loop Until循环至少执行一次 11.以下B 是正确的For…Next结构。 (A) For x=1 To Step 10 (B) For x=3 To -3 Step -3 ……

c语言程序设计报告4

课程设计报告 课程名称C语言程序设计 课题名称运动会分数统计系统 专业机械设计及其自动化 班级1185班 学号201113090526 姓名谭信 指导教师王颖 2012年6月22日

湖南工程学院 课程设计任务书 课程名称C语言程序设计 课题运动会分数统计系统 专业班级机械设计1185 学生姓名谭信 学号201113090526 指导老师王颖 审批王颖 任务书下达日期2012年6月1日 任务完成日期2012年6月22日

现代科学飞速发展,世界也不断的变化,人类的生活随着科技的发展也发生着惊天动地的变化。作为新时代的大学生,我们应该不断努力学习科学文化知识,以适应社会的发展要求,以现代化的科学知识为祖国做贡献。而C 语言作为一种计算机语言,无疑是我们将来工作不可缺少的一门技能,所以我们应该认真学好C语言。但只是课本上的知识是不够的,我们应该将从课本上学到的理论知识应用到实践中,通过不断的实践,在实践中发现错误解决错误,并不断创新,最后能熟练的运用所学的知识,充分掌握这种工具。就现有知识水平、经验来看,对我来说,本程序的算法设计上已经是最精简的了。C语言知识博大精深,有必要对C语言的专著进行研究学习,多阅读别人的程序代码、多动手实践操作与设计,这样便对程序算法精简改进提供了可能。想学的更深更透彻的话就必须进一步掌握运用C进行程序设计的能力;进一步理解和运用面向过程程序设计的思想和方法;初步掌握开发一个小型实用系统的基本方法;学会调试一个较长程序的基本方法;学会利用互联网查找相关的知识并学习;学海之路何其宽广,有必要让我们孜孜不倦的求索下去。

绪论 (1) 第一章需求分析 1.1程序的功能及要求 (5) 1.2系统的性能要求 (5) 1.3测试数据 (6) 第二章概要设计 2.1结构体 (6) 2.2主程序(main) (6) 2.3模块的功能 (6) 2.4程序模块机之间的调用关系 (7) 第三章详细设计 3.1宏定义 (8) 3.2数据类型定义 (8) 3.3函数之间的调用关系图 (8) 3.4算法设计 (9) 第四章调试分析 4.1不足之处 (10) 4.2错误规范 (10) 4.3算法的时空分析 (10) 4.4存在的问题 (10) 第五章测试结果 (11) 第六章用户使用手册 6.1运行环境 (12) 6.2用户界面 (12) 6.3操作过程 (13) 第七章参考文献 (14) 第八章设计体会 (15) 第九章附录 (17) 课程设计评分表 (29)

c语言程序设计题目及答案

一、程序设计共113 题第1 题题 号:319 #include "stdio.h" void wwjt(); int fun(int m) { int i,k=1; if(m<=1) k=0; for(i=2;i #include #define M 3 #define N 4 void wwjt(); void fun(int tt[M][N],int pp[N]) { int i,j; for(j=0;jpp[j]) pp[j]=tt[i][j]; } 第3 题题号:375 功能:从键盘上输入任意实数, 求出其所对应的函数值。 z=e 的x 次幂( x>10) z=log(x+3) (x>-3) z=sin(x)/((cos(x)+4) #include #include void wwjt(); double y(float x) { double z; if(x>10) z=exp(x); else if(x>-3) z=log(x+3); else z=sin(x)/(cos(x)+4); return(z); } 第4 题题号:334 功能:求给定正整数n 以内的素数之积。( n<28) #include #include"conio.h" void wwjt(); long fun(int n) { long i,k; long s=1; for(i=2;i<=n;i++) {for(k=2;k #include"conio.h" void wwjt(); long int fun(int n) { long s=1,i; for(i=2;i<=n;i++) if(n%i==0)s=s*i; return s; } 第6 题题号:50 功能:求出菲波那契数列的前一项与后一项之比的极限的 近似值例如:当误差为0.0001 时,函数值为0.618056 。 #include #include "math.h" void wwjt(); float fun() { float f1=1,f2=1,f3; float r1=2,r2; do {r2=r1; r1=f1/f2; f3=f1+f2; f1=f2; f2=f3; }while(fabs(r1-r2)>1e-4); return r1; } 第7 题题号:394 功能:产生20个[30,120] 上的随机整数放入二维数组 a[5][4] 中, 求其中的最小值。 #include "stdlib.h" #include void wwjt(); int amin(int a[5][4]) { int i,j,s; s=a[0][0];

相关主题