C# 编程 基础 总结 教程

C# 编程 基础 总结 教程
C# 编程 基础 总结 教程

1 如何理解和使用C#中的委托

在C#中的委托也就相当于C中的函数指针,使用委托首先也要定义,如delegate int IntOp(int x);定义了一个委托IntOp,这个委托代表了一类函数,其返回值是int型的,带有一个参数,参数的类型也是int型的。只能委托这种类型的函数。使用委托时,也要对其实例化。如IntOp operation = new IntOp (方法);委托也就是将括号里的“方法”委托给operation。而这个“方法”即是个函数。返回值是int型,有一个参数,是int型的。委托后直接利用委托即可如operation(5);上述的委托是单点委托的,还可以多点委托,多点委托定义时返回值最好定义为void类型的,因为委托的多个方法不止有一个返回值。如delegate void IntOp(int x); 在实例化委托时可以将多个方法委托给一个委托实例。如IntOp operation = new IntOp (方法1);operation += new IntOp(方法2);….. 方法1 和方法2 的类型是一致的。Operation(5);意味着方法1和方法2 都要顺序执行,传入的参数值是5。

在C#中,委托的构造函数总是带有一个参数,该参数就是所封装的方法名,这个方法必须匹配最初定义委托时的签名。

2用visual C#实现数字图像处理

将图像显示在窗体上要激发paint事件如下代码:

private void Form1_Paint(object sender, PaintEventArgs e)

{ Graphics g = e.Graphics;

g.DrawImage(m_Bitmap,//所要显示的图像,应在主窗体类中声明并要有构造函数如下new

Rectangle(this.AutoScrollPosition.X, this.AutoScrollPosition.Y, (int)(m_Bitmap.Width),

(int)(m_Bitmap.Height))); }

public Form1()

{

InitializeComponent();

m_Bitmap = new Bitmap(2, 2);//一指定的长度宽度初始化实例。

}

private Bitmap m_Bitmap;

打开一幅图片的代码如下:

private void打开文件ToolStripMenuItem_Click(object sender, EventArgs e)

