C语言基础语法

本文介绍了C语言的基础语法,包括输入输出操作,数组的初始化、排序,字符数组和字符串的处理,以及C++中vector和map的使用。讨论了cin/cout、qsort函数、动态分配内存以及字符串转换等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入输出

输入
重定向
freopen("input.txt", "r", stdin);
整行输入
  • c++
string a;
#include<iostream>
getline(cin, a);  
  • C语言
char a[100];
#include<stdin.h> 感觉2015就不支持这个了。
gets(a);
char a[1001];
scanf("%s",a);

cin输入字母和数字

int a[3],b[3];  
char c;  
cin>>a[0]>>c>>a[1]>>c>>a[2];  
cin>>b[0]>>c>>b[1]>>c>>b[2];  
//当时输入格式 3.2.1
输出

cout的输出格式

#include<iomanip>
cout<setfill('0')<<setw(4)<<flag2;//保持四位证书且填充为0默认填充空格        
cout保持小数点后几位
cout<<fixed<<setprecision(2)<<cost;//<iomanip>

数据结构

数组
初始化

指代,const char* 指的的是”hello”这样的字符串,或者是char数组的指针。

动态分配

int *numList = (int *) malloc (n * sizeof(int)); 
scanf("%d", &numList[i]); 
int *nums = new int[n];

数组的固定分配初始值分配

int array [100]={0}

如果是 new的话,
string *strs = new string[n];
int *cc = new int[n];

数组排序
c语言里面的 qsort
#include <stdlib.h>
int num[100];

//Sample:
int cmp ( const void *a , const void *b )

{ return *(int *)a - *(int *)b; }

qsort(num,100,sizeof(num[0]),cmp);

第一个参数是数组的指针,第二个参数是要排序的数据量,第三个参数是一个数的大小,第四个是比较的函数。

http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html

字符数组

初始化

char largnum[] = {'J','Q','K'};

char 数组大小

#include<string.h>
strlen(a);

判断大小写

#include <ctype.h> 
char c='c'
if(islower(c)){
 c=toupper(c);
}

拷贝

strcat(C, B); //把B连接在C的末尾
strcpy(B, C); //把C拷贝给B
字符串

字符串的大小

 str.size();

字符串一些函数(最后有详细解释)
http://blog.youkuaiyun.com/yzl_rex/article/details/7839379

string &append(int n,char c);        //在当前字符串结尾添加n个字符c
插入字符串
void insert(iterator it, int n, char c);//在it处插入n个字符c

C语言的字符串 需要限定大小,大小是比那个啥多一位,因为有终止符。
char 字符的一些函数

string 能够直接s.find(c) s是string格式,c是char格式
s.append(1,c);如果要加长string的话,要写明添加几个char
动态生成数组

cin>>n;                   
i=n-1;
string *s=new string[n];

字符串 find_first_not_of
http://baike.baidu.com/link?url=eikMzuoUH9_OOD_Z4ov-JdcAdv2bMse_eWBLjRuL5IH9ggR-AgMng2SI7GiLHQuzQWiRmetaKECksoq-TLoX8a

string 和char数组的转换

http://www.2cto.com/kf/201110/109447.html

http://blog.youkuaiyun.com/xinwang24/article/details/6612686

字符串数组转字符串


#include <iostream>
#include <string>
using namespace std;

int main(){
    char a[10]="aaaabbbba";
    string s(&a[0],&a[strlen(a)]);
    cout<<s<<endl;
    system("pause");
}

字符串转字符数组

#include <iostream>
#include <string>
using namespace std;

int main(){
    string s="aaaavvva";
    char a[10];
    strncpy(a,s.c_str(),s.length());

    for(int i=0;i<10;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    system("pause");
}

字符串转数字

#include<iostream>
using namespace std;

int main()
{
 char a='1';
 int x;
 x=atoi(a);  

 cout<<x<<endl;
 getchar();
 return 0;
}

字符的性质判定

#include<ctype.h>
islower(ch);
isupper(ch);
isalpha(ch);
vector的用法

vector 插入

vector 的定义

vector 的初始化 http://blog.youkuaiyun.com/fulva/article/details/7550782

 vector<bool> existed(MAX, false);  

c.push_back(elem) //在尾部加入一个数据。
vector的遍历

http://blog.youkuaiyun.com/liunian17/article/details/7435781
vector遍历输出

void print(int n){
    cout<<" "<<n;
}

//下面为主函数里面
#include <algorithm>
vector<int> vec; 
for_each(vec.begin(),vec.end(),print);</algorithm>

错误原因
(1)error C2679: 二进制“>>”: 没有找到接受“std::string”类型的右操作数的运算符(或没有可接受的转换) 未定义string

#include "stdafx.h"
#include <vector>
#include <iostream.h>
using namespace std;

int main(int argc, char* argv[])
{
    int a[7]={1,2,3,4,5,6,7};
    vector<int> ivector(a,a+7);//vector的赋值并不可以像数组一样方便的用花括号方便的完成赋值,这里借用了数组来初始化这个vector,初始化方
    //式vector<elementType> intvec(begin,end);这样可以用起来看上去还是比较习惯的。
    vector<int>::iterator iter;
    for (iter=ivector.begin();iter!=ivector.end();iter++)
    {
        cout<<*iter<<'\0';
    }
    cout<<endl;
    ivector[5]=1;//单个vector的赋值,这个方式看上去还是和数组一样的,不过你也可以这么写ivector.at(5)=1;但是就是不习惯
    cout<<ivector[5]<<endl<<ivector.size()<<endl;
    for (iter=ivector.begin();iter!=ivector.end();iter++)
    {
        cout<<*iter<<'\0';
    }
    return 0;
}

vector 逆序输出

c.insert(vector.begin(),elem)
还有一种 ,rbegin,rend

map的用法

map真的是好东西
http://blog.youkuaiyun.com/artemisrj/article/details/20373281
map好像插入的时候会自动排序。。。
map查找
if(map.find(a)!=map.end()){
;
}

C++ 数据取值范围

char -128 ~ +127 (1 Byte)
short -32767 ~ + 32768 (2 Bytes)
unsigned short 0 ~ 65536 (2 Bytes)
int -2147483648 ~ +2147483647 (4 Bytes)
unsigned int 0 ~ 4294967295 (4 Bytes)
long == int
long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)
double 1.7 * 10^308 (8 Bytes)
climits头文件的用法
CHAR_MIN       char的最小值
SCHAR_MAX      signed char 最大值
SCHAR_MIN       signed char 最小值
UCHAR_MAX      unsigned char 最大值
SHRT_MAX       short 最大值
SHRT_MIN       short 最小值
USHRT_MAX      unsigned short 最大值
INT_MAX       int 最大值
INT_MIN        int 最小值
UINT_MAX       unsigned int 最大值
UINT_MIN       unsigned int 最小值
LONG_MAX      long最大值
LONG_MIN       long最小值
ULONG_MAX      unsigned long 最大值
FLT_MANT_DIG    float 类型的尾数
FLT_DIG        float 类型的最少有效数字位数
FLT_MIN_10_EXP   带有全部有效数的float类型的负指数的最小值(以10为底)
FLT_MAX_10_EXP    float类型的正指数的最大值(以10为底)
FLT_MIN        保留全部精度的float类型正数最小值
FLT_MAX        float类型正数最大值
LLONG_MAX 指的是long long 的最大值
溢出的判断条件
1065. A+B and C (64bit) (20)
素数(prime)的求法

bool issushu(int m){ //判断是否是素数  
    int j;  
    bool flag=true;  
    for(j=2;j*j<=m;j++){  
        if(j==2)  
            ;  
        else if(m%j==0){  
            flag=false;  
        }  

    }  
    return flag;  
}  

文件输入输出


freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
// freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中
fclose(stdin);//关闭文件
fclose(stdout);//关闭文件

有时候分明包含头文件了却说不存在,那么原因就是没有用空间的关系,加上 std::
为了方便用fstream 写的函数


string  read(ifstream &T) //pass the file stream to the function
{  
    //the method to read a file, that I showed you before
    string a;
    char ch;
    //  a.append(" ");
    while(!T.eof())
    {
        T.get(ch);
        //cout<<ch;
        if(ch=='\n'){
            break;
        }
        string tt="a";
        tt[0]=ch;
        a.append(tt);
    }
    return a;
}

C++文件的输入输出

http://blog.youkuaiyun.com/btooth/article/details/995097