{

OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Filter = "Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有合适文件

(*.bmp/*.jpg)|*.jpg/*.bmp";

openFileDialog.FilterIndex = 2;过滤得索引号,在打开类型对话框中默认为Jpeg文件(*.jpg)

openFileDialog.RestoreDirectory = true;获取或设置一个值,该值指示对话框在关闭前是否还原当前目录。

if (DialogResult.OK == openFileDialog.ShowDialog())

{

m_Bitmap = (Bitmap)Bitmap.FromFile(openFileDialog.FileName, false);

this.AutoScroll = true;

this.AutoScrollMinSize = new Size((int)(m_Bitmap.Width), (int)(m_Bitmap.Height));

this.Invalidate();完成主窗体的重绘工作。

}

}

保存图像的代码:

private void保存文件ToolStripMenuItem_Click(object sender, EventArgs e)

{

SaveFileDialog saveFileDialog = new SaveFileDialog();

saveFileDialog.Filter = "Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|所有合适文件

(*.bmp/*.jpg)|*.jpg/*.bmp";

saveFileDialog.FilterIndex = 1;

saveFileDialog.RestoreDirectory = true;

if (DialogResult.OK == saveFileDialog.ShowDialog())

m_Bitmap.Save(saveFileDialog.FileName);

}

}

Bitmapdata类:指定位图图像的属性,包含了图像文件的内部信息。

Bitmap.LockBits 方法(Rectangle, ImageLockMode, PixelFormat)将bitmap锁定到内存中参数rect

Rectangle结构,它指定要锁定的Bitmap部分。

flags

ImageLockMode枚举,它指定 Bitmap 的访问级别(读/写)。

枚举类型有:readonly 指定锁定图像的一部分以便读取。

Readwrite 指定锁定图像的一部分以便读取或写入。

Writeonly 指定锁定图像的一部分以便写入。

PixelFormat枚举,它指定此 Bitmap 的数据格式。

Format24bpprgb 指定格式为每像素24位;红色绿色蓝色分量各使用8位

…….

返回值 BitmapData,它包含有关此锁定操作的信息。

Bitmapdata.stride: 获取或设置 Bitmap 对象的跨距宽度(也称为扫描宽度)。跨距是单行像素(一个扫描行)的宽度,舍入为一个 4 字节的边界。跨距总是大于或等于实际像素宽度。如果跨距为正,则位图自顶向下。如果跨距为负,则位图颠倒。

Bitmapdata.Scan0:获取或设置位图中第一个像素数据的地址。它也可以看成是位图中的第一个扫描行.

System.intptr用于表示指针或句柄的平台特定类型。

public static bool invert(Bitmap b)//bitmap要处理的图像

{BitmapData bmData = b.LockBits(new

Rectangle(0,0,b.Width,b.Height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);//将要处理的图像的信息锁定到内存中。

int stride = bmData.Stride;图像每一行的跨距。图像单行像素的宽度。

System.IntPtr Scan0 = bmData.Scan0;获取图像中第一个像素点的地址。

unsafe

{ byte* p = (byte*)(void*)Scan0;

int nOffset =stride - b.Width * 3;//因为每一个像素点是有3种颜色成分,每个像素点的三色分别占据一个地址。所以要乘以3。

int nWidth = b.Width * 3;

for (int y =0; y < b.Height; ++y)//图像的高度,以像素为单位。

{

for (int x = 0; x < nWidth; ++x)

{

*p = (byte)(255- *p);对于图片中的每个像素中的三色作处理,由每一色的最大值(255)减去当前值。称为图像翻转。

++p;

(nVal = (int)(*p + nBrightness);

*p = (byte)nVal;

++p;)图像增亮的代码

}

p +=nOffset;

}

}

b.UnlockBits(bmData);从内存中将图像解锁。

return true;

下面的代码是对图像变灰的处理

public static bool Gray(Bitmap b)

{

BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;

System.IntPtr Scan0 = bmData.Scan0;

unsafe

{

byte* p = (byte*)(void*)Scan0;

int nOffset = stride - b.Width * 3;

byte red, green, blue;

for (int y = 0; y < b.Height; ++y)

{

for (int x = 0; x < b.Width; ++x)

{

blue = p[0];

green = p[1];

red = p[2];

p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);

p += 3;

}

p += nOffset;

}

}

b.UnlockBits(bmData);

return true;}

3 实现带图像和提示的。Net组合框组件

实现方法及步骤详解

新建visual C#项目类库,命名为ImageTipComboBox,代码生成后在“解决方案”添加新项,用户控件,对话框中输入ImageTipComboBox.cs,将自动生成的Class1.cs删除,开发工具生成从Usercontrol继承的类ImageTipComboBox;将Usercontrol改为combobox;下面是类库项目的完整的代码。

using System;

using System.Collections.Generic;

using https://www.360docs.net/doc/1014074212.html,ponentModel;

using System.Drawing;

using System.Data;

using System.Text;

using System.Windows.Forms;

using System.Collections;

namespace ImageTipComboBox

{

public partial class ImageTipComboBox : ComboBox

{

public ImageTipComboBox()

{

this.DropDownStyle = ComboBoxStyle.DropDownList;//获取或设置指定组合框样式的值是不能直接编辑文本,通过单击来获得下拉列表选择值。

值。OwnerDrawVariable控件中的所有元素都由手动绘制,元素大小可能不相等。OwnerDrawFixed,元素大小相等。Normal 控件中的所有元素都由操作系统绘制的,元素大小可能不相等

//InitializeComponent();

}

public class ItcBoxItem

{

private string text;//组合框中某一项的文本

private int imageIndex;//图像的索引值

private string tip;//组合框的提示

public string Text//属性

{

get { return text; }

set { text = value; }

}

public int ImageIndex

{

get { return imageIndex; }

set { imageIndex = value; }

}

public string Tip

{

get { return tip; }

set { tip = value; } }

public ItcBoxItem(string text, int index, string tip)

{

this.text = text;

imageIndex = index;

this.tip = tip;

}

public ItcBoxItem(string text, string tip) : this(text, -1, tip) { }

public ItcBoxItem(string text, int index) : this(text, index, "") { }

public ItcBoxItem(int index, string tip) : this("", index, tip) { }

public ItcBoxItem(string text) : this(text, -1, "") { }

public ItcBoxItem() : this("", -1, "") { }

public override string ToString()

{

return text;

}

}

private ToolTip cbTip = new ToolTip();//ToolTip类表示一个长方形的小弹出窗口,该窗口在用户将指针悬停在一个控件上时显示有关该控件用途的简短说明。

private ImageList sourceImageList = null;//提供管理 Image 对象集合的方法。通常由其他控件使用。其他控件能够在需要时使用这些图像。

private ArrayList imageArrayList = null;//使用大小可按需动态增加的数组实现IList接口。

public ImageList SourceImageList

{

get { return sourceImageList; }

set { sourceImageList = value; }

public void AddImageToFileImageList(string imageFile)//从指定的路径创建Image。

{

if (imageArrayList == null)

imageArrayList = new ArrayList();初始化ArrayList 类的新实例,该实例为空并且具有默认初始容量。

Image image = Image.FromFile(imageFile);// 从指定的路径创建Image。

imageArrayList.Add(image);

}

protected override void OnDrawItem(DrawItemEventArgs e)//该事件由所有者描述的 ComboBox 使用。可以使用该事件来执行在 ComboBox 中绘制项所需的任务。如果具有大小可变的项(当ComboBox.DrawMode 属性设置为System.Windows.Forms.DrawMode的OwnerDrawVariable 值时),在绘制项前,会引发MeasureItem事件。可以为 MeasureItem 事件创建事件处理程序,以在 DrawItem 事件的事件处理程序中指定要绘制的项的大小。

{

e.DrawBackground();

e.DrawFocusRectangle();

ItcBoxItem item;

Rectangle bounds = e.Bounds;//组合框的矩形区域

int fontHeight = e.Font.Height;//字体的高度

int textStartPosition = bounds.Top + (Bounds.Height-fontHeight)/2;字体居中显示

try

{

item = (ItcBoxItem)Items[e.Index];

Size imageSize = new Size(0, 0);//图像的大小,以像素为单位,初始化大小为0,0。

if (sourceImageList != null) //如果图像列表中有图像

imageSize = sourceImageList.ImageSize;//获取和设置图像列表中图像的大小。

else if (imageArrayList[item.ImageIndex] != null)//从文件中添加的图像,放入imageArrayList 数组中。

{

Image image = (Image)imageArrayList[item.ImageIndex];

imageSize = image.Size;

}

else { }

if (item.ImageIndex != -1)

{

if (sourceImageList != null)

sourceImageList.Draw(e.Graphics, bounds.Left, bounds.Top, item.ImageIndex);//在组合框上指定的位置画图。

else

{

Image image = (Image)imageArrayList[item.ImageIndex];

e.Graphics.DrawImage(image, bounds.Left, bounds.Top);//在指定的位置使用原始物理大小绘制指定的image。

}

e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor), bounds.Left, textStartPosition);//在组合框中写入文本

}

else

{

e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor), bounds.Left, textStartPosition);

}

}

catch

{

if (e.Index != -1)

{

e.Graphics.DrawString(Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), bounds.Left, textStartPosition);

}

else { }

}

base.OnDrawItem(e);//被重载的基类方法,确保完成组合框的基本功能。

}

protected override void OnMeasureItem(MeasureItemEventArgs e) //MeasureItem事件。可以为MeasureItem 事件创建事件处理程序,以在 DrawItem 事件的事件处理程序中指定要绘制的项的大小。

{

try

{

ItcBoxItem item = (ItcBoxItem)Items[e.Index];

if ((sourceImageList != null) && (item.ImageIndex != -1))

e.ItemHeight = sourceImageList.ImageSize.Height;

else if (imageArrayList[item.ImageIndex] != null)

e.ItemHeight = ((Image)imageArrayList[item.ImageIndex]).Height;

else e.ItemHeight = this.Font.Height;

}

catch

{

e.ItemHeight = this.FontHeight;

}

}

protected override void OnSelectedIndexChanged(EventArgs e) //改变组合框的提示信息

{

int index = SelectedIndex;

if (index < 0) return;

ItcBoxItem item = (ItcBoxItem)Items[index];

if (item.Tip != "")

{

cbTip.Active = true;

cbTip.SetToolTip(this, item.Tip);//使工具提示文本与指定的控件相关联。

}

else

}

}

}

将这些代码生成一下。会在debug文件夹下形成dll文件。

使用带图像和提示的组合框:

新建windowa应用程序,将上面dll文件添加到工具箱上,工具箱右击,选项,.net框架组件。浏览。

拖三个刚才添加如工具箱的组件名字为(imageTipComboBox16,imageTipComboBox32,imageTipComboBoxAny),还有两个imagelist控件,名字为(imageList16,imageList32),在其上添加几副图片。分别于imageTipComboBox16,imageTipComboBox32关联。imageTipComboBox16属性中的sourcei

mageList=imagelist16.

代码如下:

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

imageTipComboBox16.Items.Add(new ImageTipComboBox.ImageTipComboBox.ItcBoxItem(" first", 0,"第二项,带粘贴的图像"));

imageTipComboBox16.Items.Add(new ImageTipComboBox.ImageTipComboBox.ItcBoxItem(" second", 1));

imageTipComboBox32.Items.Add(new ImageTipComboBox.ImageTipComboBox.ItcBoxItem(" first", 0));

imageTipComboBox32.Items.Add(new ImageTipComboBox.ImageTipComboBox.ItcBoxItem(" second", 1));

imageTipComboBoxAny.AddImageToFileImageList("F:\\Program

Files\\Tencent\\QQ\\QQDialSkin\\default\\bar_botton_nor.bmp");

imageTipComboBoxAny.AddImageToFileImageList("F:\\Program

Files\\Tencent\\QQ\\QQDialSkin\\default\\bg03.bmp");

imageTipComboBoxAny.Items.Add(new ImageTipComboBox.ImageTipComboBox.ItcBoxItem(" first", 0));

imageTipComboBoxAny.Items.Add(new ImageTipComboBox.ImageTipComboBox.ItcBoxItem(" second", 1,"第二项,带粘贴的图像"));

imageTipComboBox16.SelectedIndex = 0;

imageTipComboBox32.SelectedIndex = 1;

imageTipComboBoxAny.SelectedIndex = 0;

}

}程序运行界面如下:

https://www.360docs.net/doc/1014074212.html,框架下DES加密/解密程序的实现

下图为程序运行的界面:

如下为完整的程序:

using System;

using System.IO;

using System.Collections;

using https://www.360docs.net/doc/1014074212.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Security.Cryptography;

using System.Windows.Forms;

namespace des

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private static byte[] DESKey = new byte[] { 11, 23, 93, 102, 72, 41, 18, 12 };//加密解密密钥,des 中要求64位,每一组的第八位为奇偶校验位。

private static byte[] DESIv = new byte[] { 75, 58, 46, 97, 78, 57, 17, 36 };//初始化向量对数据执行加密转换。

public static string Encode(string Encode_String)//加密算法

{

DESCryptoServiceProvider objDES = new DESCryptoServiceProvider();//定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象。此算法支持长度为 64 位的密钥

MemoryStream objMemoryStream = new MemoryStream();//M emoryStream 类创建这样的流,该流以内存而不是磁盘或网络连接作为支持存储区。MemoryStream 封装以无符号字节数组形式存储的数据,该数组在创建MemoryStream 对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这些封装的数据。内存流可降低应用程序中对临时缓冲区和临时文件的需要。

CryptoStream objCryptoStream = new

CryptoStream( objMemoryStream,objDES.CreateEncryptor(DESKey,DESIv),CryptoStreamMode.Write);

//Crytostream类定义将数据流链接到加密转换的流。公共语言运行库使用面向流的设计进行加密。该设计的核心是CryptoStream。objMemoryStream是指对其执行加密转换的流。objDES.CreateEncryptor(DESKey,DESIv)对流进行的加密转换。CryptoStreamMode.Write对加密流写操作。

StreamWriter objStreamWriter = new StreamWriter(objCryptoStream);//streamwriter是实现一个TextWriter,使其以一种特定的编码向流中写入字符。用 UTF-8 编码及默认缓冲区大小,为指定的流初始化 StreamWriter 类的一个新实例。

objStreamWriter.Write(Encode_String); // Encode_String要写入流的字符串。如果为空,则不写入任何内容。

objStreamWriter.Flush();//清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流。

objCrypt oStream.FlushFinalBlock();//用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。 objMemoryStream.Flush();//重写 Stream.Flush 以便不执行任何操作

return Convert.ToBase64String(objMemoryStream.GetBuffer(),0,(int)objMemoryStream.Length);

}//将 8 位无符号整数数组的子集转换为其等效的、用以 64 为基的数字编码的 String 表示形式。参数将子集指定为输入数组中的偏移量和数组中要转换的元素数。

public static string Decode(string Encode_String)//解密算法

{

DESCryptoServicePro vider objDES = new DESCryptoServiceProvider();

byte[] Input = Convert.FromBase64String(Encode_String);

MemoryStr eam objMemoryStream = new MemorySt ream(Input);// 从中创建当前流的无符号字节数组。

CryptoStream objCryptoStream = new CryptoStream(objMemoryStream, objDES.CreateDecryptor(DESKey, DESIv), CryptoStreamMode.Read);

StreamReader objStreamReader = new StreamReader(objCryptoStream);

return objStreamReader.ReadToEnd();

}

private void button1_Click(object sender, EventArgs e)//加密按钮

{

try

{

string temp = textBox1.Text;

textBox2.Text = Encode(temp);

}

catch (System.Exception ee)

{

MessageBox.Show(ee.Message);

}

private void button2_Click(object sender, EventArgs e)//解密按钮

{

textBox3.Text = Decode(textBox2.Text);

}

}

}

5 用C#利用word

常识:c#中是不能直接使用com组件的,因为com组件是非受托管代码文件。经过通用语言运行时编译C#文件使用的类库是受管代码文件,要在C#中使用com组件要进行转换。用tlbimp.exe文件。

在本例是通过添加引用来利用的,添加引用如图所示:倘若对excel ppt操作添加相应得组件即可;

完整的代码如下:本例包括打开,书写,保存,命名;

using System;

using System.Reflection;

using System.Runtime.InteropServices;

using Microsoft.Office.Interop.Word;

namespace AutoWord

{

class Program

{

public static void Main()

{

Application Wordapp = new Application();

Wordapp.Visible = true; //打开word,但没有文档。

Microsoft.Office.Interop.Word._Document aDoc;

object filename = "c:\\zl.doc";//文档的存储路径;

object missing = System.Reflection.Missing.Value;

object readOnly = false;

object isVisible = true;

//object filename1 = "l.doc";

try

{

aDoc = Wordapp.Documents.Open(ref filename, ref missing, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,ref missing);

aDoc.Activate(); //打开word指定的文档;open有16个参数

string q = "azaazzzzzzzzzzzzzzzzzzzza";//要向文档中书写的文本;

Wordapp.Selection.TypeText(q);//写入文本

Wordapp.Selection.TypeParagraph();//将文本显示出来

Wordapp.Selection.Document.SaveAs(ref filename, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);//保存;

aDoc.Close( ref missing, ref missing, ref missing);//关闭

Wordapp.Quit( ref missing, ref missing, ref missing);

}

catch

{}

}}}

6 visual C#文件编程之分割合并文件

6.1对文件的分割

对文件的操作主要是对三个类要熟悉;filestream,binaryreder,binarywriter;

对文件分割程序的运行界面如下:

界面上用到的控件有:一个openfiledialog组件用于选择要分割的大文件。

一个progressBar组件,用于显示文件分割的进度。

一个combobox组件用于选择文件分割的大小。2个textbox组件。4个label组件。2个button组件。

完整的代码如下:

using System;

using System.Collections;//System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。

using https://www.360docs.net/doc/1014074212.html,ponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Text;

using System.Windows.Forms;

using System.Data.OleDb;

namespace filefg

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)//选择要分割的大文件,用openfiledialog;

{

DialogResult drTemp = openFileDialog1.ShowDialog();//获取或设置一个值,该值在单击按钮时返回给父窗体

if (drTemp == DialogResult.OK && openFileDialog1.FileName != string.Empty)

{

textBox1.Text = openFileDialog1.FileName;//textbox1显示要分割文件的完整路径

button2.Enabled = true;

}

}

private void button2_Click(object sender, EventArgs e)//执行分割的按钮本例的核心;

{

int iFileSize = Int32.Parse(comboBox1.Text) * 1024;//32位的文件的字节数(分割后小文件的大小)

if (Directory.Exists(textBox2.Text))//分割后小文件的存放目录若存在

{

string[] str = Directory.GetFiles(textBox2.Text);

foreach (string str1 in str)

File.Delete(str1);//则将目录内的所有文件删除;

}

else

Directory.CreateDirectory(textBox2.Text);//否则新建;

FileStream SplitFileStream = new FileStream(textBox1.Text,FileMode.Open);//使用指定的路径和创建模式初始化 FileStream 类的新实例。Filemode.open打开现有文件。

BinaryReader SplitFileReader = new BinaryReader(SplitFileStream);

byte[] TempBytes;

int iFileCount = (int)(SplitFileStream.Length / iFileSize);//分解为小文件的个数(文件流的长度/每个小文件的长度(字节));

progressBar1.Maximum = iFileCount;//将此值赋给进度条。

string[] TempExtra = textBox1.Text.Split('.');

for (int i = 1; i <= iFileCount; i++)

{

string sTempFileName = textBox2.Text + @"\" + i.ToString().PadLeft(4, '0') + "." + TempExtra[TempExtra.Length - 1];//小文件保存的完整路径。i.ToString().PadLeft(4, '0')名称长度为4个字节,不足在左边补零。TempExtra[TempExtra.Length - 1]返回文件的后缀;

FileStream TempStream = new FileStream(sTempFileName,FileMode.OpenOrCreate);

BinaryWriter TempWriter = new BinaryWriter(TempStream);

TempBytes = SplitFileReader.ReadBytes(iFileSize);//从(要分割的文件)流文件中读取定长字节赋给tempBytes。

TempWriter.Write(TempBytes);//写入文件。

TempWriter.Close();

TempStream.Close();

progressBar1.Value = i;

}

SplitFileReader.Close();

SplitFileStream.Close();

MessageBox.Show("分割成功!");

progressBar1.Value = 0;

}

}

}

6.2合并文件

如下图所示:

组件与分割时基本相同;

完整代码如下:

using System;

using System.Collections;

using https://www.360docs.net/doc/1014074212.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Data.OleDb;

using System.Data;

namespace fileimerge

{

{

public Form1()

{

InitializeComponent();

}

public string sDirectoryName = "";//定义一个全局变量用于存放合并文件所在的目录

private void button1_Click(object sender, EventArgs e)

{

openFileDialog1.Title = "请选择要合并的第一个文件";

DialogResult drTemp = openFileDialog1.ShowDialog();

if (drTemp == DialogResult.OK && openFileDialog1.FileName != "")

{

textBox1.Text = openFileDialog1.FileName;

}

string[] path = openFileDialog1.FileName.Split(@"\".ToCharArray());

string sTemp = "";

int i = 0;

for (i = 0; i < path.Length - 1; i++)

{

sTemp = sTemp + path[i] + @"\";

}//此句的作用是获得分割后小文件的存放目录;因为textBox1.Text中是指的文件名称

sDirectoryName = sTemp;//将目录名称赋给全局变量

}

private void button2_Click(object sender, EventArgs e)

{

string[] arrFileName = Directory.GetFiles(sDirectoryName);//获取目录下所有的要合并的小文件。

int iSumFile = arrFileName.Length;//要合并的文件个数;

progressBar1.Maximum = iSumFile;

FileStream AddStream = new FileStream(textBox2.Text,FileMode.OpenOrCreate);//以流的方式创建文件。

BinaryWriter AddWriter = new BinaryWriter(AddStream);

for (int i = 0; i < iSumFile; i++)

{

FileStream TempStream = new FileStream(arrFileName[i],FileMode.Open);

BinaryReader TempReader=new BinaryReader(TempStream);

AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length));

TempReader.Close();

TempStream.Close();

progressBar1.Value = i+1;

}

AddWriter.Close();

AddStream.Close();

MessageBox.Show("成功合并!");

progressBar1.Value = 0;

}

}

}

7 Visual C#套接字编程

1 利用socket发送数据

一个statusbar控件两个textbox控件一个listbox控件两个button控件两个label控件

完整代码与注释如下:

using System;

using System.Collections;

using https://www.360docs.net/doc/1014074212.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using https://www.360docs.net/doc/1014074212.html,.Sockets; //socket用到的命名空间

using https://www.360docs.net/doc/1014074212.html,;

namespace socketsendata

{

public partial class Form1 : Form

{

int port = 8000; //定义侦听的端口号;

// private TcpClient tcpc;//对服务器端创建TCP连接;tcpclient类为TCP 网络服务提供客户端连接。

//提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据

private Socket stSend;//创建发送数据套接字

private bool tcpConnect = false;//定义标示符用以表示Tcp是否建立;

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

try

{

stSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//addressFamily 参数指定Socket 类使用的寻址方案,

//socketType 参数指定Socket 类的类型,protocolType 参数指定Socket 使用的协议。

//这三个参数不是独立的。有些地址族会限制哪些协议可与其一起使用,同时Socket 类型在协议中通常是隐式的。

//如果地址族、Socket 类型和协议类型的组合导致无效的Socket,则此构造函数将引发SocketException。

//InterNetwork 指示当Socket 连接到结束点时,需要一个IP 版本4 地址。

//stream支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。此类型的Socket 与单个对方主机进行通信,

//并且在通信开始之前需要远程主机连接。Stream 使用传输控制协议(Tcp) ProtocolType 和InterNetworkAddressFamily

//IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和本地或远程端口信息。通过组合服务的主机IP 地址和端口号,

//IPEndPoint 类形成到服务的连接点。port与address 关联的端口号,或为0 以指定任何可用的端口。port 以主机顺序排号。

EndPoint epTemp = (EndPoint)tempRemoteIP;

//EndPoint 类提供了一个表示网络资源或服务的abstract 基类。子类组合网络连接信息以构成服务的连接点。

stSend.Connect(epTemp);

//建立与远程主机的连接。EndPoint epTemp表示远程设备。

statusBar1.Text = "成功连接远程计算机!";

tcpConnect = true;//表示成功建立连接

}

catch (Exception)

{

statusBar1.Text = "目标计算机拒绝连接请求!";

}

}

private void button2_Click(object sender, EventArgs e)

{

int iLength = textBox2.Text.Length;

byte[] bySend = new byte[iLength];

bySend = System.Text.Encoding.Default.GetBytes(textBox2.Text);//将一组字符编码为一个字节序列。

int i = stSend.Send(bySend);//将数据发送到连接的socket;返回值是已发送的字节数

listBox1.Items.Add(textBox2.Text);//将发送的内容显示在listbox1中。

}

}

}

手动回收资源代码:

protected override void Dispose(bool disposing)

{

if (tcpConnect)

{

byte[] bysend = new byte[4];

bysend = System.Text.Encoding.Default.GetBytes("STOP");//倘若发送了STOP

int i = stSend.Send(bysend);

stSend.Close();//则将socket关闭。

}

if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}

2 利用socket接收数据:

界面如下:

using System;

using System.Collections.Generic;

using https://www.360docs.net/doc/1014074212.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using https://www.360docs.net/doc/1014074212.html,.Sockets;//使用tcplisten类

using https://www.360docs.net/doc/1014074212.html,;

using System.Threading;//使用到线程

namespace socketrecdata

{

public partial class Form1 : Form

{

int port = 8000;//定义侦听端口号

private Thread thThreadRead;//创建线程,用以侦听端口号,接收信息。

private TcpListener tlTcpListen;

private bool blistener = true;//设定标示位,判断侦听状态

private Socket stRead;

delegate void statusbardeleg(string text);//定义委托,线程中改变窗体控件的状态用到。

delegate void listboxdeleg(string text);

public Form1()

{

InitializeComponent();

}

public void listen()//定义了listen过程,用其初始化线程。

{

try

{

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];

//获取本地机的ip地址。

tlTcpListen = new TcpListener(ipAddress, port);

//TcpListener该类在指定的本地IP 地址和端口号上侦听是否有传入的连接尝试。

tlTcpListen.Start();//开始侦听

string str1 = "正在侦听.....";

this.setText(str1);//状态栏显示文本

stRead = tlTcpListen.AcceptSocket();

//AcceptSocket 是一个阻止方法,该方法返回可用于发送和接收数据的Socket。如果希望避免阻止,

//请使用Pending 方法来确定传入连接队列中的连接请求是否可用。返回的Socket 是使用远程主机的

// IP 地址和端口号初始化的。您可以使用Socket 类中任何可用的Send 和Receive 方法与远程主机进行通信。

//使用Socket 后,请确保调用其Close 方法。如果应用程序相对简单,请考虑使用AcceptTcpClient

//方法代替AcceptSocket 方法。TcpClient 提供了一些通过网络在阻止同步模式下发送和接收数据的简单方法。

EndPoint tempRemoteEP = stRead.RemoteEndPoint;

//如果您使用的是面向连接的协议,则RemoteEndPoint 属性将获取包含Socket 连接到的远程IP 地址和端口号

//的EndPoint。而如果当前使用的是无连接的协议,则RemoteEndPoint 包含将要和Socket 通信的默认远程IP

//IPEndPoint.Address 方法来检索远程IPAddress,调用IPEndPoint.Port 方法来检索远程端口号。

IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;

IPHostEntry host = Dns.GetHostEntry(tempRemoteIP.Address);

//IPHostEntry 类将一个域名系统(DNS) 主机名与一组别名和一组匹配的IP 地址关联。

//IPHostEntry 类作为Helper 类和Dns 类一起使用。

string sHostName = host.HostName;

string str2 = "已经建立连接";

this.setText(str2);//线程中改变控件的状态。

while (blistener) //侦听到端口消息

{

string sTime =

DateTime.Now.ToShortDateString()+"--"+DateTime.Now.ToShortTimeString();

//当前时间形式为年月日--时间。

byte[] byRead = new byte[80];

int iRead = stRead.ReceiveFrom(byRead, ref tempRemoteEP);

//Socket.ReceiveFrom 方法(Byte[], EndPoint)将数据报接收到数据缓冲区并存储终结点。

//参数buffer:Byte 类型的数组,它是存储接收到的数据的位置。

//remoteEP按引用传递的EndPoint,表示远程服务器。返回值接收到的字节数。

byte[] byText = new byte[iRead];

Array.Copy(byRead, 0, byText, 0, iRead);

string sTemp = Encoding.Default.GetString(byText);//将字节数组解码为字符串。

if (sTemp.Trim() == "STOP")

{

stRead.Close();

tlTcpListen.Stop();

string str3= "连接已经关闭";

this.setText(str3);

thThreadRead.Abort();

return;

}

else

setText1(sTime + "" + sTemp);//将时间和传过来来的数据显示在listbox中

}

}

catch (System.Security.SecurityException)

{

MessageBox.Show("侦听失败!", "错误");

}

}

比较有用的一点:

//倘若要在线程中改变以各控件(本控件不是在此线程中定义的)的状态,如状态栏或文本框的显示的步骤如下

//1.定义委托delegate void statusbardeleg(string text);

//2.将显示在控件的文本赋给一个字符串变量,然后调用自己写的赋值函数。在过程内的。

//过程是指初始化线程的过程如本例中的listen!

//如string str1 = "正在侦听.....";

//this.setText(str1);

//3.独立于过程的,在过程外的,编写自己的赋值函数。步骤如下大同小异!

//public void setText(string text)

// if (this.statusBar1.InvokeRequired)

// {

// statusbardeleg d = new statusbardeleg(setText);

// this.Invoke(d, new object[] { text });

// }

// else

// {

// statusBar1.Text = text;

// }

//}

public void setText(string text)

{

if (this.statusBar1.InvokeRequired)

{

statusbardeleg d = new statusbardeleg(setText);

this.Invoke(d, new object[] { text });

}

else

{

statusBar1.Text = text;

}

}

public void setText1(string text)

{

if (this.listBox1.InvokeRequired)

{

listboxdeleg d = new listboxdeleg(setText1);

this.Invoke(d, new object[] { text });

}

else

{

listBox1.Items.Add(text);

}

}

private void button1_Click(object sender, EventArgs e)

{

thThreadRead = new Thread(new ThreadStart(listen));//用过程listen初始化线程 thThreadRead.Start();

}

}

}

程序的运行情况界面:

8 利用c#对操作表进行操作

要访问注册表,可以使用Microsoft.win32命名空间中的两个类:registry和registrykey。Registrykey实例表示一个注册表项,这个类的方法可以浏览子健,创建新键,读取或修改健中的值。该类可以完成对注册表项进行的所有操作(除了设置键的安全级别之外)registrykey类可以用于完成对注册表的所有操作。Registry是不能实例化的一个类。他的作用只是提供表示顶级键的registrykey实例,以便开始在注册表中浏览。Registry是通过静态属性来提供这些实例的,这些属性是:

Currentuser存储有关用户首选项的信息。

Localmachine存储本地计算机的配置信息

Classesroot存储有关类型及其属性的信息

User存储有关默认用户配置的信息

Performancedata存储软件组件的性能信息

Currentconfig存储非用户特定的硬件信息

Dyndata存储动态数据

例1 看如下实例:下例的主要功能是为窗体选择背景颜色,在关闭窗体时会将窗体的大小,位置,背景色从注册表中保存,在下次打开窗体时将恢复到上次窗体关闭前的状态。将注册表内的信息读出并显示在listbox中程序界面如下:

完整代码如下:

using System;

using System.Collections.Generic;

using https://www.360docs.net/doc/1014074212.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using Microsoft.Win32;//命名空间提供操作系统注册表的类

namespace regedit

{

public partial class Form1 : Form

{

private ColorDialog chooseColorDialog = new ColorDialog();//颜色对话卡类并实例化

public Form1()

{

InitializeComponent();

try

{

if(ReadSetting() == false)//倘若readsetting返回false,说明注册表中没有相应的键值,在程序第一次运行时

//会出现这种情况。

listBox1.Items.Add("初始状态,这册表中没有相关信息!");

else

listBox1.Items.Add("从注册表中读取消息");

StartPosition = FormStartPosition.Manual;//指定窗体在运行时的位置。FormStartPosition是枚举类型。manual

//窗体的位置由Location 属性确定。

}

catch (Exception e)

{

listBox1.Items.Add("在读取注册表时出现问题:");

listBox1.Items.Add(e.Message);

}

}

bool ReadSetting()

{

RegistryKey softwarekey = Registry.LocalMachine.OpenSubKey("SOFTWARE");//打开localmachine下的software子键

RegistryKey zzykey = softwarekey.OpenSubKey("zzyregedit");//打开software下的zzyregedit子键,希望对打开的主键

//写操作,使用下面的方法并将writable参数设为true:public registrykey opensubkey(string name,bool wretable);

//若要打开远程机器上的注册表方法为public static registrykey openremotebasekey(registryhive hkey,string machinename );

if (zzykey == null)

return false;//若不存在返回false

RegistryKey test_regedit = zzykey.OpenSubKey("test_regedit");

if (test_regedit == null)

return false;

else

listBox1.Items.Add("读取注册表位置:" + test_regedit.ToString());

int redcom = (int)test_regedit.GetValue("red");//取键red的键值,并将其整型化。

int greencom = (int)test_regedit.GetValue("green");

int bluecom = (int)test_regedit.GetValue("blue");

this.BackColor = Color.FromArgb(redcom, greencom, bluecom);

//从指定的8 位颜色值(红色、绿色和蓝色)创建Color 结构。

c语言公共基础知识

二级公共基础知识总结 第一章数据结构与算法 1.1 算法算法:是指解题方案的准确而完整的描述。算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。特征包括: (1)可行性; (2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性; (3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义; (4)拥有足够的情报。算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。指令系统:一个计算机系统能执行的所有指令的集合。基本运算包括:算术运算、逻辑运算、关系运算、数据传输。算法的控制结构:顺序结构、选择结构、循环结构。算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。算法复杂度:算法时间复杂度和算法空间复杂度。算法时间复杂度是指执行算法所需要的计算工作量。算法空间复杂度是指执行这个算法所需要的内存空间。 1.2 数据结构的基本基本概念数据结构研究的三个方面: (1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构;

(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构; (3)对各种数据结构进行的运算。数据结构是指相互有关联的数据元素的集合。数据的逻辑结构包含:(1)表示数据元素的信息;(2)表示各数据元素之间的前后件关系。数据的存储结构有顺序、链接、索引等。线性结构条件:(1)有且只有一个根结点;(2)每一个结点最多有一个前件,也最多有一个后件。非线性结构:不满足线性结构条件的数据结构。 1.3 线性表及其顺序存储结构线性表是由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。在复杂线性表中,由若干项数据元素组成的数据元素称为记录,而由多个记录构成的线性表又称为文件。非空线性表的结构特征:(1)且只有一个根结点a1,它无前件; (2)有且只有一个终端结点an,它无后件; (3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。结点个数n称为线性表的长度,当n=0时,称为空表。线性表的顺序存储结构具有以下两个基本特点:(1)线性表中所有元素的所占的存储空间是连续的;(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,,ADR(a1)为第一个元素的地址,k代表每个元素占的字节数。顺序表的运算:插入、删除。 (4)1.4 栈和队列栈是限定在一端进行插入与删除的线性表,允许

c语言基础知识及考点整理

第一周 int定义整型变量所有字母都要先定义再使用。 算法:描述完成任务的步骤序列。 算法的三个基本结构:顺序、分支、循环。 算法的表示:自然语言、程序流图、N-S图 程序流图中判定框用菱形,开始结束用圆角矩形,赋值用矩形。 main:主函数,后面一定是英文输入法下的() int:定义“整形变量” printf:输出语句 scanf:输入语句 %:占位符一个占位符就是占据一个字符的位置,格式化输出时显示为个空格. 具体用法如下: %a,%A 读入一个浮点值(仅C99有效) %c 读入一个字符 %d 读入十进制整数 %i 读入十进制,八进制,十六进制整数 %o 读入八进制整数%x,%X 读入十六进制整数 %s 读入一个字符串,遇空格、制表符或换行符结束。 %f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。 %p 读入一个指针 %u 读入一个无符号十进制整数 %n 至此已读入值的等价字符数 %[] 扫描字符集合

%% 读%符号(c此内容来自baidu) &:“取地址”运算符:这个运算发可以这样理解,比如说&a的含义就是a在内存中的地址。因为&运算符能够取出一个变量在内存中的地址,所以叫做取地址运算符。 输入语句scanf("%d %d",&a,&b); 输出语句printf("%d", c); 输出内容由“”引出 注意一个;就是一个语句,每句话后都要有分号,不能丢。括号是英文的, 一个程序主要由顺序分支循环3种结构构成 { }不能忘,限制变量作用范围 进入CodeBlocks之后新建一个项目,在project选项中选择控制台应用程序Console application进行编写。 输入语句scanf和输出语句printf中的“f”指的是format格式。 程序编写完成后点击Build——Build and run 或F9进行运行,并可点击View——log看到编程日志,检查错误。 分号;不能少 .如果觉得编写过程中字符显示太小可以按住ctrl并将鼠标滚轮向下滚来放大~ 第二周 计算一元二次方程的根的题目中,遵守四则运算法则,求根公式.../2a中的2a要用()括起来 华氏温标(Fahrenheit temperature scale)符号℉,1724年,德国人华伦海特制定了华氏温标,他把一定浓度的盐水凝固时的温度定为0℉,把纯水凝固时的温度定为32 ℉,把标准大气压下水沸腾的温度定为212℉,中间分为180等份,每一等份代表1度,这就是华氏温标,用符号F表示,这就是华氏温度 摄氏温度(℃)和华氏温度(℉)之间的换算关系为: 华氏度(℉)=32+摄氏度(℃)×,摄氏度(℃)=(华氏度(℉)-32)÷。

C语言基础知识整理

C 语言基础知识 1. 每个C 程序有且只有一个主函数main() ,且程序必须从main() 函数开始执行,并在main() 函数中结束。 2. 在C语言中,用e来表示科学计数法时,规定在e的前面必须有数字,后面必须为整数。 3. 用单引号括起来的一个字符常量只能存放一个字符;C 语言中没有字符串变量,只能用字符数组来存储字符串。 4. 外部变量在编译时由系统分配永久的内存空间,所以外部变量的类型不是自动存储类别。 5. 在一个函数内的复合语句中定义的变量,只能在这个复合语句范围内有效。 6. 用sizeof(int) 计算int 类型数据的字节数。 7. C语言运行时,首先系统检查语法的正误,再运行程序的语法;C语言中,可以在一个函数中嵌套一个函数,但是不能在一个函数中定义一个函数;只有在函数外部定义的函数才是外部函数;C语言的子程序有过程和函数两种。 8. 预处理命令行的位置没有规定,只是习惯放在前面;在源文件中的可以有多条预处理命令,但一行只能写一条;宏名的大写只是习惯性的表示;宏替换不仅不占用运行时间还不分配内存空 间。 9. feo f函数的作用是检查文件是否结束,当结束时返回的值为非零,否则为零。 10. 当定义了数组后,在给其赋值时,不能直接把字符串赋给数组名。 11. 在赋值表达式中,赋值运算符"=”右侧不能为表达式;在求余运算符中的两侧都必须为整型;在强制类型转换时,类型名应用括号括起来。 12. 静态局部变量,只有当程序结束后,其值才释放。 13. 当调用函数时,实参是一个数组名,则向函数传送的是数组每一个元素的地址。 14. 算法的特点为有零个或多个输入,有一个或多个输出,当相同的输入时,其结果相同;算法 正确的程序最终一定会结束。15. 在 C 语言中,预处理命令行都以“#”开头;当需要时才用 #include; 预处理的作用就是实现宏定义和条件编译。16. 当数组元素的下标超出了定义 的下标范围时,系统不给出“下标越界”的字样,而是得出错误的答案,因此在编程时务必检查下标是否越界。 17. 共用体变量不能作为函数的参数,也不能使函数带回共用体变量。 18. 指向函数的指针变量的定义形式为:数据类型(* 指针变量)();,因此其为指向函数的 指针变量。 19. 用C 语言编写的代码程序是源程序,只有通过编译、连接才能进行。 20. 在说明为static 时,其生存期得到延长,而其作用域并没有改变,在定义后系统会自动帮它赋值为0,static 为关键字不能被用作它用。 21. 频繁地使用空语句会降低程序的可读性和运算速度。22. 运算符%两边都应是整数,赋值语 句左边应该是变量,而非表达式,强制转换语句强制类型应加括号。 23. 在逻辑运算符中,其两侧的运算符对象为任意合法的表达式即可。 24. 函数fread (&larray,2,16,fp)的功能是,从fp所指的数据文件中读取16次2字节的数据 存储到数组larray中。25.整个流式文件也可以随机存取数据,C语言文件中有好多函数可以达 到写入数据时,未经输入数据,达到不覆盖的目的,在进行写操作时,系统会自动关闭文件。 26. 使用putchar、getchat、puts、gets、printf、seanf函数时,必须在程序的开头岀现包含头文件 #inelude "stdio.h ”的命令行,而使用字符串处理函数时,必须在程序的开头岀现包含头文件 #include”string.h ”命令行,而使用数学函数时,必须在程序的开头岀现包含头文件#include”math.h” 的命令行。 27. 一个斜杠与小于等于127 任意数字按一个字符计算,一个斜杠与任意一个字符按一个字符计 28. 一个C 程序可以有一个或多个程序文件,也可以有一个或多个函数,所以一个C 语言程序可以实现

C语言基础知识归纳

C语言基础知识 1.每个C程序有且只有一个主函数main(),且程序必须从main() 函数开始执行,并在main()函数中结束。 2.在C语言中,用e来表示科学计数法时,规定在e的前面必 须有数字,后面必须为整数。 3.用单引号括起来的一个字符常量只能存放一个字符;C语言中 没有字符串变量,只能用字符数组来存储字符串。 4.外部变量在编译时由系统分配永久的内存空间,所以外部变 量的类型不是自动存储类别。 5.在一个函数内的复合语句中定义的变量,只能在这个复合语 句范围内有效。 6.用sizeof(int)计算int类型数据的字节数。 7.C语言运行时,首先系统检查语法的正误,再运行程序的语法; C语言中,可以在一个函数中嵌套一个函数,但是不能在一个函数中定义一个函数;只有在函数外部定义的函数才是外部函数;C语言的子程序有过程和函数两种。 8.预处理命令行的位置没有规定,只是习惯放在前面;在源文 件中的可以有多条预处理命令,但一行只能写一条;宏名的大写只是习惯性的表示;宏替换不仅不占用运行时间还不分配内存空间。 9.feof函数的作用是检查文件是否结束,当结束时返回的 值为非零,否则为零。

10.当定义了数组后,在给其赋值时,不能直接把字符串赋给数 组名。 11.在赋值表达式中,赋值运算符“=”右侧不能为表达式;在 求余运算符中的两侧都必须为整型;在强制类型转换时,类型名应用括号括起来。 12.静态局部变量,只有当程序结束后,其值才释放。 13.当调用函数时,实参是一个数组名,则向函数传送的是数组 每一个元素的地址。 14.算法的特点为有零个或多个输入,有一个或多个输出,当相 同的输入时,其结果相同;算法正确的程序最终一定会结束。 15.在C语言中,预处理命令行都以“#”开头;当需要时才用 #include;预处理的作用就是实现宏定义和条件编译。 16.当数组元素的下标超出了定义的下标范围时,系统不给出“下 标越界”的字样,而是得出错误的答案,因此在编程时务必检查下标是否越界。 17.共用体变量不能作为函数的参数,也不能使函数带回共用体 变量。 18.指向函数的指针变量的定义形式为:数据类型(*指针变量) ();,因此其为指向函数的指针变量。 19.用C语言编写的代码程序是源程序,只有通过编译、连接才 能进行。 20.在说明为static时,其生存期得到延长,而其作用域并没有改

C语言最重要的知识点总结

C语言最重要的知识点 总体上必须清楚的: 1)程序结构是三种: 顺序结构、选择结构(分支结构)、循环结构。 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。 3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址. 4)bit是位是指为0 或者1。 byte是指字节, 一个字节 = 八个位. 概念常考到的: 1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。 2、define PI 3.1415926; 这个写法是错误的,一定不能出现分号。 3、每个C语言程序中main函数是有且只有一个。 4、在函数中不可以再定义函数。 5、算法:可以没有输入,但是一定要有输出。 6、break可用于循环结构和switch语句。 7、逗号运算符的级别最低,赋值的级别倒数第二。 第一章C语言的基础知识 第一节、对C语言的基础认识 1、C语言编写的程序称为源程序,又称为编译单位。 2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。 3、一个C语言程序有且只有一个main函数,是程序运行的起点。 4、C语言本身没有输入输出语句,输入输出操作是调用系统提供的输入输出函数来完成的。 第二节、熟悉vc++ 1、VC是软件,用来运行写的C语言程序。 2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c---→.obj---→.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。(常考!) 第三节、标识符 1、标识符(必考内容): 合法的要求是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则是下划线。第一个为数字就错了 2、标识符分为关键字、预定义标识符、用户标识符。 关键字:不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If 是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。 预定义标识符:背诵define scanf printf include。记住预定义标识符可以做为用户标识符。 用户标识符:基本上每年都考,详细请见书上习题。 第四节:进制的转换 十进制转换成二进制、八进制、十六进制。 二进制、八进制、十六进制转换成十进制。 第五节:整数与实数 1)C语言只有八、十、十六进制,没有二进制。但是运行时候,所有的进制都要转换成二进制来进行处理。(考过两次) a、C语言中的八进制规定要以0开头。018的数值是非法的,八进制是没有8的,逢8进1。 b、C语言中的十六进制规定要以0x开头。

学习c语言的必备基础知识.doc

学习C语言的必备基础知识 第一章计算机和数据的存储 第一节了解计算机 很奇怪的一件事,现在的。语言教材,一上来就是变量,表达式,一点也不提计算机原理方面的事,把c语言当作语言,数学来学,只是生硬的列出一些语法规则,学生们难以理解,只好死记硬背,没有把握住本质的东西,也就无法随心所欲,其实c语言是一门非常好学的语言,核心的语法规则是非常少的,而旦都是和计算机息息相关,所以必须要学习好计算机的一些基础,掌握好计算机的基础知识对学习C语言至关重要,对将来其它语言的编程都极其有益,C语言还有一个优点,就是写法非常简洁明了,和c++, java, C#, javascript等语言有着非常相似的书写方式,所以学好C语言,可以轻松的过渡到大量其它编程语言。讲完C以后,将陆续推出java ,C#, C++, javascript, ruby, python等,不过都是在此教程的基础之上进行,所以C语言乃基础之基础,想要学编程,强烈建议从C语言开始。下面开始了解计算机。 按照冯诺依曼的理论,计算机含有5个部分,运算器、控制器、存储器、输入和输出设备。现在我们通常把运算器、控制器和在一起,称为CPU(中央处理器),存储器就是我们说的内存和硬盘,输入设备就是鼠标,键盘等,输出设备主要是显示器、打印机、绘图仪等。 其中CPU和内存最关键,CPU是执行指令的部件,内存是一些连续的存储单元,用来存储指令和数据,每个单元可以存8位二进制数,也称为1个字节,计算机里存储器都是以字节为单位的,在描述网络速度的时候通常以位为单位,大家注意区别。CPU要执行的指令就存在内存里,CPU按照指定顺序连续地执行内存中的指令,这就是冯诺依曼体系的基本工作原理。 什么是指令,就是一些二进制的数,比如10010001是一条加法指令, 10011011是一条存储指令,CPU遇见不同的指令就会完成不同的操作,CPU能够执行的指令是生产厂家生产时就设计好的,比如8086 基本指令有70条,那么CPU就只认识这70条指令,CPU在不断升级, 除了运行速度加快还会增加一些新的指令,CPU的指令分三大类:传

(完整版)谭浩强C语言知识点总结

C语言最重要的知识点 总体上必须清楚的: 1)程序结构是三种:顺序结构、选择结构(分支结构)、循环结构。 2)读程序都要从main()入口,然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。 3)计算机的数据在电脑中保存是以二进制的形式?数据存放的位置就是他的地址? 4)b it是位是指为0或者1。byte 是指字节,一个字节=八个位. 概念常考到的: 1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。 2、define PI 3.1415926; 这个写法是错误的,一定不能出现分号。 3、每个C语言程序中main函数是有且只有一个。 4、在函数中不可以再定义函数。 5、算法:可以没有输入,但是一定要有输出。 6、break可用于循环结构和switch语句。 7、逗号运算符的级别最低,赋值的级别倒数第二。 第一章C语言的基础知识 第一节、对C语言的基础认识 1、C语言编写的程序称为源程序,又称为编译单位。 2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。 3、一个C语言程序有且只有一个main函数,是程序运行的起点。 第二节、熟悉VC++ 1、VC是软件,用来运行写的C语言程序。 2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c--- .obj--- .exe )这 个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。(常考!) 第三节、标识符 1、标识符(必考内容): 合法的要求是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则是下划线。第一个为数字就错了 2、标识符分为关键字、预定义标识符、用户标识符。 关键字:不可以作为用户标识符号。main define sca nf printf 都不是关键字。迷惑 你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。 预定义标识符:背诵defi ne scanf printf in clude 。记住预定义标识符可以做为用户 标识符。 用户标识符:基本上每年都考,详细请见书上习题。 第四节:进制的转换 十进制转换成二进制、八进制、十六进制。 二进制、八进制、十六进制转换成十进制。 第五节:整数与实数 1)C语言只有八、十、十六进制,没有二进制。但是运行时候,所有的进制都要转换成二进制来进行处理。(考过两次) a 、C语言中的八进制规定要以0开头。018的数值是非法的,八进制是没有8的,逢 8进1。

全国计算机等级考试二级c语言公共基础知识总结

全国计算机等级考试二级c语言公共基础知识总结 第一章数据结构与算法 1.1算法 算法:是指解题方案的准确而完整的描述。 算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。 算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。特征包括: (1)可行性; (2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解 释,不允许有多义性; (3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后 终止,包括合理的执行时间的含义; (4)拥有足够的情报。 算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。 指令系统:一个计算机系统能执行的所有指令的集合。 基本运算包括:算术运算、逻辑运算、关系运算、数据传输。 算法的控制结构:顺序结构、选择结构、循环结构。 算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法' 算法复杂度:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所需要的计算工作量。 算法空间复杂度是指执行这个算法所需要的内存空间。 1.2数据结构的基本基本概念 数据结构研究的三个方面: (1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; (2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的 存储结构; (3)对各种数据结构进行的运算。 数据结构是指相互有关联的数据元素的集合。 数据的逻辑结构包含: (1)表示数据元素的信息; (2)表示各数据元素之间的前后件关系。

数据的存储结构有顺序、链接、索引等。 线性结构条件: (1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。 非线性结构:不满足线性结构条件的数据结构。 1.3线性表及其顺序存储结构 线性表是由一组数据元素构成,数据元素的位置只取决于自己的序号,元素 之间的相对位置是线性的。 在复杂线性表中,由若干项数据元素组成的数据元素称为记录,而由多个记 录构成的线性表又称为文件。 非空线性表的结构特征: (1)且只有一个根结点a1,它无前件; (2)有且只有一个终端结点an,它无后件; (3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只 有一个后件。结点个数n称为线性表的长度,当n=0时,称为空表。 线性表的顺序存储结构具有以下两个基本特点: (1)线性表中所有元素的所占的存储空间是连续的; (2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)k, ,ADR(a1)为第一个元素的地 址,k代表每个元素占的字节数。 顺序表的运算:插入、删除。(详见14--16页) 1.4栈和队列 栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈 顶,不允许插入与删除的另一端称为栈底。 栈按照“先进后出” (FILO)或“后进先出”(LIFO)组织数据,栈具有记忆作用。用top表示栈顶位置,用bottom表示栈底。 栈的基本运算:(1)插入元素称为入栈运算;(2)删除元素称为退栈运算; (3)读栈顶元素是将栈顶元素赋给一个指定的变量,此时指针无变化。 队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线 性表。Rear指针指向队尾,front指针指向队头。 队列是“先进行出” (FIFO)或“后进后出”(LILO)的线性表。 队列运算包括(1)入队运算:从队尾插入一个元素;(2)退队运算:从队头删

C语言考试必备基础知识点整理

C语言考试必备基础知识点整理 【考点1】C程序 C语言程序结构有三种: 顺序结构, 循环结构(三个循环结构), 选择结构(if 和switch) 【考点2】main函数 每个C语言程序中main 函数是有且只有一个。读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。 【考点3】存储形式 计算机的数据在电脑中是以二进制的形式保存。最低的存储单元是bit(位),位是由为0 或者1构成。byte 是指字节, 一个字节= 八个位。数据存放的位置就是它的地址。 【考点4】注释 是对程序的说明,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,注释不可以嵌套。 【考点5】书写格式 每条语句的后面必须有一个分号,分号是语句的一部分。一行内可写多条语句,一个语句可写在多行上。 【考点6】标识符 合法的用户标识符考查: 合法的要求是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则是下划线。第一个为数字就错了。 C语言标识符分如下3类 (1)关键字。它们在程序中有固定的含义,不能另作他用。如int、for、switch等。

(2)预定义标识符。预先定义并具有特定含义的标识符。如define、include等。 (3)用户标识符。用户根据需要定义的标识符,符合命名规则且不与关键字相同。 关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If 是可以做为用户标识符。因为If 中的第一个字母大写了,所以不是关键字。 【考点7】实型数据 实型数据的合法形式:小数形式和指数形式。掌握判定指数形式合法性。 2.333e-1 就是合法的,且数据是2.333×10-1。 考试口诀:e 前e 后必有数,e 后必为整数。 【考点8】字符 字符数据的合法形式::(考试考证https://www.360docs.net/doc/1014074212.html,) '1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。 '0' 的ASCII 数值表示为48,'a' 的ASCII 数值是97,'A'的ASCII 数值是65。 字符型和整数是近亲: char a = 65 ; printf(“%c”, a); 得到的输出结果:a printf(“%d”, a); 得到的输出结果:65 一般考试表示单个字符错误的形式:'65' "1" 字符是可以进行算术运算的,记住:'0'-0=48 大写字母和小写字母转换的方法:'A'+32='a' 相互之间一般是相差32。 【考点9】整型数据 整型一般是两个字节, 字符型是一个字节,双精度一般是4 个字节: 考试时候一般会说,在16 位编译系统,或者是32 位系统。碰到这种情况,不要去管,

二级c语言基础知识总结

二级c语言基础知识总结 本份总结由郴州职业技术学院电信(5)141班:侯伟提供! 1.计算机机语言有三类:即机器语言汇编语言高级语言。 2.C语言具有可移植性强语法简洁目标程序代码执行效率高 是面向过程的结构化程序设计!c语言能实现汇编语言的绝大功能因此也被称作“中级语言” 3.C语言目前主要用于单片机产品开发及系统软件和驱动程序开发, 但是因语法定义不严格编写自由度大程序出错率相比同类高级语言高如果想走软件方向的电子专业学生建议以c语言为基础继而学习java c# PHP等! 4.C语言的源文件扩展名为.c 目标文件扩展名。Obj 可执行文件为。 Exe. 5.机器数有原码补码反码三种表现形式进制转换建议重点学 习十六进制转二进制(在单片机里面很实用) 6.标识符字母数字下划线组成。举例:下面是不合法的标识符 3a(不能以数字开头),ab.c(不能包含标点符号)char(不能使用关键字) caa#(标识符必需以字母数字下划线组成) 7.常量:程序执行过程数值不可改变变量:程序运行随表达式改变 的值八进制整数以0开头十六进制以0x开头 8.C语言语句分为顺序结构选择结构(分支结构)循环结构 9.C语言关键字printf(输出信息到屏幕上)以%号开头为格式字符 scant(从键盘输入内容)注意:函数内容里面必须要有取地址符

号& main()主函数一个程序总是从主函数执行到主函数结束c语言中没有输入输出函数只是为了方便编写才定义的。 10.C语言数据类型为基本数据类型构造类型空类型指针类 型 11.Beack跳出当前(不能用于if语句) continue(结束本 次循环不能用于switch语句) return(返回函数值) func(自定义函数名 ) 12.常见 printf格式 %c(输出一个字符) %f(输出浮点数)%d(有 符号整型)%e(小写浮点数) 13.Do….while(不管条件成不成立都会执行一次) 14.三目运算符?:(表达式1;表达式2;表达式)举例:int a=3,b=4,c=5;则c>b?c>b?:a+2 例子中表达式1 c>b?成立则执行表达式2(c>b)反之则执行表达式三 15.自增运算符举例i=++i(则先进行运算再赋值)i=i++(则先赋 值再运算你也可看做i=i++先临所以先进行赋值后运算) 16.取余数运算符% 举例5%3则为2 17.以#开头的都是预处理命令函数是c语言的基本组成单位 18.数组是一组具有相同数据类型的变量集合数组名代表数组 的首地址数组有一维数组二维数组和多维数组访问数组的元素可以通过数组名和下标来实现二维数组【是行标表达式】【列标表达式】 19.指针是一个地址你也可以理解为快捷方式指针变量是专门

c语言基础知识总结

C语言最重要的知识点复习资料 总体上必须清楚的: 1)程序结构就是三种: 顺序结构、选择结构(分支结构)、循环结构。 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。 3)计算机的数据在电脑中保存就是以二进制的形式、数据存放的位置就就是她的地址、 4)bit就是位就是指为0 或者1。byte 就是指字节, 一个字节= 八个位、 概念常考到的: 1、编译预处理不就是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。 2、define PI 3、1415926; 这个写法就是错误的,一定不能出现分号。 3、每个C语言程序中main函数就是有且只有一个。 4、在函数中不可以再定义函数。 5、算法:可以没有输入,但就是一定要有输出。 6、break可用于循环结构与switch语句。 7、逗号运算符的级别最低,赋值的级别倒数第二。 第一章C语言的基础知识 第一节、对C语言的基础认识 1、C语言编写的程序称为源程序,又称为编译单位。 2、C语言书写格式就是自由的,每行可以写多个语句,可以写多行。 3、一个C语言程序有且只有一个main函数,就是程序运行的起点。 第二节、熟悉vc++ 1、VC就是软件,用来运行写的C语言程序。 2、每个C语言程序写完后,都就是先编译,后链接,最后运行。(、c---→、obj---→、exe)这个过程中注意、c与、obj文件时无法运行的,只有、exe文件才可以运行。(常考!) 第三节、标识符 1、标识符(必考内容): 合法的要求就是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则就是下划线。第一个为数字就错了 2、标识符分为关键字、预定义标识符、用户标识符。 关键字:不可以作为用户标识符号。main define scanf printf 都不就是关键字。迷惑您的地方If就是可以做为用户标识符。因为If中的第一个字母大写了,所以不就是关键字。 预定义标识符:背诵define scanf printf include。记住预定义标识符可以做为用户标识符。 用户标识符:基本上每年都考,详细请见书上习题。 第四节:进制的转换 十进制转换成二进制、八进制、十六进制。 二进制、八进制、十六进制转换成十进制。 第五节:整数与实数 1)C语言只有八、十、十六进制,没有二进制。但就是运行时候,所有的进制都要转换成二进制来进行处理。(考过两次)

C语言基础知识整理资料

C语言基础知识 1. 每个C程序有且只有一个主函数main(),且程序必须从main()函数开始执行,并在main()函数中结束。 2. 在C语言中,用e来表示科学计数法时,规定在e的前面必须有数字,后面必须为整数。 3. 用单引号括起来的一个字符常量只能存放一个字符;C语言中没有字符串变量,只能用字符数组来存储字符串。 4. 外部变量在编译时由系统分配永久的内存空间,所以外部变量的类型不是自动存储类别。 5. 在一个函数内的复合语句中定义的变量,只能在这个复合语句范围内有效。 6. 用sizeof(int)计算int类型数据的字节数。 7. C语言运行时,首先系统检查语法的正误,再运行程序的语法;C语言中,可以在一个函数中嵌套一个函数,但是不能在一个函数中定义一个函数;只有在函数外部定义的函数才是外部函数;C语言的子程序有过程和函数两种。 8. 预处理命令行的位置没有规定,只是习惯放在前面;在源文件中的可以有多条预处理命令,但一行只能写一条;宏名的大写只是习惯性的表示;宏替换不仅不占用运行时间还不分配内存空间。 9. feof函数的作用是检查文件是否结束,当结束时返回的值为非零,否则为零。 10. 当定义了数组后,在给其赋值时,不能直接把字符串赋给数组名。 11. 在赋值表达式中,赋值运算符“=”右侧不能为表达式;在求余运算符中的两侧都必须为整型;在强制类型转换时,类型名应用括号括起来。 12. 静态局部变量,只有当程序结束后,其值才释放。 13. 当调用函数时,实参是一个数组名,则向函数传送的是数组每一个元素的地址。 14. 算法的特点为有零个或多个输入,有一个或多个输出,当相同的输入时,其结果相同;算法正确的程序最终一定会结束。 15. 在C语言中,预处理命令行都以“#”开头;当需要时才用#include;预处理的作用就是实现宏定义和条件编译。 16. 当数组元素的下标超出了定义的下标范围时,系统不给出“下标越界”的字样,而是得出错误的答案,因此在编程时务必检查下标是否越界。 17. 共用体变量不能作为函数的参数,也不能使函数带回共用体变量。 18. 指向函数的指针变量的定义形式为:数据类型(*指针变量)();,因此其为指向函数的指针变量。 19. 用C语言编写的代码程序是源程序,只有通过编译、连接才能进行。 20. 在说明为static时,其生存期得到延长,而其作用域并没有改变,在定义后系统会自动帮它赋值为0,static为关键字不能被用作它用。 21. 频繁地使用空语句会降低程序的可读性和运算速度。 22. 运算符%两边都应是整数,赋值语句左边应该是变量,而非表达式,强制转换语句强制类型应加括号。 23. 在逻辑运算符中,其两侧的运算符对象为任意合法的表达式即可。 24. 函数fread(&Iarray,2,16,fp)的功能是,从fp所指的数据文件中读取16次2字节的数据存储到数组Iarray中。 25. 整个流式文件也可以随机存取数据,C语言文件中有好多函数可以达到写入数据时,未经输入数据,达到不覆盖的目的,在进行写操作时,系统会自动关闭文件。 26. 使用putchar、getchat、puts、gets、printf、scanf函数时,必须在程序的开头出现包含头文件#include”stdio.h”的命令行,而使用字符串处理函数时,必须在程序的开头出现包含头文件#include”string.h”命令行,而使用数学函数时,必须在程序的开头出现包含头文件#include”math.h”的命令行。 27. 一个斜杠与小于等于127任意数字按一个字符计算,一个斜杠与任意一个字符按一个字

计算机C语言基础知识总结

C语言知识要点复习资料 总体上必须清楚的: 1)程序结构是三种: 顺序结构、选择结构(分支结构)、循环结构。 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。 3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址. 4)bit是位是指为0 或者1。byte 是指字节, 一个字节= 八个位. 概念常考到的: 1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。 2、define PI 3.1415926; 这个写法是错误的,一定不能出现分号。 3、每个C语言程序中main函数是有且只有一个。 4、在函数中不可以再定义函数。 5、算法:可以没有输入,但是一定要有输出。 6、break可用于循环结构和switch语句。 7、逗号运算符的级别最低,赋值的级别倒数第二。 第一章C语言的基础知识 第一节、对C语言的基础认识 1、C语言编写的程序称为源程序,又称为编译单位。 2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。 3、一个C语言程序有且只有一个main函数,是程序运行的起点。 第二节、熟悉vc++ 1、VC是软件,用来运行写的C语言程序。 2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c---→.obj---→.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。(常考!)第三节、标识符 1、标识符(必考内容): 合法的要求是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则是下划线。第一个为数字就错了 2、标识符分为关键字、预定义标识符、用户标识符。 关键字:不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。 预定义标识符:背诵define scanf printf include。记住预定义标识符可以做为用户标识符。 用户标识符:基本上每年都考,详细请见书上习题。 第四节:进制的转换

C语言基础知识整理

C语言基础知识 1、每个C程序有且只有一个主函数main(),且程序必须从main()函数开始执行,并在main()函数中结束。 2、在C语言中,用e来表示科学计数法时,规定在e的前面必须有数字,后面必须为整数。 3、用单引号括起来的一个字符常量只能存放一个字符;C语言中没有字符串变量,只能用字符数组来存储字符串。 4、外部变量在编译时由系统分配永久的内存空间,所以外部变量的类型不就是自动存储类别。 5、在一个函数内的复合语句中定义的变量,只能在这个复合语句范围内有效。 6、用sizeof(int)计算int类型数据的字节数。 7、 C语言运行时,首先系统检查语法的正误,再运行程序的语法;C语言中,可以在一个函数中嵌套一个函数,但就是不能在一个函数中定义一个函数;只有在函数外部定义的函数才就是外部函数;C语言的子程序有过程与函数两种。 8、预处理命令行的位置没有规定,只就是习惯放在前面;在源文件中的可以有多条预处理命令,但一行只能写一条;宏名的大写只就是习惯性的表示;宏替换不仅不占用运行时间还不分配内存空间。 9、feof函数的作用就是检查文件就是否结束,当结束时返回的值为非零,否则为零。 10、当定义了数组后,在给其赋值时,不能直接把字符串赋给数组名。 11、在赋值表达式中,赋值运算符“=”右侧不能为表达式;在求余运算符中的两侧都必须为整型;在强制类型转换时,类型名应用括号括起来。 12、静态局部变量,只有当程序结束后,其值才释放。 13、当调用函数时,实参就是一个数组名,则向函数传送的就是数组每一个元素的地址。 14、算法的特点为有零个或多个输入,有一个或多个输出,当相同的输入时,其结果相同;算法正确的程序最终一定会结束。 15、在C语言中,预处理命令行都以“#”开头;当需要时才用#include;预处理的作用就就是实现宏定义与条件编译。 16、当数组元素的下标超出了定义的下标范围时,系统不给出“下标越界”的字样,而就是得出错误的答案,因此在编程时务必检查下标就是否越界。 17、共用体变量不能作为函数的参数,也不能使函数带回共用体变量。 18、指向函数的指针变量的定义形式为:数据类型 (*指针变量)(); ,因此其为指向函数的指针变量。 19、用C语言编写的代码程序就是源程序,只有通过编译、连接才能进行。 20、在说明为static时,其生存期得到延长,而其作用域并没有改变,在定义后系统会自动帮它赋值为0,static为关键字不能被用作它用。 21、频繁地使用空语句会降低程序的可读性与运算速度。 22、运算符%两边都应就是整数,赋值语句左边应该就是变量,而非表达式,强制转换语句强制类型应加括号。 23、在逻辑运算符中,其两侧的运算符对象为任意合法的表达式即可。 24、函数fread(&Iarray,2,16,fp)的功能就是,从fp所指的数据文件中读取16次2字节的数据存储到数组Iarray中。 25、整个流式文件也可以随机存取数据,C语言文件中有好多函数可以达到写入数据时,未经输入数据,达到不覆盖的目的,在进行写操作时,系统会自动关闭文件。 26、使用putchar、getchat、puts、gets、printf、scanf函数时,必须在程序的开头出现包含头文件#include”stdio、h”的命令行,而使用字符串处理函数时,必须在程序的开头出现包含头文件#include”string、h”命令行,而使用数学函数时,必须在程序的开头出现包含头文件#include”math、h”的命令行。

C语言基础知识总结

1.++和-- 自增运算符和自减运算符:前缀和后缀两种情况 1)表达式++n先将n的值递增1,然后再使用变量n的值:如果n的值为5,x = n++; 执行后的结果,x的值置为5, n=6 2)表达式n++先使用变量n的值,然后再将n的值递增1:如果n的值为5,x = ++n; 执行后的结果,x的值置为6, n=6 在不需要使用任何具体值且仅需要递增变量的情况下,前缀方式和后缀方式效果相同。 2.return、exit区别 调用一个函数,此函数的入口地址会被保存起来,放在某个确定的寄存器中,函数结束前的return语句会找到函数地址, 然后在被调用函数结束后,执行其下一条语句。 exit使进程直接终止 3.结构体相关知识点(重点) 1)聚合数据类型:能够同时存储超过一个的单独数据。C语言提供两种类型的聚合数据类型,数组和结构体。 结构体也是一些值的集合,这些值称为它的成员,一个结构体的各个成员可以有不同的类型。每个结构体有 自己的名字,它们通过名字访问结构体成员。 2)结构体声明与定义: 声明的一般形式: a.struct student{int num;char sex[5];char addr[10];}; struct student s1,s2; b.在声明类型的同时定义变量struct 结构体名{ 成员列表}变量名表列; c.直接定义结构体类型变量:struct {成员表列}变量名表列;(即不出现结构体名) 注意:声明结构时,可以使用另一种良好的技巧,即用typedef 创建一种新的数据类型,如: typedef struct{int num;char name[10];char sex;}Person; 此时Person是个类型名而不是一个结构标签,所以后续的声明可以是:Person x; Person y[20],*z; 3)结构体成员的访问 struct COMPLEX{ float f;int a[20];long *lp;struct SIMPLE s; struct SIMPLE sa[10];struct SIMPLE *sp; }; a)结构成员的直接访问:通过点操作符(.),例如:struct COMPLEX comp;我们要访问comp这个结构体变量 中int a[20]这个成员,可以用:comp.a; 点操作符的结合性是自左向右,如((comp.sa)[4]).f,可以直接comp.sa[4].f; b)结构体成员的间接访问:如果我们拥有一个指向结构体的指针,如void func(struct COMPLEX *cp); 我们要访问这个 结构体的成员f,那么(*cp).f;=====>>.操作符的优先级高于*,所以我们必须要加(),这个

相关文档
最新文档