#include <fstream>
using namespace std;

void main() //程序从这里开始运行
{
    ofstream SaveFile("cpp-home.txt");
    SaveFile << "Hello World, from www.cpp-home.com and Loobian!";
    SaveFile.close();
}
//#include<fstream>
string fname="location.txt";

    ifstream f(fname.c_str());
    if(!f){
        cout<<"can't open the file "<<fname;
    }else{
        cout<<"open the file "<<fname;
    }
    double d;
    while(!f.eof()){
        f>>d;
        cout<<d<<endl;
    }
       // char str[100];
    //f.getline(str,100);   //getline 可以读取一行
    f.close();

如果输入的数字以逗号隔开,那么可以用一个字符代替输入

    ifstream f(fname.c_str());
    while(!f.eof()){
        char aa;
        f>>xValues[i];
        f>>aa;
        f>>yValues[i];
        i++;
    }
    f.close();

也就是说fstream的输入输出都是可以按照普通的输入输出的规则进行的。
要想换一个文件输入输出,那么就先关闭文件,再打开文件。
p1.close();
p1.open(“C:\outPoints.csv”);
排序 sort

经典例子,用vector
http://blog.youkuaiyun.com/artemisrj/article/details/18195499

http://hi.baidu.com/posinfo/item/dc3e73584c535cc9d2e10c27
《Effective STL》里这些话可能对你也有用处:item 31      “我们总结一下你的排序选择:    ● 如果你需要在vector、string、deque或数组上进行完全排序,你可以使用sort或stable_sort。    ● 如果你有一个vector、string、deque或数组,你只需要排序前n个元素,应该用partial_sort。    ● 如果你有一个vector、string、deque或数组,你需要鉴别出第n个元素或你需要鉴别出最前的n个元素,而不用知道它们的顺序,nth_element是你应该注意和调用的。    ● 如果你需要把标准序列容器的元素或数组分隔为满足和不满足某个标准,你大概就要找partition或stable_partition。    ● 如果你的数据是在list中,你可以直接使用partition和stable_partition,你可以使用list的sort来代替sort和stable_sort。如果你需要partial_sort或nth_element提供的效果,你就必须间接完成这个任务,但正如我在上面勾画的,会有很多选择。      另外,你可以通过把数据放在标准关联容器中的方法以保持在任何时候东西都有序。你也可能会考虑标准非STL容器priority_queue,它也可以总是保持它的元素有序。”
要使用此函数只需用#include sort即可使用,语法描述为:
sort(begin,end),表示一个范围,例如:

int _tmain(int argc, _TCHAR* argv[])
{
 int a[20]={2,4,1,23,5,76,0,43,24,65},i;
 for(i=0;i<20;i++)
  cout<<a[i]<<endl;
 sort(a,a+20);
 for(i=0;i<20;i++)
 cout<<a[i]<<endl;
 return 0;
}

要注意,如果是20个元素的话,是从开头到+20,
sort针对字符串 ,和vector一样的用法
string ss;
sort(ss.begin(),ss.end());

面向对象

其实没有好好学过C++,怎么说呢,语法什么的忘记特别快,还是给自己留一块地,放自己的想法吧。实验室没有面向对象的书看,这次趁着要改写voronoi类的机会温习一下C++面向对象、
一般C++面向对象的类有两个文件,一个文件主声明,一个文件主实现。有时候函数特别短的也可以放进头文件直接实现。

函数的形参,形参是函数声明的那个参数,实参是实际上的那个参数,也就是函数实际调用放进去的参数,数组的形参实参什么的调用有点凌乱,记一种就好了。
在头文件 ,h的类之中,公共类的声明如下。

bool generateVoronoi(float *xValues, float *yValues, int numPoints, float minX, float maxX, float minY, float maxY, float minDist=0,int centerPoints=-1);

VoronoiDiagramGenerator();//类的初始化
    ~VoronoiDiagramGenerator();//类的析构

在.cpp 文件中,函数的实现是要加上类的名字,比如这个类的名字为VoronoiDiagramGenerator
bool VoronoiDiagramGenerator::generateVoronoi(float *xValues, float *yValues, int numPoints, float minX, float maxX, float minY, float maxY, float minDist,int centerPoints)
{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值